Я пытаюсь сделать запрос с несколькими операторами для запроса 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, и он отлично работает.
Кто-нибудь знает, как я могу сделать многогранность для этого вида запроса? Я уже сделал это только с таблицей создания, и она работает, но я хочу добавить индекс, ограничение, изменить таблицу, добавить комментарии и другие для одной и той же таблицы все в одном.
Возможно ли это?
Заранее спасибо.