【问题标题】:Oracle SQL Create function or procedure returning a tableOracle SQL 创建函数或过程返回表
【发布时间】:2016-08-18 00:02:23
【问题描述】:

在 SQL Server 中,我可以只使用“RETURNS TABLE”,它就可以完成这项工作。但我在 Oracle SQL 中找不到如何做同样的事情

我有以下 SELECT 语句需要放入函数或过程中:

SELECT a.CodAcord, a.Descr
FROM FreqSoce f
LEFT JOIN Acord a ON a.CodAcord = f.CodAcord
WHERE f.codSoce = codSoce;

codSoce 是一个 INTEGER IN 参数,我需要返回 a.CodAcorda.Descr 作为我的函数/过程的结果。
有没有一种简单的方法可以做到这一点?无需处理临时变量和/或高级内容...

编辑:附加信息:
- 我需要返回a.CodAcorda.Descr,但是当我做了一些研究以了解如何使用SQL 函数或过程返回多个变量时,我发现只有返回一个TABLE 才有可能。如果有办法从函数或过程返回多个项目,请告诉我。
- 严格要求使用函数或过程。
- 我正在使用 SQL Developer。

【问题讨论】:

  • 对于给定的 codScoce,您需要返回 a.CodAcord 和 a.Descr,还是需要返回一个表格?我没有看到联系。另外:你需要一个过程,还是使用绑定变量就足够了?您使用什么来与 Oracle 交互:SQL*Plus?蟾蜍? SQL开发者?每个都有其允许您“输入”绑定变量并基于该变量生成输出的方法。请澄清一下,我们可以从那里拿走。
  • 提供额外信息,感谢您的帮助。

标签: sql oracle function stored-procedures plsql


【解决方案1】:

以下作为代码模板:

CREATE OR REPLACE PACKAGE tacord AS
    TYPE ttabAcord IS TABLE OF ACord%ROWTYPE;
END tacord;
/
show err

CREATE OR REPLACE PACKAGE BODY tacord AS
BEGIN
    NULL;
END tacord;
/
show err

CREATE OR REPLACE FUNCTION demo RETURN tacord.ttabAcord AS
    to_return   tacord.ttabAcord;
BEGIN
               SELECT a.*
    BULK COLLECT INTO to_return
                 FROM FreqSoce f
            LEFT JOIN Acord a ON a.CodAcord = f.CodAcord
                WHERE f.codSoce = codSoce
                    ;
    RETURN to_return;
END demo;
/
show err

要点:

  • %ROWTYPE代表数据库表记录的数据类型
  • BULK COLLECT INTO将完整的结果集插入到plsql数据结构中
  • 通过 plsql 收集方法可以对表内容进行迭代,即.FIRST.LAST.NEXT

【讨论】:

  • 代码可以编译,但是使用SQL Developer执行没有返回,有什么特殊的方法可以执行吗?
  • 那么常见的程序执行方式是什么?
  • 在上面的例子中,@collapsar 使用了FUNCTION。要在 PL/SQL 上下文中使用函数,您必须使用返回的值,例如将函数结果分配给某个变量。
【解决方案2】:

您可以使用流水线表函数将表作为函数的返回值。请看下面的例子:

-- Create synthetic case
CREATE TABLE Acord AS
SELECT rownum CodAcord, 'Description ' || rownum Descr
  FROM dual CONNECT BY LEVEL <= 5;

CREATE TABLE FreqSoce AS
SELECT rownum CodSoce, rownum CodAcord
  FROM dual CONNECT BY LEVEL <= 10;

-- Test dataset
SELECT a.CodAcord, a.Descr
  FROM FreqSoce f
  LEFT JOIN Acord a ON a.CodAcord = f.CodAcord
 WHERE f.CodSoce = 10;

-- Here begins actual code
-- Create an object type to hold each table row
CREATE OR REPLACE TYPE typ_acord AS OBJECT(
  CodAcord NUMBER,
  Descr    VARCHAR2(40)
);
/

-- Create a collection type to hold all result set rows
CREATE OR REPLACE TYPE tab_acord AS TABLE OF typ_acord;
/

-- Our function that returns a table
CREATE OR REPLACE FUNCTION getAcord(pCodSoce IN NUMBER)
RETURN tab_acord PIPELINED
AS
BEGIN
  FOR x IN (SELECT a.CodAcord, a.Descr
              FROM FreqSoce f
              LEFT JOIN Acord a ON a.CodAcord = f.CodAcord
             WHERE f.CodSoce = pCodSoce)
  LOOP
    PIPE ROW (typ_acord(x.CodAcord, x.Descr));
  END LOOP;
END;
/

-- Testing the function (please note the TABLE operator)
SELECT * FROM TABLE(getAcord(5));

【讨论】:

    猜你喜欢
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 2011-02-19
    • 2014-10-11
    • 2021-08-30
    • 2022-01-25
    • 1970-01-01
    相关资源
    最近更新 更多