--開始時間拼接' 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
在oracl數據庫中,ddl表示數據庫定義語言,即咱們日常使用的sql語句,聲明的sql語句能夠直接使用拼接字符串進行拼接;sql
dml表示數據操縱語言,聲明的sql語句不能再用管道符||來動態拼接變量。 數據庫
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
入參blog
出參
--結束時間拼接' 00:00:00' SELECT DECODE(LENGTH(V_END), 10, V_END || ' 00:00:00', V_END) INTO V_END FROM DUAL;
20200612
第一種字符串拼接的方式其實也是能夠執行的,只不過須要藉助遊標來實現,這裏張貼部分代碼
--業務執行 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來執行(這是在存儲過程調用的)
結果以下
另外對於單引號的轉義,兩個緊挨的單引號'',就表示一個轉義過的單引號'