我想调用一个先前创建的存储过程,并将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
我认为这不可能,除非反射器具有预定义的列列表。
测试用例的简单版本:
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游标后查询并动态创建并填充一个私有临时表,但这将是一个很大的项目,我什至不确定这种方法是否可行。