PLSQL动态SQL按名称绑定变量

时间:2016-10-15 16:17:44

标签: oracle plsql

我想在我的程序中动态执行sql语句。据我所见,绑定是根据使用顺序完成的。

有没有办法可以说出类似

的内容
:a --> par_a_

2 个答案:

答案 0 :(得分:6)

execute immediate 'plsql code'之间存在差异,在动态pl / sql中,oracle将使用真正的bindes,您可以按正确的顺序指定它一次,如果重复,它将替换所有绑定。使用sql你应该加强所有绑定而不是重复它。

execute immediate 'sql'

你可以使用dbms_sql,它的功能是bind

 declare 
  l_sql varchar2(4000) := 'select :a from dual union all select :a from dual'; 
  l_pl_sql varchar2(4000) := 'begin dbms_output.put_line(:a); dbms_output.put_line(:a); end;'; 
  type t_tab_str is table of varchar2(4000); 
  l_res t_tab_str ; 
 begin 
   execute immediate l_sql bulk collect into l_res using '1','2'; 
   for i in 1.. l_res.last loop 
    dbms_output.put_line(l_res(i)); 
   end loop; 
   execute immediate l_pl_sql using '1'; 
 end; 

答案 1 :(得分:1)

我认为你所追求的是USING关键字。

以下是oracle文档的示例。

DECLARE
  plsql_block VARCHAR2(500);
  new_deptid  NUMBER(4);
  new_dname   VARCHAR2(30) := 'Advertising';
  new_mgrid   NUMBER(6)    := 200;
  new_locid   NUMBER(4)    := 1700;
BEGIN
 -- Dynamic PL/SQL block invokes subprogram:
  plsql_block := 'BEGIN create_dept(:a, :b, :c, :d); END;';

 /* Specify bind arguments in USING clause.
    Specify mode for first parameter.
    Modes of other parameters are correct by default. */
  EXECUTE IMMEDIATE plsql_block
    USING IN OUT new_deptid, new_dname, new_mgrid, new_locid;
END;
/

https://docs.oracle.com/cd/B28359_01/appdev.111/b28370/dynamic.htm