我有一个像这样的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
似乎如果我要在匿名块之外定义函数,那么它可以正常工作,但我试图避免这种情况,因为我想对实时数据库运行一些函数,而我宁愿不这样做在脚本运行时在live上创建和删除函数。如果我只在匿名函数中定义事物,那么我没有任何清理工作。
我正在尝试做的是编写一个函数,它将返回结果列表(无论采用何种形式,集合,光标,我都不挑剔),然后我可以将其传递给另一个函数进行进一步处理。这些函数可能是任意复杂的,我希望将来重用它们,因此编写函数而不是仅仅在一个SQL语句中编写所有函数。
我是甲骨文的新手,所以试图找到与谷物有关的习语和工作方式,而不是反对它。
答案 0 :(得分:1)
Function
和Type
必须在全球范围内提供,才能在SQL
中使用..
任何SELECT
实际上都会将上下文发送到SQL引擎并在那里执行查询。将结果发送回PL / SQL引擎..
仅针对PL/SQL
调用例如:没有SQL
的普通逻辑,您的方法将有效..
所以下面需要做..
将Type作为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;
/