首页 文章

将数组数组作为输入参数传递给Oracle过程

提问于
浏览
30

我正在尝试将一组( varchar )数据传递给Oracle过程 . Oracle过程可以从SQL * Plus调用,也可以从另一个PL / SQL过程调用,如下所示:

BEGIN
 pr_perform_task('1','2','3','4');
END;

pr_perform_task 将读取每个输入参数并执行任务 .

我不确定如何实现这一目标 . 我的第一个想法是使用 varray 类型的输入参数,但我得到 Error: PLS-00201: identifier 'VARRAY' must be declared 错误,当程序定义如下所示:

CREATE OR REPLACE PROCEDURE PR_DELETE_RECORD_VARRAY(P_ID VARRAY) IS

总而言之,如何将数据作为数组传递,让SP循环遍历每个参数并执行任务?

我使用Oracle 10gR2作为我的数据库 .

2 回答

  • 6

    这是一种方法:

    SQL> set serveroutput on
    SQL> CREATE OR REPLACE TYPE MyType AS VARRAY(200) OF VARCHAR2(50);
      2  /
    
    Type created
    
    SQL> CREATE OR REPLACE PROCEDURE testing (t_in MyType) IS
      2  BEGIN
      3    FOR i IN 1..t_in.count LOOP
      4      dbms_output.put_line(t_in(i));
      5    END LOOP;
      6  END;
      7  /
    
    Procedure created
    
    SQL> DECLARE
      2    v_t MyType;
      3  BEGIN
      4    v_t := MyType();
      5    v_t.EXTEND(10);
      6    v_t(1) := 'this is a test';
      7    v_t(2) := 'A second test line';
      8    testing(v_t);
      9  END;
     10  /
    
    this is a test
    A second test line
    

    为了扩展我对@ dcp的答案的评论,如果你想使用一个关联数组,这里是你如何实现那里提出的解决方案:

    SQL> CREATE OR REPLACE PACKAGE p IS
      2    TYPE p_type IS TABLE OF VARCHAR2(50) INDEX BY BINARY_INTEGER;
      3  
      4    PROCEDURE pp (inp p_type);
      5  END p;
      6  /
    
    Package created
    SQL> CREATE OR REPLACE PACKAGE BODY p IS
      2    PROCEDURE pp (inp p_type) IS
      3    BEGIN
      4      FOR i IN 1..inp.count LOOP
      5        dbms_output.put_line(inp(i));
      6      END LOOP;
      7    END pp;
      8  END p;
      9  /
    
    Package body created
    SQL> DECLARE
      2    v_t p.p_type;
      3  BEGIN
      4    v_t(1) := 'this is a test of p';
      5    v_t(2) := 'A second test line for p';
      6    p.pp(v_t);
      7  END;
      8  /
    
    this is a test of p
    A second test line for p
    
    PL/SQL procedure successfully completed
    
    SQL>
    

    这交易创建了一个独立的Oracle TYPE(不能是一个关联数组),需要定义一个所有人都可以看到的包,以便所有人都可以使用它所定义的TYPE .

  • 43

    如果参数的类型都相同(例如 varchar2 ),您可以使用这样的包来执行以下操作:

    CREATE OR REPLACE PACKAGE testuser.test_pkg IS
    
       TYPE assoc_array_varchar2_t IS TABLE OF VARCHAR2(4000) INDEX BY BINARY_INTEGER;
    
       PROCEDURE your_proc(p_parm IN assoc_array_varchar2_t);
    
    END test_pkg;
    
    CREATE OR REPLACE PACKAGE BODY testuser.test_pkg IS
    
       PROCEDURE your_proc(p_parm IN assoc_array_varchar2_t) AS
       BEGIN
          FOR i IN p_parm.first .. p_parm.last
          LOOP
             dbms_output.put_line(p_parm(i));
          END LOOP;
    
       END;
    
    END test_pkg;
    

    然后,要调用它,您需要设置数组并传递它:

    DECLARE
      l_array testuser.test_pkg.assoc_array_varchar2_t;
    BEGIN
      l_array(0) := 'hello';
      l_array(1) := 'there';  
    
      testuser.test_pkg.your_proc(l_array);
    END;
    /
    

相关问题