【问题标题】:Oracle stored Procedure to return multiple resultsets to .netOracle存储过程将多个结果集返回到.net
【发布时间】:2012-07-19 03:11:41
【问题描述】:

我编写了以下存储过程来将多个数据集返回到我的前端 .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 类型有限制吗?
  • 我需要关闭这些游标吗?

【问题讨论】:

    标签: c# .net stored-procedures oracle11g


    【解决方案1】:
    • 我假设您的实际存储过程最后没有丢失END。您发布的代码不会编译。
    • 我假设您的存储过程也在使用EMP_NO 参数执行某些操作。
    • 我假设尽管名称暗示它是一个数字,但 EMP_NO 实际上被声明为一个字符串。

    假设一切都是真的

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

    【讨论】:

    • 嗨,贾斯汀,感谢您的回复,这是我对您问题的回答。首先,emp_no 将用于 where 子句,我将在几天内实施。 emp_no 是一个 varchar,是的,我在存储过程的末尾结束了。 “它”是指当我使用 oracle sql developer 执行存储过程时打开的输出日志对话框。您还建议这是一个不寻常的设计,您能否建议一个更强大的设计,因为我是 oracle 的新手,我是否需要在 oracle 中使用游标从存储的过程中返回记录集?还有我将如何关闭游标?
    • 贾斯汀感谢您的回复,这是我对您问题的回答。首先,emp_no 将用于 where 子句,我将在几天内实施。 emp_no 是一个 varchar,是的,我在存储过程的末尾结束了。 “它”是指当我使用 oracle sql developer 执行存储过程时打开的输出日志对话框。您还建议这是一个不寻常的设计,您能否建议一个更健壮的设计,因为我是 oracle 的新手,我是否需要在 oracle 中使用游标从存储的过程中返回记录集?还有我将如何关闭游标?
    • @JustinRusso - 通常,您要么有单独的过程,要么返回一个 SYS_REFCURSOR,它具有将四个相关表连接在一起的结果。您不想尝试在客户端应用程序中滚动您自己的 pesudo-join 逻辑。如果您只是从 SQL Developer 执行此存储过程(在这种情况下,c# 和 .net 标记似乎不适用)SQL Developer 将关闭游标。当您编写 C# 代码来调用此过程时,您的 C# 代码将需要关闭游标。
    • 您能否为我的代码示例提供一个关于如何关闭过程中游标的简要语法?
    • @JustinRusso - 您不会在过程中关闭游标。如果这样做,客户端应用程序将无法从它们获取任何数据。当您编写 C# 代码来调用此过程时,您的 C# 代码将需要关闭游标。
    猜你喜欢
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多