Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 需要使用plpgsql函数截断表_Postgresql_Plpgsql - Fatal编程技术网

Postgresql 需要使用plpgsql函数截断表

Postgresql 需要使用plpgsql函数截断表,postgresql,plpgsql,Postgresql,Plpgsql,我已经编写了一个pl/pgsql函数来构造表。HIST_CLEANUP_TBL中有5个表名。在5个表中,1个表名称在数据库中不存在 需要的是:它必须检查所有表格。如果表不存在,则将错误写入错误表并截断剩余的表 然而,当循环中出现不可用的表时,函数就会终止 如何捕获变量中的错误代码和文本,以及如何在1个表不存在的情况下继续循环 我们正在使用postgresql 8.2 BEGIN for recordvar in SELECT 'truncate table ' || T

我已经编写了一个pl/pgsql函数来构造表。HIST_CLEANUP_TBL中有5个表名。在5个表中,1个表名称在数据库中不存在

需要的是:它必须检查所有表格。如果表不存在,则将错误写入错误表并截断剩余的表

然而,当循环中出现不可用的表时,函数就会终止

如何捕获变量中的错误代码和文本,以及如何在1个表不存在的情况下继续循环

我们正在使用postgresql 8.2

BEGIN  

    for recordvar in 
    SELECT 'truncate table  ' || TABLE_NAME  as SQRY  FROM HIST_CLEANUP_TBL
    loop
       QUERY1 := recordvar.SQRY;
       RAISE NOTICE 'QUERY: (%)', QUERY1;     

       BEGIN
       execute QUERY1;
       RAISE NOTICE 'QUERY EXECUTED SUCCESSFULLY';   
       EXCEPTION
       WHEN others
       THEN
       --GET STACKED DIAGNOSTICS 
      ERR_NUM := SQLSTATE;
      ERR_MESG := SQLERRM ;

       RAISE NOTICE 'ERROR WHILE EXECUTING THE QUERY : %',ERR_NUM;

      insert into Refresh_Error_tbl(sqlerr_code,sqlerr_desc,sql_desc, INSERT_DT,refresh_load_id) values(ERR_NUM,ERR_MESG,QUERY1,current_timestamp,'1');
       END;
      end loop; 
END;

错误的原因必须在其他地方。以下代码工作正常:

CREATE TABLE hist_cleanup (
    table_name  text
);

CREATE TABLE table_a();
CREATE TABLE table_b();
--  table_c missing
CREATE TABLE table_d();
CREATE TABLE table_e();

INSERT INTO hist_cleanup
VALUES
    ('table_a')
,   ('table_b')
,   ('table_c')
,   ('table_d')
,   ('table_e');

CREATE TABLE refresh_error (
    sqlerr_code     text
,   sqlerr_desc     text
,   sql_desc        text
,   insert_dt       timestamp
,   refresh_load_id int
);

CREATE OR REPLACE FUNCTION cleanup()
RETURNS VOID AS $$
DECLARE
    _rec    record;
    _query  text;
BEGIN  

    FOR _rec IN (
        SELECT  table_name
        FROM    hist_cleanup
    ) LOOP
        _query := 'TRUNCATE TABLE ' || _rec.table_name;

        RAISE NOTICE 'QUERY: (%)', _query;     

        BEGIN
            EXECUTE _query;
            RAISE NOTICE 'QUERY EXECUTED SUCCESSFULLY';   
        EXCEPTION
            WHEN OTHERS
            THEN
                RAISE NOTICE 'ERROR WHILE EXECUTING THE QUERY: % %', SQLSTATE, SQLERRM;
                INSERT INTO refresh_error (
                    sqlerr_code
                ,   sqlerr_desc
                ,   sql_desc
                ,   insert_dt
                ,   refresh_load_id )
                VALUES (
                    SQLSTATE
                ,   SQLERRM
                ,   _query
                ,   CURRENT_TIMESTAMP
                ,   '1'
                );
        END;
    END LOOP;

    RETURN;

END $$ LANGUAGE plpgsql;

SELECT  cleanup();
输出:

NOTICE:  QUERY: (TRUNCATE TABLE table_a)
NOTICE:  QUERY EXECUTED SUCCESSFULLY
NOTICE:  QUERY: (TRUNCATE TABLE table_b)
NOTICE:  QUERY EXECUTED SUCCESSFULLY
NOTICE:  QUERY: (TRUNCATE TABLE table_c)
NOTICE:  ERROR WHILE EXECUTING THE QUERY: 42P01 relation "table_c" does not exist
NOTICE:  QUERY: (TRUNCATE TABLE table_d)
NOTICE:  QUERY EXECUTED SUCCESSFULLY
NOTICE:  QUERY: (TRUNCATE TABLE table_e)
NOTICE:  QUERY EXECUTED SUCCESSFULLY

您的exception子句本身是否可能引发异常?例如,如果插入出错?如果异常处理程序中存在异常,那么它肯定会中止。问题是它没有进入异常循环。历史\u清理\u TBL Table \u此处命名为A B C D E,数据库中不存在C Table。当C到达时,函数正在为表A和B运行,终止函数,并且表D和E没有被截断。因此,需要将表C写入错误表并处理D和Ethak。对于解决方案,我将重新编码函数。Hi Tomasz,我根据您的建议重新编码了函数。它运行良好。问题是我无法将SQLSTATE和SQLERRM存储到变量中。当我试图存储它时,如果我们忽略它,它就会抛出错误。很高兴听到它。至于要存储SQLSTATE和SQLERRM变量值的变量,可能它们没有声明,或者是用unpper类型声明的?不管怎样,我想你可以接受我的回答。谢谢!我的问题很相似,我需要截断for循环中的7个表,并检查它是否成功。将FK放入表中时,脚本会引发错误。再次感谢您!