programing

데이터 배열을 입력 매개 변수로 오라클 프로시저에 전달

elseif 2023. 4. 4. 21:06

데이터 배열을 입력 매개 변수로 오라클 프로시저에 전달

(의 배열을 통과하려고 합니다.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를 데이터베이스로 사용하고 있습니다.

다음 방법 중 하나가 있습니다.

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을 모든 사람이 사용할 수 있도록 패키지의 정의가 필요합니다.

파라미터의 타입이 모두 같은 경우(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;
/

언급URL : https://stackoverflow.com/questions/2885575/passing-an-array-of-data-as-an-input-parameter-to-an-oracle-procedure