调用另一个存储过程并设置为局部变量并使用类似表的形式

问题描述 投票:0回答:1

我想调用一个先前创建的存储过程,并将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;

我的原始存储过程具有相同的逻辑,这是一个片段:

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
oracle plsql
1个回答
0
投票

我认为这不可能,除非反射器具有预定义的列列表。

测试用例的简单版本:

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:表或视图不存在

如果编写了一个表函数,该函数接受了反射器作为输入以返回每一行,则该函数将不知道如何定义记录,因为直到运行时才定义该记录。 (或者是?如果在编译时知道列列表,那将改变情况。)

也许在19c中,您可以在用dbms_sql解析ref游标后查询并动态创建并填充一个私有临时表,但这将是一个很大的项目,我什至不确定这种方法是否可行。

© www.soinside.com 2019 - 2024. All rights reserved.