sql server、db2、oracle 預存程序動態sql語句樣本,db2oracle
Oracle
CREATE OR REPLACE PROCEDURE a_testAS t_sql VARCHAR2(2000); t_a VARCHAR2(20); t_b VARCHAR2(20); t_c VARCHAR2(20); t_d VARCHAR2(20);BEGIN t_c := 'f'; t_d := 'g'; --這裡可為insert 等任何sql語句. t_sql := 'SELECT MAX(a), MAX(b) FROM t1 WHERE c = :tempC OR c = :tempD'; EXECUTE IMMEDIATE t_sql INTO t_a, t_b --如果不需要查詢賦值,這裡不用寫 INTO XXX語句. USING t_c, t_d -- 如果不需要使用變數,不用寫USING XXX語句. ;END a_test;/
--帶返回遊標的動態執行語句.CREATE OR REPLACE PROCEDURE a_test2( o_cursor OUT SYS_REFCURSOR)AS t_sql VARCHAR2(2000); t_a VARCHAR2(20); t_b VARCHAR2(20); t_c VARCHAR2(20); t_d VARCHAR2(20);BEGIN t_c := 'f'; t_d := 'g'; --這裡可為insert 等任何sql語句. t_sql := 'SELECT * FROM t1 WHERE c = :tempC OR c = :tempD'; OPEN o_cursor FOR t_sql USING t_c, t_d -- 同樣如果不需要使用變數,不用寫USING XXX語句. ;END a_test2;/
SQL Server
CREATE PROCEDURE a_testAS DECLARE @t_sql NVARCHAR(2000); --sql server 動態語句要申明為NVARCHAR類型. DECLARE @t_a VARCHAR(20); DECLARE @t_b VARCHAR(20); DECLARE @t_c VARCHAR(20); DECLARE @t_d VARCHAR(20);BEGIN SET @t_c = 'f'; SET @t_d = 'g'; --這裡可為insert 等任何sql語句. SET @t_sql = 'SELECT @tempA = MAX(a), @tempB = MAX(b) FROM t1 WHERE c = @tempC OR c = @tempD'; --不可在EXECUTE SP_EXECUTESQL後邊拼接字串 EXECUTE SP_EXECUTESQL @t_sql --如果不帶參數,以下申明變數及傳入參數都不需要寫. --申明變數類型及出入參.必須一行寫完,不能換行. ,N'@tempA VARCHAR(20) OUT, @tempB VARCHAR(20) OUT, @tempC VARCHAR(20), @tempD VARCHAR(20)' -- 參數值. 傳入變數的順序要與申明變數的順序一致, ,@t_a OUT, @t_b OUT, @t_c, @t_d ;ENDGO--sql server返回遊標與普通的語句一樣,直接將t_sql賦值成 select * from XXX 即可.
Db2
CREATE PROCEDURE a_test( v_c VARCHAR(20))BEGIN DECLARE t_sql VARCHAR2(2000); DECLARE t_a VARCHAR2(20); DECLARE t_b VARCHAR2(20); DECLARE t_c VARCHAR2(20); DECLARE t_d VARCHAR2(20); -- FOR 後邊的t_stmt要與下邊的 prepare後的變數一致,其類型為 statement. DECLARE t_cur CURSOR FOR t_stmt; SET t_c = 'f'; SET t_d = 'g'; --這裡可為insert 等任何sql語句. SET t_sql = 'SELECT MAX(a), MAX(b) FROM t1 WHERE c = :tempC OR c = :tempD'; --我目前在這裡沒找到其它方式來替代,只能使用遊標讀取: PREPARE t_stmt FROM t_sql; OPEN t_cur --如果不需要使用變數,不用寫USING XXX語句. USING t_c, t_d ; FETCH t_cur INTO t_a, t_b; CLOSE t_cur;END
/*帶遊標返回的動態語句與普通語句一樣,只是申明遊標時,要申明傳回型別的遊標並且在begin關鍵字之前需要插入:DYNAMIC RESULT SETS 1LANGUAGE SQL*/CREATE PROCEDURE a_test2( v_c VARCHAR(20))DYNAMIC RESULT SETS 1LANGUAGE SQLBEGIN DECLARE t_sql VARCHAR2(2000); DECLARE t_a VARCHAR2(20); DECLARE t_b VARCHAR2(20); DECLARE t_c VARCHAR2(20); DECLARE t_d VARCHAR2(20); -- FOR 後邊的t_stmt要與下邊的 prepare後的變數一致,其類型為 statement. DECLARE t_cur CURSOR WITH RETURN FOR t_stmt; SET t_c = 'f'; SET t_d = 'g'; --這裡可為insert 等任何sql語句. SET t_sql = 'SELECT MAX(a), MAX(b) FROM t1 WHERE c = :tempC OR c = :tempD'; PREPARE t_stmt FROM t_sql; OPEN t_cur --如果不需要使用變數,不用寫USING XXX語句. USING t_c, t_d ;END