2016-03-17 2 views
0

Я пытаюсь взять две разделенные запятой строки и разделить их на две отдельные таблицы, чтобы использовать их позже для сравнения. Ниже приведено как можно ближе к этому вопросу. Обе строки помещаются в одну и ту же таблицу, что, честно говоря, будет работать в случае, в котором я нуждаюсь, но это очень неуклюжее решение.Отдельные таблицы из разделенных запятыми строк

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

DECLARE 
    L_INPUT_LOG VARCHAR2(25) := 'Error,Audit'; 
    L_INPUT_MOD VARCHAR(4000) := 'MODULE1,MODULE2'; 
    L_COUNT BINARY_INTEGER; 
    LOG_TYPE_ARRAY DBMS_UTILITY.LNAME_ARRAY; 
    APP_MODULE_ARRAY DBMS_UTILITY.LNAME_ARRAY; 
    BEGIN 
     DBMS_UTILITY.COMMA_TO_TABLE(LIST => REGEXP_REPLACE(L_INPUT_LOG, '(^|,)', '\1x'), TABLEN => L_COUNT, TAB => LOG_TYPE_ARRAY); 
     DBMS_UTILITY.COMMA_TO_TABLE(LIST => REGEXP_REPLACE(L_INPUT_MOD, '(^|,)', '\1x'), TABLEN => L_COUNT, TAB => APP_MODULE_ARRAY); 
     FOR I IN 1 .. L_COUNT 
     LOOP 
     INSERT INTO TEST VALUES 
      (SUBSTR(LOG_TYPE_ARRAY(I), 2)); 
     COMMIT; 
     END LOOP; 
     FOR I IN 1 .. L_COUNT 
     LOOP 
     INSERT INTO TEST VALUES 
      (SUBSTR(APP_MODULE_ARRAY(I), 2)); 
      COMMIT; 
      END LOOP; 
     END; 

UPDATE: Ниже ошибка, что я получаю, когда я пытаюсь изменить таблицу TEST во втором цикле. В ответ на просьбу от MaxU

Error starting at line : 1 in command - 
DECLARE 
L_INPUT_LOG VARCHAR2(25) := 'Error,Audit'; 
L_INPUT_MOD VARCHAR(4000) := 'MODULE1,MODULE2'; 
L_COUNT BINARY_INTEGER; 
LOG_TYPE_ARRAY DBMS_UTILITY.LNAME_ARRAY; 
APP_MODULE_ARRAY DBMS_UTILITY.LNAME_ARRAY; 
BEGIN 
    DBMS_UTILITY.COMMA_TO_TABLE(LIST => REGEXP_REPLACE(L_INPUT_LOG, '(^|,)', '\1x'), TABLEN => L_COUNT, TAB => LOG_TYPE_ARRAY); 
    DBMS_UTILITY.COMMA_TO_TABLE(LIST => REGEXP_REPLACE(L_INPUT_MOD, '(^|,)', '\1x'), TABLEN => L_COUNT, TAB => APP_MODULE_ARRAY); 
    FOR I IN 1 .. L_COUNT 
    LOOP 
    INSERT INTO TEST VALUES 
     (SUBSTR(LOG_TYPE_ARRAY(I), 2)); 
    COMMIT; 
    END LOOP; 
    FOR I IN 1 .. L_COUNT 
    LOOP 
    INSERT INTO GRIM VALUES 
     (SUBSTR(APP_MODULE_ARRAY(I), 2)); 
    COMMIT; 
    END LOOP; 
END; 
Error report - 
ORA-06550: line 18, column 18: 
PL/SQL: ORA-00942: table or view does not exist 
ORA-06550: line 18, column 6: 
PL/SQL: SQL Statement ignored 
06550. 00000 - "line %s, column %s:\n%s" 
*Cause: Usually a PL/SQL compilation error. 
*Action: 
+0

Если это работает, и вы получаете ошибку, изменяя только имя таблицы, возможно, такая таблица не существует или у вас нет прав на вставку – Aleksej

+0

Права в порядке, я вхожу в систему как администратор для этой конкретной БД (Development). Кажется странным, что единственным именем таблицы, которое я могу использовать, является «TEST» – michaelk46

+0

. Какая ошибка? вы делаете это в SP или функции? – MaxU

ответ

0

Там может быть несколько причин, по которым может возникнуть проблема.

1) Если таблица «ТЕСТ» создана в той же схеме, где вы выполняете сценарий ?

Если нет, попробуйте предоставить schema_name.TEST, и если вы полагаетесь на ROLES для GRANT, здесь он не будет работать. Поэтому вам необходимо предоставить DIRECT OBJECT GRANTS для доступа к таблице.

Try GRANT SELECT,insert,update,delete ON SCHEMA.TEST TO <USER>; 

Надеется, что это помогает.

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