【问题标题】:how to call function from package如何从包中调用函数
【发布时间】:2021-11-08 17:09:33
【问题描述】:

如何通过创建自己的包中使用的相同集合类型的集合来调用包中的函数?我们可以使用我们自己创建的集合来调用包中的函数吗?调用函数时出错。

    create or replace package pk
    is
     type e_list is table of emp%rowtype index by pls_integer;
     function pro1 return e_list;
    end;
    
    create or replace package body pk
    is
    x number;
    function pro1 return e_list
    is
    v_emp e_list;
    begin
    for x in 100..110 loop
    select * into v_emp(x) from employees where employee_id=x;
    end loop;
    return v_emp;
    end;
    end;

调用函数检查下面的代码。

    declare
    type p_list is table of emp%rowtype index by pls_integer;
    r_cur p_list;
    x number;
    begin
    r_cur:=pk.pro1;
    x:=r_cur.first;
    for i in 1..10 loop
    dbms_output.put_line(r_cur(x).salary);
    x:=r_cur.next(x);
    end loop;
    end;

【问题讨论】:

    标签: sql oracle plsql package


    【解决方案1】:

    如果您要在包之外使用该类型,请在 SQL 级别创建它。像这样的:

    样本数据:

    SQL> SELECT * FROM employees;
    
    EMPLOYEE_ID ENAME          SALARY
    ----------- ---------- ----------
            100 SMITH             800
            101 ALLEN            1600
            102 WARD             1250
            103 JONES            2975
    

    类型:

    SQL> CREATE OR REPLACE TYPE e_list_t IS OBJECT
      2  (
      3     employee_id NUMBER,
      4     ename VARCHAR2 (20),
      5     salary NUMBER
      6  );
      7  /
    
    Type created.
    
    SQL> CREATE OR REPLACE TYPE e_list IS TABLE OF e_list_t;
      2  /
    
    Type created.
    

    包规范及其正文:

    SQL> CREATE OR REPLACE PACKAGE pk
      2  IS
      3     FUNCTION pro1
      4        RETURN e_list;
      5  END;
      6  /
    
    Package created.
    
    SQL> CREATE OR REPLACE PACKAGE BODY pk
      2  IS
      3     FUNCTION pro1
      4        RETURN e_list
      5     IS
      6        v_emp  e_list := e_list ();
      7     BEGIN
      8        SELECT e_list_t (employee_id, ename, salary)
      9          BULK COLLECT INTO v_emp
     10          FROM employees;
     11
     12        RETURN v_emp;
     13     END;
     14  END;
     15  /
    
    Package body created.
    

    测试:

    SQL> DECLARE
      2     r_cur  e_list;
      3  BEGIN
      4     r_cur := pk.pro1;
      5
      6     FOR x IN 1 .. r_cur.LAST
      7     LOOP
      8        DBMS_OUTPUT.put_line (r_cur (x).ename || ': ' || r_cur (x).salary);
      9     END LOOP;
     10  END;
     11  /
    SMITH: 800
    ALLEN: 1600
    WARD: 1250
    JONES: 2975
    
    PL/SQL procedure successfully completed.
    
    SQL>
    

    【讨论】:

    • 实际上它也适用于包规范中声明的类型!
    • 谢谢兄弟,我知道这段代码,如果我在调用函数时使用相同的包关联数组,即使我上面提到的代码也可以工作,但我只想知道如果我创建我的在调用函数时拥有具有相同表名的关联数组。那我可以用还是不用?
    • 这取决于您创建集合的方式/位置(关联数组)。如果您在模式级别创建它,那么它始终可用,如果在包级别创建,那么它可以通过引用 package_name.type_name (受适当的授权)使用。如果在过程/函数或匿名块中本地创建,则它不可用。;即使它具有完全相同的名称和定义,它仍然是不同的。
    猜你喜欢
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-09
    • 2018-02-09
    • 2021-10-15
    • 1970-01-01
    相关资源
    最近更新 更多