PLSQL动态SQL按名称绑定变量

Cal*_*pso 1 oracle plsql

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

有没有办法可以说出类似的话

:a --> par_a_
Run Code Online (Sandbox Code Playgroud)

小智 6

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

 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; 
Run Code Online (Sandbox Code Playgroud)

你可以使用dbms_sql,它的功能绑定

 declare 
  l_sql varchar2(4000) := 'select :a from dual union all select :a from dual'; 
  type t_tab_str is table of varchar2(4000); 
  l_res t_tab_str ; 
  l_sql_id number; 
  l_ret number; 
  type curtype is ref cursor; 
  l_cursor curtype ; 
 begin 
   dbms_sql.parse(l_sql_id ,l_sql,dbms_sql.native); 
   dbms_sql.bind_variable(l_sql_id,'a','1'); 
   l_ret := dbms_sql.execute(l_sql_id); 
   l_cursor := dbms_sql.to_refcursor(l_sql_id); 
   fetch l_cursor bulk collect into l_res; 
   for i in 1.. l_res.last loop 
    dbms_output.put_line(l_res(i)); 
   end loop; 
 end;
Run Code Online (Sandbox Code Playgroud)