Концепция регулярного выражения преобразования Oracle в Postgres - PullRequest
0 голосов
/ 26 октября 2018

Может ли кто-нибудь сообщить мне, как преобразовать приведенный ниже исходный код оракула в хранимой процедуре в Postgresql

CURSOR DATA_PKG (iPKG varchar2)IS
SELECT REGEXP_SUBSTR(iPKG, '[^,]+', 1, LEVEL) Data_PKG FROM dual
connect BY REGEXP_SUBSTR(iPKG, '[^,]+', 1, LEVEL) IS NOT NULL;
CURSOR LEC_PKG (iPKG varchar2) IS
SELECT REGEXP_SUBSTR(iPKG, '[^,]+', 1, LEVEL) LEC_Pkg FROM dual
connect BY REGEXP_SUBSTR(iPKG, '[^,]+', 1, LEVEL) IS NOT NULL;

Мой код Postgres выглядит следующим образом:

c3 CURSOR (ipkg TEXT) FOR
    WITH RECURSIVE t (pkg)
    AS (SELECT
        aws_oracle_ext.regexp_substr(ipkg, '[^,]+', 1, 1) AS data_pkg
    UNION ALL
    SELECT
        aws_oracle_ext.regexp_substr(ipkg, '[^,]+', 1, t.level + 1)
        FROM t
        WHERE aws_oracle_ext.regexp_substr(ipkg, '[^,]+', 1, level + 1) IS NOT NULL)
    SELECT
        data_pkg
        FROM t;
    c4 CURSOR (ipkg TEXT) FOR
    WITH RECURSIVE t2 (pkg)
    AS (SELECT
        aws_oracle_ext.regexp_substr(ipkg, '[^,]+', 1, 1) AS lec_pkg
    UNION ALL
    SELECT
        aws_oracle_ext.regexp_substr(ipkg, '[^,]+', 1, t2.level + 1)
        FROM t2
        WHERE aws_oracle_ext.regexp_substr(ipkg, '[^,]+', 1, level + 1) IS NOT NULL)
    SELECT
        lec_pkg
        FROM t2;

Но когда я выполняю эту функцию в Postgresql, она выдает ошибку, как показано ниже,

ERROR:  column t.level does not exist LINE 6: ...   aws_oracle_ext.regexp_substr(ipkg, '[^,]+', 1, t.level + ...
                                                             ^ QUERY:  WITH RECURSIVE t (pkg)
    AS (SELECT
        aws_oracle_ext.regexp_substr(ipkg, '[^,]+', 1, 1) AS data_pkg
    UNION ALL
    SELECT
        aws_oracle_ext.regexp_substr(ipkg, '[^,]+', 1, t.level + 1)
        FROM t
        WHERE aws_oracle_ext.regexp_substr(ipkg, '[^,]+', 1, level + 1) IS NOT NULL)
    SELECT
        data_pkg
        FROM t CONTEXT:  PL/pgSQL function "pop_bus_bundle$populate_bundle_names"() line 60 at FOR over cursor SQL state: 42703

1 Ответ

0 голосов
/ 26 октября 2018

Что такое aws_oracle_ext.regexp_substr?Это какой-то API-оболочка, который выполняет преобразование?

Почему бы напрямую не использовать эквивалент Postgres, который разбивает строку через запятую на строки?В конечном итоге кажется, что именно это делают ваши операторы select в исходном коде.

select  regexp_split_to_table(iPKG,',');

Demo

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