是否可以像这样立即执行

时间:2014-11-07 17:31:21

标签: plsql plsqldeveloper

此代码有效:

uno:=1;
dos :='insert into TRABAJADOR('||inValuesToInsert||') values('||inValuestoPas||')';
execute IMMEDIATE dos using uno,addColN, addColS(8),addColD,addColS(100),
addColS(60),addFKColN('DEPT'),addFKColS('PAIS'),addFKColS('CATEGORIA')  ; 

但我需要像这样执行立即执行语句(变量tres包含下面的数据,对不起语法,我知道它做得不好):

tres:= 'dos using uno,addColN, addColS(8),addColD,addColS(100),
addColS(60),addFKColN('DEPT'),addFKColS('PAIS'),addFKColS('CATEGORIA')'
uno:=1;
dos :='insert into TRABAJADOR('||inValuesToInsert||') values('||inValuestoPas||')';
execute IMMEDIATE dos using tres;

这可能吗?如果不可能,请给我另一个建议。感谢

1 个答案:

答案 0 :(得分:0)

首先,您需要了解SQL查询字符串的随机部分(例如,' from table1 t1 join table2 t2 ')和参数之间的区别。参数是一个特定的占位符,它总是表示稍后将在运行时提供的某些内容(字段,变量等)的值。在USING语句的EXECUTE IMMEDIATE子句中,您只能使用参数。如果要在运行时从部件构造查询,可以执行此操作,但必须通过不同的方法处理字段和参数的名称。例如:

declare
  field_list varchar2(100) := 'my_field1, my_field2, my_field3';
  table_name varchar2(30) := 'my_table';
  v1 number := 1;
  v2 number := 2;
  v3 number := 3;
begin
  execute immediate 'insert into ' || table_name || '(' || field_list || 
     ') values (:p1, :p2, :p3)' using v1, v2, v3;
end;
/

此处:P1:P2:P3是参数,将由变量v1v2v3中的值替换。从服务器的角度来看,table_namefield_list不是参数,而是数据库对象的静态名称。