SQL проверяет, существует ли таблица и усекается ли - PullRequest
1 голос
/ 01 ноября 2019

Я пытаюсь закодировать инструкцию, которая проверяет, существует ли таблица, и урезает / удаляет ли она. Если его не существует, выведите сообщение «Эта таблица не существует!»

Это то, что я дошел до сих пор, но, похоже, не работает.

BEGIN
         TRUNCATE TABLE PPA_P6_2018;
    EXCEPTION
        WHEN OTHERS THEN
            IF SQLCODE = -942 THEN
                DBMS_OUTPUT.put_line('This table does not exist!');
            ELSE
                RAISE;
                DBMS_OUTPUT.put_line('This table has been delted!');
            END IF;
    END;

Ответы [ 3 ]

2 голосов
/ 01 ноября 2019

Создайте пользовательское исключение для перехвата, когда таблица не существует, а затем только для перехвата этого единственного исключения (вместо перехвата всех их с помощью OTHERS), а затем используйте EXECUTE IMMEDIATE для усечения / отбрасывания таблицы:

DECLARE
  table_name VARCHAR2(30) := 'PPA_P6_2018';
  table_not_exists EXCEPTION;
  PRAGMA EXCEPTION_INIT( table_not_exists, -942 );
BEGIN
  EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || table_name;
  EXECUTE IMMEDIATE 'DROP TABLE ' || table_name;
  DBMS_OUTPUT.put_line('This table has been deleted!');
EXCEPTION
  WHEN table_not_exists THEN
    DBMS_OUTPUT.put_line('This table does not exist!');
END;
/

дБ <> скрипка

2 голосов
/ 01 ноября 2019

TRUNCATE TABLE является DDL, поэтому не может быть запущен непосредственно в PL / SQL. Вам нужно использовать EXECUTE IMMEDIATE:

BEGIN
    EXECUTE IMMEDIATE 'TRUNCATE TABLE PPA_P6_2018';
EXCEPTION
    WHEN OTHERS THEN
        IF SQLCODE = -942 THEN
            DBMS_OUTPUT.put_line('This table does not exist!');
        ELSE
            RAISE;
            DBMS_OUTPUT.put_line('This table has been delted!');
        END IF;
END;

Примечание: вы никогда не увидите сообщение «Эта таблица удалена!»так как поднять, прежде чем он выбрасывает вас из блока! И если вы получили ошибку, таблица еще не была удалена!

0 голосов
/ 01 ноября 2019
DECLARE
    v_count        NUMBER;
    v_table_name   VARCHAR2 (100) := 'YOURTABLE';
    v_sqlstr       VARCHAR2 (1000);
BEGIN
    SELECT   COUNT ( * )
      INTO   v_count
      FROM   user_tables
     WHERE   table_name = v_table_name;

    IF v_count > 0
    THEN
        v_sqlstr := 'DELETE FROM ' || v_table_name;

        EXECUTE IMMEDIATE v_sqlstr;

        DBMS_OUTPUT.put_line (
            'TABLE ' || v_table_name || ' HAS BEEN DELETED!');
    ELSE
        DBMS_OUTPUT.put_line ('TABLE ' || v_table_name || ' DOES NOT EXIST!');
    END IF;
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...