首页 > 解决方案 > 调用另一个存储过程并设置为局部变量并使用类似表

问题描述

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

标签: oracleplsql

解决方案


我认为这是不可能的,除非 refcursor 有一个预定义的列列表。

更简单的测试用例版本:

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: table or view does not exist

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

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


推荐阅读