PL / SQL сохранить иерархический запрос в переменную - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь сохранить набор результатов иерархического запроса в переменную

 CREATE OR REPLACE FUNCTION test12 
    RETURN number IS
      result number(4):=0; 
      clli_array dbms_sql.varchar2_table;
    BEGIN 
       with tmp as (select 'strforregexp' str from dual) 
       select regexp_substr(str, '\/([A-Z0-9]{11}|[A-Z0-9]{8})', 1, level) STR into :clli_array from tmp
       connect by regexp_substr(str, '\/([A-Z0-9]{11}|[A-Z0-9]{8})', 1, level) is not null;
    END test12;

Но получаю ошибку

Ошибка (9,9): PLS-00049: переменная неверного связывания 'CLLI_ARRAY'

Итак, у меня есть 2 вопроса

1) можно ли получить все совпадения регулярного выражения без иерархического запроса

2) почему я получаю ошибку

1 Ответ

0 голосов
/ 14 сентября 2018

Как указывал @APC, первая проблема в том, что перед CLLI_ARRAY стоит двоеточие.Это заставляет компилятор PL / SQL полагать, что CLLI_ARRAY будет переменной подстановки SQL * Plus, и когда он обнаруживает, что такая переменная не определена, он выдает ошибку, которую вы получили.

Однако,даже если вы удалите толстую кишку, вы еще не вышли из леса.После удаления двоеточия вы получите

PLS-00597: expression 'CLLI_ARRAY' in the INTO list is of wrong type

Это потому, что CLLI_ARRAY является коллекцией типа PL / SQL, но ваш оператор возвращает одну строку.

Что вы, вероятно, хотитедля этого нужно использовать BULK COLLECT, чтобы система извлекла все результаты запроса в ваш VARCHAR2_TABLE:

with tmp as (select 'strforregexp' str from dual)
select regexp_substr(str, '\/([A-Z0-9]{11}|[A-Z0-9]{8})', 1, level) STR
  BULK COLLECT into clli_array
  from tmp
  connect by regexp_substr(str, '\/([A-Z0-9]{11}|[A-Z0-9]{8})', 1, level) is not null

Best of luck.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...