Oracle PL / SQL:函数游标

恩格隆(Dev Ngron)

我收到错误消息:

PLS-00231:函数'GET_NUM'不能在SQL中使用

当执行以下代码时;

CREATE OR REPLACE PACKAGE BODY TESTJNSABC IS

  -- FUNCTION IMPLEMENTATIONS
  FUNCTION get_num(num IN NUMBER) 
    RETURN SYS_REFCURSOR AS
    my_cursor SYS_REFCURSOR;
  BEGIN
    --
    OPEN my_cursor FOR 
    WITH ntable AS (
         SELECT 1 ID, 111 AGT, 'ABC' DESCRIP FROM DUAL
         UNION ALL
         SELECT 2 ID, 222 AGT, 'ABC' DESCRIP FROM DUAL
         UNION ALL
         SELECT 1 ID, 333 AGT, 'ABC' DESCRIP FROM DUAL
    )
    SELECT AGT FROM ntable WHERE ID = num;
    RETURN my_cursor;

  END;

  -- PROCEDURE IMPLEMENTATIONS 
  PROCEDURE testingabc AS

    BEGIN
      WITH xtable AS (
         SELECT 111 AGT, 'A' DESCRIP FROM DUAL
         UNION ALL
         SELECT 222 AGT, 'B' DESCRIP FROM DUAL
         UNION ALL
         SELECT 333 AGT, 'C' DESCRIP FROM DUAL
     )
      SELECT DESCRIP FROM xtable WHERE COD_AGT IN get_num(1);


    END testingabc;

END TESTJNSABC;

即使我调用该函数,TESTJNSABC.get_num(1)也仍然会遇到相同的错误。 - 更新。因此,在现实生活中,我想从WHERE子句中调用Function;该函数应返回一组NUMBER值(这就是我使用IN子句的原因)。

威廉·罗伯逊

in () 需要一个子查询或一个逗号分隔的值列表,因此,不能,您不能替换返回集合的函数。

假设该函数在SQL查询的范围内(它是独立函数或在包规范中声明),则可以在table()构造中使用它(这需要一个表函数,即它需要返回一个集合,而不是游标):

where somecol in (select column_value from table(get_num(1)) )

(或等效的内部联接等)

通过livesql.oracle.com/apex/livesql/file/content_EF2M0F1LV9LTP6PEII3BDFKAI.html进行演示

编辑:我刚刚注意到问题中的示例尝试使用ref游标。请注意,该table()运算符适用于集合,而不适用于引用游标。因此,该函数必须返回集合类型(嵌套表或varray)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章