有如下需求,在儲存過程中,傳遞的引數是字串,字串格式是『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...