Amazon redshift 用动态SQL编写存储过程

Amazon redshift 用动态SQL编写存储过程,amazon-redshift,plpgsql,dynamic-sql,Amazon Redshift,Plpgsql,Dynamic Sql,我想编写一个存储过程,它采用textparameter表的名称,并基于该表名执行查询:select count*from,然后将找到的值写入表中 我不知道如何在Amazon Redshift中实现来自VARTABLE_NAME的SELECT COUNT* CREATE OR REPLACE PROCEDURE SP_LOGGING (VARSTART INT, VARRUNID INT , VARPHASE VARCHAR, VARTABLE_NAME VARCHAR) AS $$ BEGI

我想编写一个存储过程,它采用textparameter表的名称,并基于该表名执行查询:select count*from,然后将找到的值写入表中

我不知道如何在Amazon Redshift中实现来自VARTABLE_NAME的SELECT COUNT*

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;
您需要使用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;
您需要使用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中,而不仅仅是选择部分!小改动:,TABLE_NAME='| | VARTABLE_NAME | | |否则,将整个查询包装在动态sql中,而不仅仅是选择部分!