Oracle - pl sql 从 SYS_REFCURSOR 中选择

Posted

技术标签:

【中文标题】Oracle - pl sql 从 SYS_REFCURSOR 中选择【英文标题】:Oracle - pl sql selecting from SYS_REFCURSOR 【发布时间】:2010-04-04 19:44:11 【问题描述】:

我有一个函数,它返回一个 SYS_REFCURSOR,它有单行但多列。我想要做的是能够使用 SYS_REFCURSOR 中返回的列值进行嵌套子查询的 SQL 查询。诸如类型等的替代想法将不胜感激。下面的代码是我即时编写的,尚未经过语法验证。

--Oracle function
CREATE DummyFunction(dummyValue AS NUMBER) RETURN SYS_REFCURSOR
IS
  RETURN_DATA SYS_REFCURSOR;
BEGIN
  OPEN RETURN_DATA
  SELECT
    TO_CHAR(dummyValue) || 'A' AS ColumnA
    ,TO_CHAR(dummyValue) || 'B' AS ColumnB
  FROM
    DUAL;

  RETURN RETURN_DATA;
END;

--sample query with sub-queries; does not work
SELECT
  SELECT ColumnA FROM DummyFunction(1) FROM DUAL AS ColumnA
  ,SELECT ColumnB FROM DummyFunction(1) FROM DUAL AS ColumnB
FROM
  DUAL;

【问题讨论】:

相关:***.com/questions/2059299/… 【参考方案1】:

SYS_REFCURSOR 无法用于预期用途 - 您需要创建 Oracle TYPE:

CREATE TYPE your_type IS OBJECT (
  ColumnA VARCHAR2(100),
  ColumnB VARCHAR2(100)
)

更新你的函数:

CREATE DummyFunction(dummyValue AS NUMBER) 
RETURN your_type
IS

BEGIN

  INSERT INTO your_type
  SELECT TO_CHAR(dummyValue) || 'A' AS ColumnA,
         TO_CHAR(dummyValue) || 'B' AS ColumnB
    FROM DUAL;

  RETURN your_type;

END;

那么你可以使用:

SELECT (SELECT ColumnA FROM table(DummyFunction(1))) AS ColumnA, 
       (SELECT ColumnB FROM table(DummyFunction(1))) AS ColumnB
  FROM DUAL

这个例子过于复杂——你只需要使用:

SELECT x.columna,
       x.columnb
  FROM table(DummyFunction(1)) x

【讨论】:

以上是关于Oracle - pl sql 从 SYS_REFCURSOR 中选择的主要内容,如果未能解决你的问题,请参考以下文章

oracle:使用 PL/sql 过程从另一个模式填充表

从 PL/SQL 调用另一个 Oracle 数据库中的过程

上新 | 《Oracle数据库管理从入门到精通》《Oracle PL/SQL从入门到精通 》

Oracle PL/SQL语句基础学习笔记(上)

使用 PL/SQL 将数据从 file.txt 导入 Oracle SQL 表

Oracle (pl-sql) - 如何从文本中提取特定数据到对象类型变量中?