【问题标题】:Oracle equivalent of stored procedure that returns an inline table?Oracle 相当于返回内联表的存储过程?
【发布时间】:2015-07-08 13:28:12
【问题描述】:

T-SQL 中的示例(SQL Server - 取自 here):

CREATE PROC proc_authors
    @au_lname VARCHAR(40)
AS
    SELECT  
        au_id, au_fname, au_lname, city, state
    FROM authors
    WHERE au_lname = @au_lname
go

是否可以在 Oracle 中创建一个返回内联表的存储过程(无需声明类型 - 像上面那样)?如果不是,最接近的选择是什么?即声明内联类型,然后使用它。这个想法是最小化授予的数据库权限的数量。

请在您的答案中包含示例代码。

使用存储过程与函数的背后原因 - 我们有只能执行存储过程或原始查询的遗留软件。似乎只有其中的存储过程支持参数化执行,这就是我们所追求的。

【问题讨论】:

  • 你试过sys_refcursors
  • 了解遗留应用程序将如何调用过程和使用内联表可能会有所帮助。听起来您确实需要一个 sys_recursor out 参数,如果您的调用者可以将其作为结果集进行处理 - 就像简单查询的结果一样。但这并不完全清楚。
  • @mikron:不,请详细说明您的答案(带有示例代码)。从链接中不太清楚如何使用它。

标签: oracle stored-procedures plsql oracle11g inline


【解决方案1】:

用参考光标试试这个

PROCEDURE proc_get_tada(ip_user IN VARCHAR2, 
                        op_error_code OUT NUMBER, 
                        op_cursor OUT SYS_REFCURSOR,) AS

BEGIN

  OPEN op_cursor FOR
    SELECT * FROM your_table yt where yt.user = ip_user;

EXCEPTION
  WHEN OTHERS THEN
    op_error_code := -1;
END proc_get_tada;

您将从您的表中收集所有数据,您可以在 java 或调用程序中进行迭代。

【讨论】:

  • WHEN OTHERS 通常被认为是一个错误;你至少是在通知调用者某事出了问题,但你正在压缩任何细节或有用的信息。为什么要在这里捕获异常?
  • 嗨,亚历克斯,是的,我认为你是正确的,不需要在这里捕获异常;但我只是提到了理解 pl/sql 语法。
【解决方案2】:

也许你正在寻找这样的东西:

create table author
(
    au_id number,
    au_name varchar2(100)
);

insert into author (au_id, au_name) values(1, 'ME');

create or replace function getAuthor(auName varchar2)
return author%rowtype
is
    retval author%rowtype;
begin
    select *  into retval from author where au_name=auName;
    return retval;
end;

declare
 auth author%rowtype;
begin
    auth := getAuthor('ME');
    dbms_output.put_line(auth.au_id);
end;

【讨论】:

    猜你喜欢
    • 2016-04-09
    • 2019-06-03
    • 2012-01-04
    • 1970-01-01
    • 2011-01-31
    • 2014-08-31
    • 1970-01-01
    • 2012-03-27
    • 2023-04-06
    相关资源
    最近更新 更多