2016-04-26 101 views
0

我想在Teradata中創建一個存儲過程,它將接受各種參數。我的查詢有4個SQL傳遞,它創建了3個易失性表。在Select語句中,我需要動態的SQL,這是我遇到問題的地方。插入表Teradata動態存儲過程SQL

這裏是我的SQL:

CREATE PROCEDURE "mydb"."test_sp20" (DepID integer) --DepID is my parameter 
DYNAMIC RESULT SETS 1 SQL SECURITY OWNER 
BEGIN 

DECLARE q1 VARCHAR(10000); 
DECLARE cur1 CURSOR WITH RETURN ONLY TO client FOR s1; 

CREATE VOLATILE TABLE mydb.tbl_1 , no fallback, no log(
Consumer_Unit_Id INTEGER, 
Price_Promotion_Id INTEGER, 
Promotion_Id INTEGER) 
primary index (Consumer_Unit_Id, Price_Promotion_Id, Promotion_Id) on commit preserve rows ; 

INSERT INTO mydb.tbl_1 
SELECT * FROM mydb.tbl_1 
SET q1 = 'Select * from mydb.tbl_1' 
PREPARE s1 FROM q1; 
OPEN cur1; 
END; 

這工作得很好,與靜態SQL一個SP,但我需要的SELECT語句是動態的,在其中我有,我希望能夠廳和部分參數通過交叉。例如

INSERT INTO mydb.tbl_1 
SQL = 'Select * from mydb.tbl_1 where Department_ID = ' || DepID ||' 

我也試過:

SQL = 'INSERT INTO Select * from mydb.tbl_1 where Department_ID = ' || DepID ||' 

在這兩種情況下,我得到以下錯誤:

7683: TEST_SP20:Invalid statement specified inside a dynamic declare cursor/SQL statement 

我似乎能夠有一個動態的SQL字符串,但我可以沒有INSERT INTO SELECT字符串?

@dnoeth幫助我開始了這個,所以更多的幫助是非常感謝。

回答

1

你沒有告訴你想要使用動態SQL的INSERT/SELECT,只有當你想從SP返回結果集時才需要光標。

DECLARE q1 VARCHAR(10000); 

SET q1 = 'INSERT INTO Select * from mydb.tbl_1 where Department_ID = ' || TRIM(DepID) ||';'; 

EXECUTE IMMEDIATE q1; 

但如果只傳遞到WHERE條件的值應該是動態的,你可以更好地應用準備語句(可多次使用):

SET q1 = 'INSERT INTO Select * from mydb.tbl_1 where Department_ID = ?;'; 

PREPARE stmt FROM q1; 

EXECUTE stmt USING DepID; 
+0

道歉,SQL是不是我的優點:)這實際上工作,所以我認爲我只需創建易失性表,然後用該表中的一般選擇語句將數據拉回。 感謝您的幫助,我真的很感激。 – MidnightDataGeek