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

问题描述 投票:0回答:3

我正在尝试将一组 (

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 作为我的数据库。

oracle stored-procedures plsql
3个回答
54
投票

这是一种方法:

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。


8
投票

如果参数的类型全部相同(例如

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;
/

0
投票

您可能喜欢:

  1. 创建表类型。用户执行以下命令

    CREATE OR REPLACE TYPE StringListType AS TABLE OF VARCHAR2(1024);
    
  2. 创建过程:

    CREATE OR REPLACE PROCEDURE PR_DELETE_RECORD_VARRAY(
        pList  IN StringListType
    ) AS
    BEGIN
    
        FOR i IN 1..pList.COUNT LOOP
            DBMS_OUTPUT.PUT_LINE('item: ' || pList(i));
          /*
           write logic here
         */
        END LOOP;
    END;
    
  3. 调用程序:

    DECLARE
        vList StringListType := StringListType('1', '2', '3');
    
    BEGIN
        PR_DELETE_RECORD_VARRAY(pList => vList);
    END;
    /
    
© www.soinside.com 2019 - 2024. All rights reserved.