【问题标题】:Are packages the only way to return data from an Oracle db?包是从 Oracle 数据库返回数据的唯一方法吗?
【发布时间】:2011-10-07 04:15:49
【问题描述】:

到目前为止,我主要使用 SQL Server,现在我正在转移到 Oracle 进行一个新项目。

我正在尝试创建一个将数据返回到 .net 应用程序的过程。我让它工作的唯一方法是使用这样的包:

CREATE OR REPLACE PACKAGE GetAllDepartments AS
TYPE T_CURSOR IS REF CURSOR;
PROCEDURE p_GetAllDepartments
(
    cur_Result OUT T_CURSOR
);
END GetAllDepartments;

CREATE OR REPLACE PACKAGE BODY GetAllDepartments AS
PROCEDURE p_GetAllDepartments
(
    cur_Result OUT T_CURSOR
)
IS
BEGIN
    OPEN cur_Result FOR
    SELECT * FROM DEPARTMENTS;

END p_GetAllDepartments;
END GetAllDepartments;

这是使用 Oracle 的唯一方法吗?我不能只创建 proc 并直接调用它吗?谢谢

【问题讨论】:

  • 绝对有可能只有一个没有包的存储过程并从 .net 应用程序调用它。当您尝试执行这样的过程或不返回任何结果时,您是否得到了执行?

标签: sql-server oracle stored-procedures ado.net


【解决方案1】:

假设您拥有受支持的 Oracle 版本,您应该能够执行类似的操作

CREATE OR REPLACE PROCEDURE get_all_departments( p_result OUT SYS_REFCURSOR )
AS
BEGIN
  OPEN p_result
   FOR SELECT *
         FROM departments;
END get_all_departments;

也就是说,从组织的角度来看,您通常最好使用包来收集执行相关事情的过程。例如,在您的情况下,拥有一个包含处理部门的所有程序(即create_departmentdelete_department 等)的包通常是有意义的。

从一般风格的角度来看,在 Oracle 中更常见的是创建一个视图来实现您将放入存储过程中的任何逻辑并查询该视图,而不是创建一个只执行查询的存储过程。

【讨论】:

  • 它起作用了,我缺少的是 SYS_REFCURSOR 数据类型,你知道为什么 REFCURSOR 在这种情况下不起作用吗?.. 似乎我可以在调用这个 proc 时使用 refcursor 参数,很奇怪..
  • @Pablote - “REFCURSOR 不起作用”是什么意思?您当然可以创建一个定义弱类型 REF CURSOR 的包,然后创建一个使用该弱类型 REF CURSOR 作为输出参数的独立过程。您不能在过程中定义自己的弱类型 REF CURSOR,然后将其用作 OUT 参数,因为弱类型游标的声明将在 OUT 参数的声明之前,并且在程序。使用包只允许您在过程之前声明游标。
  • 我可以使用以下代码在您的回复中调用 proc:[variable mycur REFCURSOR;执行 get_all_departments(:mycur); print mycur;] ...但我不能在 proc 声明中使用相同的 REFCURSOR,多亏了你,我才发现 SYS_REFCURSOR。你对类型声明的看法是我最初怀疑是否需要带有 OUT 的 procs 包光标参数,谢谢
  • @Pablote - 啊,好的。 variable mycur REFCURSOR 是 SQLPlus 语法——它创建一个 SQLPlus 替换变量。它不是 PL/SQL 语法,因此不能在 PL/SQL 块中使用。它仅限于 SQLPlus 以及任何碰巧实现 SQLPlus 语法以在客户端环境中声明变量的客户端工具。
【解决方案2】:

你可以在没有包的情况下做到这一点,例如通过创建一个返回结果集的函数。

这些函数可以像表格一样使用,例如:SELECT * FROM my_function()

这对于流水线函数特别有效,因为结果不会在服务器上缓冲,而是逐行发送到客户端:

http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14251/adfns_packages.htm#i1008519

但基本技术仍然相同,即您必须定义一个用于函数返回类型的类型。您不能让它像在 PostgreSQL 或 SQL Server 中那样返回“匿名”结果集。

【讨论】:

    猜你喜欢
    • 2016-09-01
    • 1970-01-01
    • 2019-10-03
    • 2021-11-11
    • 1970-01-01
    • 2015-03-14
    • 2018-03-02
    • 2019-03-29
    • 1970-01-01
    相关资源
    最近更新 更多