【问题标题】:Write stored procedure with dynamic SQL使用动态 SQL 编写存储过程
【发布时间】:2019-07-09 13:49:07
【问题描述】:

我想编写一个存储过程,它采用文本参数 (table_name) 并根据该表名执行查询:select count(*) from 并将找到的值写入表。

这是(SELECT COUNT(*) FROM VARTABLE_NAME)部分,我不知道如何在Amazon Redshift中实现

CREATE OR REPLACE  PROCEDURE SP_LOGGING (VARSTART INT, VARRUNID INT , VARPHASE VARCHAR, VARTABLE_NAME VARCHAR)
AS $$

BEGIN
            IF VARSTART = 1 THEN
                BEGIN
                UPDATE AUDIT.RUN_TEST
                SET TABLE_NAME = VARTABLE_NAME
                ,"no_of_records_at_start" = (SELECT COUNT(*) FROM VARTABLE_NAME)
                END;

            ELSEIF VARSTART = 0 THEN    
                BEGIN
                UPDATE AUDIT.RUN_TEST
                SET TABLE_NAME = VARTABLE_NAME
                ,"no_of_records_at_end" = (SELECT COUNT(*) FROM VARTABLE_NAME)
                END;
            END IF;
END;
$$ LANGUAGE PLPGSQL;

【问题讨论】:

    标签: amazon-redshift plpgsql dynamic-sql


    【解决方案1】:

    您需要使用EXECUTE 来运行动态SQL。

    CREATE PROCEDURE sp_logging (
          varstart      INT
        , varrunid      INT 
        , varphase      VARCHAR
        , vartable_name VARCHAR ) 
    AS $$
    BEGIN
        IF varstart = 1 THEN
            EXECUTE 'UPDATE audit.run_test
                        SET table_name = '||vartable_name||'
                          , start_rows = (SELECT COUNT(*) FROM '||vartable_name||' )';
        ELSEIF varstart = 0 THEN    
            EXECUTE 'UPDATE audit.run_test
                        SET table_name = '||vartable_name||'
                          , end_rows = (SELECT COUNT(*) FROM '||vartable_name||')';
        ELSE 
            RAISE ERROR 'Value of `varstart` must be 1 or 0. Received `%`.',varstart;
        END IF;
    END;
    $$ LANGUAGE PLPGSQL;
    

    【讨论】:

    • 小改动:,TABLE_NAME = '''||VARTABLE_NAME||''' 否则将整个查询包装在动态 sql 中的天才想法不仅仅是选择部分!
    猜你喜欢
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多