2016-04-26 10 views
0

Ich versuche, eine gespeicherte Prozedur in Teradata zu erstellen, die verschiedene Argumente akzeptiert. Meine Abfrage hat 4 Durchläufe von SQL, wo es 3 Lose von flüchtigen Tabellen erstellt. Innerhalb der SELECT-Anweisungen ist die SQL, die ich dynamisch sein muss, und hier stößt ich auf Probleme.Einfügen in Tabelle Teradata dynamische gespeicherte Prozedur SQL

Hier ist meine 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; 

Dies funktioniert als SP mit statischem SQL in Ordnung, aber ich brauche die Select-Anweisungen in der dynamisch zu sein in ihnen I Institut und Sections Parameter haben, die ich in der Lage sein will überholen. z.B.

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

Ich habe auch versucht:

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

In beiden Fällen wir die folgende Fehlermeldung erhalten:

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

Ich scheine einen dynamischen SQL-String zu haben, um die Lage sein, aber ich kann habe keinen INSERT INTO SELECT String ??

@dnoeth hat mir geholfen, dies zu starten, so wird jede weitere Hilfe sehr geschätzt.

Antwort

1

Sie haben nicht angegeben, dass Sie INSERT/SELECT mit Dynamic SQL verwenden möchten, ein Cursor wird nur benötigt, wenn Sie eine Ergebnismenge von Ihrem SP zurückgeben möchten.

DECLARE q1 VARCHAR(10000); 

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

EXECUTE IMMEDIATE q1; 

Aber wenn nur die an der WHERE-Bedingung übergebenen Werte sollen dynamisch sein, besser anwenden könnte eine Rechnung (die mehrfach verwendet werden können):

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

PREPARE stmt FROM q1; 

EXECUTE stmt USING DepID; 
+0

Apologies, SQL ist nicht meine Stärke :) Dies hat tatsächlich funktioniert, so denke ich, was ich tun muss, ist nur die volatilen Tabellen erstellen und dann die Daten mit einer allgemeinen Select-Anweisung aus dieser Tabelle zurückziehen. Vielen Dank für Ihre Hilfe, ich schätze es wirklich. – MidnightDataGeek

Verwandte Themen