繁体   English   中英

从匿名块中定义的Oracle函数返回表

[英]Returning a Table from an Oracle function, defined within an anonymous block

我有这样的DECLARE块

DECLARE
  TYPE WordList IS TABLE OF VARCHAR2(50);

  FUNCTION getWordList
    RETURN WordList
  IS
    words WordList := WordList();  
  BEGIN
    words.EXTEND;
    words(1) := 'aardvark';
    RETURN words;
  END;

BEGIN
  SELECT * FROM TABLE(getWordList);

END;
/

当我尝试从sqlplus运行此程序时,我得到了...

ERROR at line 15:
ORA-06550: line 15, column 23:
PLS-00231: function 'GETWORDLIST' may not be used in SQL
ORA-06550: line 15, column 23:
PL/SQL: ORA-00904: "GETWORDLIST": invalid identifier
ORA-06550: line 15, column 3:
PL/SQL: SQL Statement ignored

似乎,如果我要在匿名块之外定义函数,则可以正常工作,但是我想避免这种情况,因为我想对实时数据库运行一些函数,并且我不想创建和在脚本运行时实时删除功能。 如果仅在匿名函数中定义内容,则无需进行任何清理。

我想做的是编写一个函数,该函数将返回结果列表(以任何形式,集合,游标,我并不挑剔),然后可以将其传递给另一个函数进行进一步处理。 这些函数可能会非常复杂,我将来会想重用它们,因此编写函数而不是仅在单个SQL语句中编写所有函数。

我是Oracle的新手,因此尝试查找与主题相关的习语和工作方式,而不是与之相反。

FunctionType必须在Oracle中全局可用,才能在SQL

任何SELECT实际上都会将上下文发送到SQL引擎,并在那里执行查询。 将结果发送回PL / SQL引擎。

对于仅PL/SQL调用, 例如:不带SQL的普通逻辑,您的方法将起作用。

因此,需要完成以下工作。

将类型创建为SQL对象。

CREATE TYPE WordList IS TABLE OF VARCHAR2(50);

声明功能

  CREATE FUNCTION getWordList
    RETURN WordList
  IS
    words WordList := WordList();  
  BEGIN
    words.EXTEND;
    words(1) := 'aardvark';
    RETURN words;
  END;
  /

然后打电话

BEGIN
  SELECT * INTO SOMERECORD FROM TABLE(getWordList);
END;
/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM