데이터 배열을 입력 매개 변수로 오라클 프로시저에 전달
(의 배열을 통과하려고 합니다.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
'programing' 카테고리의 다른 글
Typescript에서 구성원을 참조할 때 !( 느낌표/bang) 연산자는 무엇입니까? (0) | 2023.04.04 |
---|---|
WordPress 플러그인:어떻게 하면 '긴밀 커플링'을 피할 수 있을까요? (0) | 2023.04.04 |
Eclipse의 스프링 부트 프로젝트에서 Maven과 함께 "메인 클래스를 찾을 수 없음" (0) | 2023.04.04 |
봄콩에 모키토 모크 주입 (0) | 2023.04.04 |
where 절에서 'case expression column' 사용 (0) | 2023.04.04 |