Как использовать dbms_ sql .parse для нескольких операторов PL / SQL запрос - PullRequest
3 голосов
/ 28 февраля 2020

Я пытаюсь сделать запрос с несколькими операторами для запроса PL / SQL с помощью Oracle 12 c, чтобы создать таблицу, если эта таблица не существует, иначе ничего не делать.

Это код, который я на самом деле использую:

DECLARE
    L_EXST NUMBER(1);
BEGIN
    SELECT
        CASE WHEN EXISTS(   SELECT TABLE_NAME
                            FROM USER_TABLES 
                            WHERE TABLE_NAME = 'TABLE_NAME_X') 
                            THEN 1 ELSE 0 END INTO L_EXST FROM DUAL;
    IF L_EXST = 1 THEN
        DBMS_OUTPUT.PUT_LINE('TABLE ALREADY EXISTS');
    ELSE
        DBMS_OUTPUT.PUT_LINE('CREATING TABLE');
        DECLARE
            QUERY_ARRAY DBMS_SQL.VARCHAR2A;
            C NUMBER;
            RES NUMBER;
        BEGIN
            DBMS_OUTPUT.PUT_LINE('1');
            C := DBMS_SQL.OPEN_CURSOR;
            DBMS_OUTPUT.PUT_LINE('2');
            QUERY_ARRAY(1)      := 'CREATE TABLE TABLE_NAME_X(';
            QUERY_ARRAY(2)      := 'VALUE_1     VARCHAR2(50 BYTE)   NOT NULL,';
            QUERY_ARRAY(3)      := 'VALUE_2     DATE                NOT NULL,';
            QUERY_ARRAY(4)      := 'VALUE_3     NUMBER(12),';
            QUERY_ARRAY(5)      := 'VALUE_4     NUMBER(12),';
            QUERY_ARRAY(6)      := 'VALUE_5     NUMBER(12),';
            QUERY_ARRAY(7)      := 'VALUE_6     VARCHAR2(20 BYTE)   NOT NULL,';
            QUERY_ARRAY(8)      := 'VALUE_7     VARCHAR2(50 BYTE),';
            QUERY_ARRAY(9)      := 'VALUE_8     NUMBER,';
            QUERY_ARRAY(10)     := 'VALUE_9     NUMBER,';
            QUERY_ARRAY(11)     := 'VALUE_10    NUMBER,';
            QUERY_ARRAY(12)     := 'VALUE_11    NUMBER(18),';
            QUERY_ARRAY(13)     := 'VALUE_12    NUMBER,';
            QUERY_ARRAY(14)     := 'VALUE_13    DATE,';
            QUERY_ARRAY(15)     := 'VALUE_14    NUMBER(20),';
            QUERY_ARRAY(16)     := 'VALUE_15    NUMBER(18),';
            QUERY_ARRAY(17)     := 'VALUE_16    NUMBER(18),';
            QUERY_ARRAY(18)     := 'VALUE_17    NUMBER,';
            QUERY_ARRAY(19)     := 'VALUE_18    NUMBER(18),';
            QUERY_ARRAY(20)     := 'VALUE_19    NUMBER(18),';
            QUERY_ARRAY(21)     := 'VALUE_20    DATE,';
            QUERY_ARRAY(22)     := 'VALUE_21    NUMBER(12),';
            QUERY_ARRAY(23)     := 'VALUE_22    DATE);'; -- HERE WITHOUT ; WORKS FINE, WITH ; DOESN'T WORKS
            -- FROM HERE TO THE LAST ONE (44) NOTHING WORKS
            QUERY_ARRAY(24)     := 'CREATE INDEX IDX_TABLE_NAME_X_VAL01 ON TABLE_NAME_X (VALUE_18);';
            QUERY_ARRAY(25)     := 'COMMENT ON COLUMN TABLE_NAME_X.VALUE_1 IS ''Some comment for 1'';';
            QUERY_ARRAY(26)     := 'COMMENT ON COLUMN TABLE_NAME_X.VALUE_2 IS ''Some comment for 2'';';
            QUERY_ARRAY(27)     := 'COMMENT ON COLUMN TABLE_NAME_X.VALUE_3 IS ''Some comment for 3'';';
            QUERY_ARRAY(28)     := 'COMMENT ON COLUMN TABLE_NAME_X.VALUE_4 IS ''Some comment for 4'';';
            QUERY_ARRAY(29)     := 'COMMENT ON COLUMN TABLE_NAME_X.VALUE_5 IS ''Some comment for 5'';';
            QUERY_ARRAY(30)     := 'COMMENT ON COLUMN TABLE_NAME_X.VALUE_6 IS ''Some comment for 6'';';
            QUERY_ARRAY(31)     := 'COMMENT ON COLUMN TABLE_NAME_X.VALUE_7 IS ''Some comment for 7'';';
            QUERY_ARRAY(32)     := 'COMMENT ON COLUMN TABLE_NAME_X.VALUE_8 IS ''Some comment for 8'';';
            QUERY_ARRAY(33)     := 'COMMENT ON COLUMN TABLE_NAME_X.VALUE_9 IS ''Some comment for 9'';';
            QUERY_ARRAY(34)     := 'COMMENT ON COLUMN TABLE_NAME_X.VALUE_10 IS ''Some comment for 10'';';
            QUERY_ARRAY(35)     := 'COMMENT ON COLUMN TABLE_NAME_X.VALUE_11 IS ''Some comment for 11'';';
            QUERY_ARRAY(36)     := 'COMMENT ON COLUMN TABLE_NAME_X.VALUE_12 IS ''Some comment for 12'';';
            QUERY_ARRAY(37)     := 'COMMENT ON COLUMN TABLE_NAME_X.VALUE_13 IS ''Some comment for 13'';';
            QUERY_ARRAY(38)     := 'COMMENT ON COLUMN TABLE_NAME_X.VALUE_14 IS ''Some comment for 14'';';
            QUERY_ARRAY(39)     := 'COMMENT ON COLUMN TABLE_NAME_X.VALUE_15 IS ''Some comment for 15'';';
            QUERY_ARRAY(40)     := 'COMMENT ON COLUMN TABLE_NAME_X.VALUE_16 IS ''Some comment for 16'';';
            QUERY_ARRAY(41)     := 'COMMENT ON COLUMN TABLE_NAME_X.VALUE_17 IS ''Some comment for 17'';';
            QUERY_ARRAY(42)     := 'COMMENT ON COLUMN TABLE_NAME_X.VALUE_18 IS ''Some comment for 18'';';
            QUERY_ARRAY(43)     := 'COMMENT ON COLUMN TABLE_NAME_X.VALUE_19 IS ''Some comment for 19'';';
            QUERY_ARRAY(44)     := 'COMMENT ON COLUMN TABLE_NAME_X.VALUE_22 IS ''Some comment for 22'';';
            -- EACH ELEMENT CAN HAVE UP TO 32K CHARACTERS, NUMBER OF ELEMENTS IS (ALMOST) UNLIMITED
            DBMS_OUTPUT.PUT_LINE('2/3');
            DBMS_SQL.PARSE(C, QUERY_ARRAY, 1, 44, TRUE, DBMS_SQL.NATIVE);
            DBMS_OUTPUT.PUT_LINE('3');
            RES := DBMS_SQL.EXECUTE(C);
            DBMS_OUTPUT.PUT_LINE('4');
            DBMS_SQL.CLOSE_CURSOR(C);
            DBMS_OUTPUT.PUT_LINE('5');
        EXCEPTION WHEN OTHERS THEN
            DBMS_OUTPUT.PUT_LINE('ERROR: '||sqlerrm);
        END;
    END IF;
END;

Но у меня есть эта ошибка:

DBMS_OUTPUT:
------------
CREATING TABLE
1
2
2/3
ERROR: ORA-00922: missing or invalid option

Затем я попытался исключить все комментарии и создание индекса (только от 1 до 23) ), затем удалив ';' из утверждения 23, и он отлично работает.

Кто-нибудь знает, как я могу сделать многогранность для этого вида запроса? Я уже сделал это только с таблицей создания, и она работает, но я хочу добавить индекс, ограничение, изменить таблицу, добавить комментарии и другие для одной и той же таблицы все в одном.

Возможно ли это?

Заранее спасибо.

...