2014-02-21 3 views
1

У меня есть функция pl/pgsql для прокрутки таблиц. В HIST_CLEANUP_TBL есть 5 табличных имен. Из 5, 1 имя_таблицы не существует в базе данных.Нужно обрезать таблицы, используя функцию plpgsql

Потребность: Он должен проверить все таблицы. Если таблица не существует, напишите ошибку в таблицу ошибок и усечь оставшуюся таблицу.

Однако, когда когда-либо недоступная таблица приходит в цикл, функция заканчивается.

Как уловить код ошибки и текст в переменной и как продолжить цикл, хотя 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; 
+0

Возможно ли ваша статья исключение сама бросает исключение? Например, если вставка идет не так? Если в обработчике исключений есть исключение, то, безусловно, он будет прерван – harmic

+0

. Здесь проблема заключается в том, что он не входит в цикл исключения. – user3145945

+0

HIST_CLEANUP_TBL TABLE_NAME В С Д Е Здесь C таблица МЭ не существует в базе данных. Функция выполняется для таблиц A и B, когда C завершает работу, а таблица D и E не усекаются. Так что это нужно, чтобы написать таблицу C в таблицу ошибок и процесс D и E – user3145945

ответ

1

Причину ошибки должны быть где-то в другом месте. Следующий код работает правильно:

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 
+0

Спасибо за решение. Я буду перекодировать функцию – user3145945

+0

Привет, Томаш, я перекодировал функцию согласно вашему предложению, она работает нормально. Проблема в том, что я не смог сохранить SQLSTATE и SQLERRM для переменной. Когда когда-либо я пытался хранить его, бросая ошибку, если мы игнорируем, что он работает нормально – user3145945

+0

Рад это слышать. Что касается переменных, предназначенных для хранения значений переменных SQLSTATE и SQLERRM, возможно, они не были объявлены или были объявлены с непервым типом? Независимо от этого, я думаю, вы можете принять мой ответ. –

Смежные вопросы