oracle 儲存過程 呼叫動態sql

2022-01-31 04:47:53 字數 1736 閱讀 5981

--開始時間拼接' 00:00:00'

v_sql := 'select decode(length(' || v_end || '),10,' || 'concat(' || v_end || ', 00:00:00),' || v_end || ') from dual';

execute immediate v_sql;

編譯成功,但是儲存過程呼叫失敗。

在oracl資料庫中,ddl表示資料庫定義語言,即我們平常使用的sql語句,宣告的sql語句可以直接使用拼接字串進行拼接;

dml表示資料操縱語言,宣告的sql語句不能再用管道符||來動態拼接變數。 

execute immediate屬於dml,dml使用sql的規則如下:

宣告sql語句

字串拼接變數時,變數要使用佔位符來代替,格式為 ":" + "名字",名字隨意

呼叫sql語句

使用"using"來傳遞變數,代替佔位符,格式為 "using var1,var2,..."

v_sql := 'select decode(length(:v1),10,:v2,:v3) from dual';

execute immediate v_sql into v_start using v_start,v_start || ' 00:00:00',v_start;

結果展示:

入參

出參

--結束時間拼接' 00:00:00'

select decode(length(v_end), 10, v_end || ' 00:00:00', v_end) into v_end from dual;

第一種字串拼接的方式其實也是可以執行的,只不過需要借助游標來實現,這裡張貼部分**

--業務執行

open out_cursor for 'select to_char(to_date(' || starttime || ', ''yyyy-mm-dd'') + rownum - 1,

''yyyy-mm-dd'') as regdate

from dual

connect by rownum <=

trunc(to_date(' || endtime || ', ''yyyy-mm-dd'') -

to_date(' || starttime || ', ''yyyy-mm-dd'')) + 1';

游標後面可以直接拼接sql字串,並將其當做sql來執行(這是在儲存過程呼叫的)

結果如下

另外對於單引號的轉義,兩個緊挨的單引號'',就表示乙個轉義過的單引號' 

oracle動態呼叫 動態呼叫儲存過程

關鍵字 execute immediate sqlname using in 1 in 2 out c sql create or replace procedure p test a in varchar2,b in varchar2,c out varchar2 2 is 3 begin 4 c...

delphi動態呼叫oracle儲存過程

function fun logincheck var puserinfo tremployee var errormessage string flag string integer varadostoredproctemp tadostoredproc begin adostoredprocte...

oracle 儲存過程 呼叫動態sql

開始時間拼接 00 00 00 v sql select decode length v end 10,concat v end 00 00 00 v end from dual execute immediate v sql 編譯成功,但是儲存過程呼叫失敗。在oracl資料庫中,ddl表示資料庫定...