[英]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的新手,因此尝试查找与主题相关的习语和工作方式,而不是与之相反。
Function
和Type
必须在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.