2016-04-26 30 views
0

さまざまな引数を受け入れるTeradataでストアドプロシージャを作成しようとしています。私のクエリは3回の揮発性テーブルを作成するSQLの4回のパスを持っています。 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を私の強みではありません:)これは実際にはうまくいきました。私は、揮発性のテーブルを作成し、そのテーブルから一般的なselectステートメントでデータを取り戻すだけです。 ご協力いただきありがとうございます。本当にありがとうございます。 – MidnightDataGeek

関連する問題