将表与拆分逗号分隔的字符串分开

时间:2016-03-17 14:21:42

标签: oracle plsql

我正在尝试将两个逗号分隔的字符串分成两个单独的表,以便稍后用于比较原因。下面就像我到目前为止一样接近。这两个字符串都被放在同一个表中,老实说它可以用于我需要它的情况,但它是一个非常笨重的解决方案。

我尝试更改表格的名称< 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;

更新:下面是我尝试在第二个循环中更改表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:

1 个答案:

答案 0 :(得分:0)

  

可能有多种原因导致问题出现。

     

1)如果' TEST'从您所在的同一架构中创建的表   执行脚本?

     

如果否尝试提供schema_name.TEST以及您是否依赖于ROLES   对于GRANT来说,它不会工作。所以你需要提供DIRECT OBJECT   等级GRANTS访问该表。

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

希望这有帮助。