2016-10-15 26 views
0

プロシージャ内でSQL文を動的に実行したい。私が見る限りでは、バインディングは使用順に従って行われます。PLSQL動的SQLバインド変数(名前で)

私は

:a --> par_a_ 
+0

'私は、SQL文のどのようなdynamically' SQL文を実行したいですか? –

答えて

2

execute immediate 'plsql code'execute immediate 'sql'間のdiffernceは、SQL、Oracleは、実際のbindesを使用すると、あなたが正しい順序で一度にそれを指定することができ、そこがrepetedされている場合、それはすべてのバインドを置き換えます/ダイナミックPLでは、あります。 sqlを使用すると、すべてのバインドをrepesする代わりにspesifyする必要があります。

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; 

あなたは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; 
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