Tenho uma tabela que consiste em um bloco anônimo na coluna rule
, que precisa ser executado a partir do procedimento.
Aqui estão os dados de exemplo que se parecem com o cenário real.
Mesa emp
:
create table emp (id int,name varchar2(20));
Dados:
insert into emp values(1,'Jack');
insert into emp values(2,'John');
insert into emp values(3,'Jams');
Mesa ano
:
create table ano(id int,rule varchar2(4000));
Dados:
insert into ano values(1,'declare v_cnt number;
begin
select count(1) into v_cnt from emp where id = :1;
if(v_cnt>1) then :2 := ''true'';
else :2 := ''false'';
end if;
end;');
Procedimento:
create procedure pr_ano(p_emp emp)
IS
DECLARE v_out boolean;
BEGIN
execute immediate p_emp.rule using 1,v_out;
dbms_output.put_line(v_out);
END;
Chamada de procedimento:
pr_ano(emp);
Recebendo um erro Unkown Command
;
Essa é uma má ideia, pois você expõe seu banco de dados a ataques de injeção de SQL.
Se você for usar isso (não use), não deixe que os usuários forneçam as regras na
ano
tabela e garanta que todas as regras sejam cuidadosamente higienizadas para que não sejam maliciosas.Você quer algo como:
Então o procedimento:
Então você pode chamá-lo usando:
Quais saídas:
violino