【问题标题】:Insert Into table Teradata dynamic stored procedure SQL插入表 Teradata 动态存储过程 SQL
【发布时间】:2016-08-20 08:23:15
【问题描述】:

我正在尝试在 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 语句是动态的,因为在它们中我有我希望能够传递的 Department 和 Sections 参数。例如

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 帮助我开始了这项工作,因此非常感谢您提供更多帮助。

【问题讨论】:

    标签: sql stored-procedures teradata


    【解决方案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 条件的值应该是动态的,您最好应用 prepared 语句(可以多次使用):

    SET q1 = 'INSERT INTO Select * from mydb.tbl_1 where Department_ID = ?;';
    
    PREPARE stmt FROM q1;
    
    EXECUTE stmt USING DepID;
    

    【讨论】:

    • 抱歉,SQL 不是我的强项 :) 这确实有效,所以我认为我需要做的只是创建易失性表,然后使用该表中的一般选择语句将数据拉回。感谢您的帮助,我真的很感激。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 2015-10-03
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 2018-04-01
    相关资源
    最近更新 更多