简体   繁体   中英

Oracle PL/SQL: Table(function) error

I'm trying to apply the Table(function) functionality in a simple example. I get the following error when using the Table(function) method from a Procedure's SELECT, WHERE statement

Error: PLS-00231: function 'GET_NUM' may not be used in SQL

Any insight on what is wrong in this code.

CREATE OR REPLACE PACKAGE BODY TEST IS
 --COLLECTION DELCARATION
 TYPE num_list IS TABLE OF NUMBER;
 TYPE str_list IS TABLE OF NUMBER;

 FUNCTION get_num(id IN NUMBER) 
   RETURN num_list AS
   num num_list;   
 BEGIN
    WITH xTable AS 
   (  
        SELECT 1 ID, 111 NUM, 'ABC 111'  DESCP FROM DUAL
        UNION ALL
        SELECT 2 ID, 222 NUM, 'ABC 222'  DESCP FROM DUAL
        UNION ALL
        SELECT 1 ID, 333 NUM, 'ABC 333'  DESCP FROM DUAL                  
   )

   SELECT x.NUM
     BULK COLLECT INTO num
     FROM xTable x
    WHERE x.ID = id;

    RETURN num;

 END;

 PROCEDURE insert_object_id_control AS
   i NUMBER:= 1;
   str str_list;
 BEGIN
   WITH yTable AS 
   (  
        SELECT 1 ID, 111 NUM, 'ABC 111'  DESCP FROM DUAL
        UNION ALL
        SELECT 2 ID, 222 NUM, 'ABC 222'  DESCP FROM DUAL
        UNION ALL
        SELECT 3 ID, 333 NUM, 'ABC 333'  DESCP FROM DUAL                                   
   )

   SELECT y.DESCP 
     INTO str /*BULL COLLECT INTO GET'S SAME RESULT*/
     FROM yTable y 
    WHERE y.NUM IN (SELECT * FROM TABLE(get_num(i)));

  END insert_object_id_control;    
END TEST;

Your code has some compilation issues in the procedure insert_object_id_control ; given that this procedure is not meaningful for the test, I've removed it.

If you want to use a type as a result of a function, and use this function in a query, you need a stored type.

For example:

CREATE TYPE num_list IS TABLE OF NUMBER;

CREATE OR REPLACE PACKAGE TEST IS
    FUNCTION get_num(id IN NUMBER)
        RETURN num_list;
END TEST;

CREATE OR REPLACE PACKAGE BODY TEST IS
    FUNCTION get_num(id IN NUMBER)
        RETURN num_list AS
        num                                     num_list;
    BEGIN
        WITH xTable AS
                 (SELECT 1 ID, 111 NUM, 'ABC 111' DESCP FROM DUAL UNION ALL
                  SELECT 2 ID, 222 NUM, 'ABC 222' DESCP FROM DUAL UNION ALL
                  SELECT 1 ID, 333 NUM, 'ABC 333' DESCP FROM DUAL)
        SELECT x.NUM
          BULK COLLECT INTO num
          FROM xTable x
         WHERE x.ID = id;

        RETURN num;
    END;
END TEST;

Whit these objects, this query will work:

SQL> SELECT test.get_num(1) FROM DUAL;

TEST.GET_NUM(1)
------------------------------------------
NUM_LIST(111, 222, 333)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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