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

时间:2014-10-08 17:06:34

标签: sql oracle function anonymous

我有一个像这样的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语句中编写所有函数。

我是甲骨文的新手,所以试图找到与谷物有关的习语和工作方式,而不是反对它。

1 个答案:

答案 0 :(得分:1)

FunctionType必须在全球范围内提供,才能在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;
/