oracle動態SQL繫結集合變數

2021-09-01 18:12:10 字數 2138 閱讀 2082

有如下需求,在儲存過程中,傳遞的引數是字串,字串格式是『1,2,3 』, 由數字組成,中間用','號分割;然後在sql語句如下使用:

create or replace procedure movetoright  (v_ids varchar2, v_workid int )

asi_sql varchar2(1000);

begin

/*-- v_ids 的格式 '1,2,3'轉換成1,2,3的集合

*/ -- oracle 動態sql列名不能使用替代形式,只能拼湊

i_sql:=' insert into profworktype (workid,worktypeid) select '|| v_workid ||' ,id from worktype where id in (:1) and id not in ( select worktypeid from profworktype where workid = :2 ) ';

execute immediate i_sql using v_ids, v_workid;

end;

注意上面紅色標記的引數傳遞,是顯然不對的,因為使用in後面必須是集合,集合要麼來自於select語句,要麼自己封裝,具體參考: ;做法主要是將字串轉換成數字集合,然後通過select語句即可;**如下:

1、首先建立乙個型別,用於儲存資料

create or replace type numtabletype as table of number ;
2、建立乙個函式負責完成字串到集合的轉換

-- ****於 

create or replace function str2numlist (v_ids varchar2)

return numtabletype

as v_str long default v_ids || ',';

v_n number;

v_data numtabletype := numtabletype ();

begin

loop

v_n := to_number(instr( v_str, ',' ));

exit when (nvl(v_n,0) = 0);

v_data.extend;

v_data( v_data.count ) := ltrim(rtrim(substr(v_str,1,v_n-1)));

v_str := substr( v_str, v_n+1 );

end loop;

return v_data;

end;

3、在儲存過程中呼叫該函式即可;

create or replace procedure movetoright  (v_ids varchar2, v_workid int )

asi_sql varchar2(1000);

begin

/*-- v_ids 的格式 '1,2,3'轉換成1,2,3的集合

*/ -- oracle 動態sql列名不能使用替代形式,只能拼湊

i_sql:=' insert into profworktype (workid,worktypeid) select '|| v_workid ||' ,id from worktype where id in (select * from the(select cast (str2numlist( :1) as numtabletype ) from dual) ) and id not in ( select worktypeid from profworktype where workid = :2 ) ';

execute immediate i_sql using v_ids, v_workid;

end;

select * from the(select cast (str2numlist( :1) as numtabletype ) from dual) 

-- 等價於

select * from table ( cast (str2numlist( '1,2') as numtabletype ) )

oracle 動態sql 繫結變數

無繫結變數的非sql查詢 declare v sql varchar2 4000 begin 使用execute immediate執行動態sql,最後提交事物 v sql create table account id number 3 not null,name varchar2 50 not ...

oracle動態sql以及繫結變數

實現動態sql有兩種方式 dbms sql和本地動態sql execute immeidate oracle從8代開始就提供了新的執行動態sql的功能 execute immeidate v sql using into 本地動態sql execute immediate 語句 into using...

SQL Server動態SQL與變數繫結

有時候動態sql需要進行變數的賦值,這個時候就需要呼叫系統的儲存過程sp executesql了。使用中還是有些注意事項,如下 字元型字段需宣告為nvarchar型別 declare strsql nvarchar 1000 value str nvarchar 254 動態sql拼接 set st...