Oracle存储过程将多个结果集返回给.net

时间:2012-07-19 21:02:01

标签: c# .net stored-procedures oracle11g

我编写了以下存储过程来将多个数据集返回到我的前端.Net应用程序

create or replace PROCEDURE GET_EMPLOYEE_INFO 
(
  EMP_NO IN VARCHAR2,
  E_RECORD_SET1 OUT SYS_REFCURSOR,
  E_RECORD_SET2 OUT SYS_REFCURSOR,
  E_RECORD_SET3 OUT SYS_REFCURSOR,
  E_RECORD_SET4 OUT SYS_REFCURSOR
) AS 
BEGIN
  OPEN E_RECORD_SET1 FOR
    SELECT * FROM EMP.EMPLOYEES;

  OPEN E_RECORD_SET2 FOR
    SELECT * FROM EMP.CITIES;

  OPEN E_RECORD_SET3 FOR
    SELECT * FROM EMP.STATES;

  OPEN E_RECORD_SET1 FOR
    SELECT * FROM EMP.DURATION;

每个查询都可以自己正确执行。当我执行存储过程时,它显示结果集,但我不相信所有数据都被提取。在底部,它仍然显示“RUNNING IDE CONNECTION”。

  • 程序是否循环?
  • SYS_REFCURSOR类型是否有限制?
  • 我需要关闭这些游标吗?

1 个答案:

答案 0 :(得分:0)

  • 我假设您的实际存储过程最后没有遗漏END。您发布的代码无法编译。
  • 我假设您的存储过程也使用EMP_NO参数执行某些操作。
  • 我认为尽管名称暗示它是一个数字,EMP_NO实际上是声明为字符串。

假设一切都是真的

  • 为什么您认为所有数据都没有被提取?
  • 句子“在底部,仍然说”指的是什么“它”?这是你的C#应用​​程序吗?你骑?还有别的吗?
  • 您发布的代码(假设添加了END以便编译)无法循环。您的代码只是打开游标,它不执行SQL语句,也不会生成任何数据。在客户端应用程序开始获取数据之前不会发生这种情况。
  • 虽然这是一个不寻常的设计,但是有一个返回四个SYS_REFCURSOR参数的过程在语法上是完全有效的。这不会影响从游标中获取的数据。
  • 是的,您的客户端应用程序需要在从这些游标中获取所有数据后关闭这些游标。