Передача массива данных как входной параметр к процедуре Oracle

Я пытаюсь передать массив (varchar) данные в процедуру Oracle. Процедуру Oracle или назвали бы от SQL*Plus или из другой МН процедуры / процедуры 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 в качестве моей базы данных.

31
задан Sathyajith Bhat 21 May 2010 в 21:05
поделиться

2 ответа

Это один из способов сделать это:

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 (который не может быть ассоциативным массивом) с требованием определения пакета, который может быть виден всем, чтобы ТИП, который он там определяет, мог использоваться всеми.

43
ответ дан 27 November 2019 в 22:25
поделиться

Если типы всех параметров одинаковы (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;
/
6
ответ дан 27 November 2019 в 22:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: