首页 > 解决方案 > Oracle 从游标中读取并返回数据

问题描述

我正在尝试在 Oracle 中创建一个存储过程,该过程具有一个输入参数和一个输出变量,如果有结果,则将数据集返回到我的 .Net 应用程序。主要问题是我无法更改程序的签名,需要执行 if 条件来验证是否存在记录。我一直在努力的主要问题是游标(执行和返回信息),并计算选择的结果。

这是我正在尝试检索数据的示例。

CREATE PROCEDURE SP_Testing (v_input IN VARCHAR2(50), v_OutID NUMBER(1))
AS

   TYPE v_record_botoes IS RECORD (
        v_dummy_col1 VARCHAR2(50),
        v_dummy_col2 VARCHAR2(250)
    );
   TYPE table_botoes IS TABLE OF v_record_botoes;
   tt_botoes table_botoes;

   v_ref_cursor SYS_REFCURSOR;

   CURSOR v_cursor IS
     (SELECT dt.v_dummy_col1,
           dt.v_dummy_col2
    FROM dummy_table dt
         WHERE v_dummy_col3 = v_input);

   v_check NUMBER;

BEGIN
   tt_botoes := table_botoes();
   v_check := 0;

   FOR v_row IN v_cursor
   LOOP
      tt_botoes.extend;
      tt_botoes(tt_botoes.COUNT) := v_row;
   END LOOP;

   v_check := tt_botoes.COUNT;

   -- condition that need to know the nr of records of the select
   IF v_check = 0 THEN

      v_OutID := 0;

   ELSE

      v_OutID := 1;

      OPEN v_ref_cursor FOR
      SELECT *
         FROM tt_botoes; -- also tryed "FROM TABLE (tt_botoes)" and "FROM TABLE (cast(tt_botoes AS table_botoes))"

      -- return dataset to .net application
      DBMS_SQL.RETURN_RESULT(v_ref_cursor)

   END IF;

END;

已经尝试将v_cursor转换为sys_refcursor以由DBMS_SQL 包输出,但没有得到任何结果。我还尝试创建一个临时表来保存信息,但随后出现了并发问题。

知道我做错了什么,或者任何其他可能的解决方案来解决这个问题?

提前致谢

标签: oraclesys-refcursororacle19c

解决方案


完全未经测试,因为我没有测试它的环境,但我会以完全不同的方式构建它,见下文(我假设规范中的遗漏只是一个错字)

CREATE PROCEDURE SP_Testing (v_input IN VARCHAR2(50), v_OutID **out** NUMBER(1))
AS

   v_ref_cursor SYS_REFCURSOR;
   v_check NUMBER;

BEGIN

   select count(1) 
   into v_check
   from dummy_table dt 
   WHERE v_dummy_col3 = v_input


   -- condition that need to know the nr of records of the select
   IF v_check = 0 THEN
      v_OutID := 0;
   ELSE
      v_OutID := 1;

      OPEN v_ref_cursor FOR
      SELECT dt.v_dummy_col1,
             dt.v_dummy_col2
      FROM dummy_table dt
      WHERE v_dummy_col3 = v_input

      -- return dataset to .net application
      DBMS_SQL.RETURN_RESULT(v_ref_cursor)
   END IF;
END;

推荐阅读