oracle 存儲過程 調用動態sql

oracle 存儲過程 調用動態sql

CreationTime--2018年8月16日11點25分

Author:Marydon

1.錯誤實現方式

--開始時間拼接' 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;

  編譯成功,可是存儲過程調用失敗。html

2.緣由分析

  在oracl數據庫中,ddl表示數據庫定義語言,即咱們日常使用的sql語句,聲明的sql語句能夠直接使用拼接字符串進行拼接;sql

  dml表示數據操縱語言,聲明的sql語句不能再用管道符||來動態拼接變量。 數據庫

3.正確實現方式

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

  聲明sql語句oracle

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

  調用sql語句3d

  使用"using"來傳遞變量,代替佔位符,格式爲 "using var1,var2,..."code

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;  

  結果展現:htm

4.測試

  入參blog

  出參

5.最簡單的方式

--結束時間拼接' 00:00:00'
SELECT DECODE(LENGTH(V_END), 10, V_END || ' 00:00:00', V_END) INTO V_END FROM DUAL;

20200612

6.另一種方式

  第一種字符串拼接的方式其實也是能夠執行的,只不過須要藉助遊標來實現,這裏張貼部分代碼

  --業務執行
  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來執行(這是在存儲過程調用的)

  結果以下

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

相關文章
相關標籤/搜索