插入 table Teradata 动态存储过程 SQL
Insert Into table Teradata dynamic stored procedure SQL
我正在尝试在 Teradata 中创建一个将接受各种参数的存储过程。我的查询有 4 次 SQL,它创建了 3 个易变表。在 Select 语句中是我需要动态的 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 帮助我开始了这项工作,因此非常感谢您提供更多帮助。
您没有告诉您想要 INSERT/SELECT
使用动态 SQL,仅当您想要 return 来自 SP 的结果集时才需要游标。
DECLARE q1 VARCHAR(10000);
SET q1 = 'INSERT INTO Select * from mydb.tbl_1 where Department_ID = ' || TRIM(DepID) ||';';
EXECUTE IMMEDIATE q1;
但是如果只有传递给 WHERE 条件的值应该是动态的,您最好应用 prepared 语句(可以多次使用):
SET q1 = 'INSERT INTO Select * from mydb.tbl_1 where Department_ID = ?;';
PREPARE stmt FROM q1;
EXECUTE stmt USING DepID;
我正在尝试在 Teradata 中创建一个将接受各种参数的存储过程。我的查询有 4 次 SQL,它创建了 3 个易变表。在 Select 语句中是我需要动态的 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 帮助我开始了这项工作,因此非常感谢您提供更多帮助。
您没有告诉您想要 INSERT/SELECT
使用动态 SQL,仅当您想要 return 来自 SP 的结果集时才需要游标。
DECLARE q1 VARCHAR(10000);
SET q1 = 'INSERT INTO Select * from mydb.tbl_1 where Department_ID = ' || TRIM(DepID) ||';';
EXECUTE IMMEDIATE q1;
但是如果只有传递给 WHERE 条件的值应该是动态的,您最好应用 prepared 语句(可以多次使用):
SET q1 = 'INSERT INTO Select * from mydb.tbl_1 where Department_ID = ?;';
PREPARE stmt FROM q1;
EXECUTE stmt USING DepID;