Вызвать другую хранимую процедуру и установить локальную переменную и использовать как таблицу - PullRequest
0 голосов
/ 06 мая 2020

Я хочу вызвать одну ранее созданную хранимую процедуру и установить SYS_REFCURSOR вывод в локальную переменную (другую хранимую процедуру). Я хочу использовать эту новую переменную как таблицу. Мне нужно применить некоторые фильтры и фильтры

В этой хранимой процедуре я пытаюсь вызвать удаленную хранимую процедуру, а затем использовать ее как переменную:

CREATE OR REPLACE PROCEDURE getmovimientosagenteres (
    primerdia      IN   STRING,
    ultimodia      IN   STRING,
    idbusqueda     IN   INT,
    identificador  IN   INT,
    tipo           IN   INT,
    result         OUT  SYS_REFCURSOR
) AS
    variable1 SYS_REFCURSOR;
BEGIN
    variable1 := sch_descargas_app.getmovimientosagente(primerdia, ultimodia, idbusqueda, identificador, tipo,
                                       result);
    IF
        identificador = 1 AND tipo = 0
    THEN
        OPEN result FOR SELECT
                            *
                        FROM
                            variable1;
    END IF;
END;

Моя исходная хранимая процедура имела тот же лог c, это фрагмент:

CREATE OR REPLACE PROCEDURE getmovimientosagente (
    primerdia      IN   STRING,
    ultimodia      IN   STRING,
    idbusqueda     IN   INT,
    identificador  IN   INT,
    tipo           IN   INT,
    result         OUT  SYS_REFCURSOR
) AS
BEGIN
    IF
        identificador = 1 AND tipo = 0
    THEN
        OPEN result FOR SELECT DISTINCT
                            id_supervisoria,                      --0
                            nom_supervisoria,                     --1
                            id_agente,                            --2
                            nombre_agt,                           --3
                            f_pago_rbo,                           --4
                            num_poliza,                           --5
                            ramo,                                 --6
                            CASE

1 Ответ

0 голосов
/ 08 мая 2020

Я не думаю, что это будет возможно, если у рефкурсора нет предопределенного списка столбцов.

Более простая версия вашего тестового примера:

create or replace function demo_get_refcursor
    return sys_refcursor
as
    resultset sys_refcursor;
begin
    open resultset for
        select 'Hello' as col from dual;

    return resultset;
end;
/

create or replace procedure demo_use_resultset as
    first_resultset  sys_refcursor := demo_get_refcursor();
    second_resultset sys_refcursor;
begin
    open second_resultset for
        select * from first_resultset;

end;
/

Warning: Procedure created with compilation errors.

SQL> show errors
Errors for PROCEDURE DEMO_USE_RESULTSET:

LINE/COL   ERROR
---------- -----------------------------------------------------------
6/9        PL/SQL: SQL Statement ignored
6/23       PL/SQL: ORA-00942: table or view does not exist

variable1 не является таблица или представление, поэтому компиляция не выполняется с помощью ORA-00942: таблица или представление не существует .

Если вы написали табличную функцию, которая приняла рефкурсор в качестве входных данных, чтобы вернуть каждую строку, функция не знает, как определить запись, потому что она не определена до времени выполнения. (Или это так? Если список столбцов известен во время компиляции, это меняет ситуацию.)

Возможно, в 19 c вы могли бы динамически создавать и заполнять частную временную таблицу после синтаксического анализа курсора ref с помощью dbms_sql а затем запрос, но это будет настоящий проект, и я даже не уверен, что этот подход сработает.

...