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

前端之家收集整理的这篇文章主要介绍了将数据数组作为输入参数传递给Oracle过程前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图传递一个(varchar)数据到Oracle过程的数组。 Oracle过程将从sql * Plus或其他PL / sql过程中调用,如下所示:
BEGIN
 pr_perform_task('1','2','3','4');
END;

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

我不知道如何我可以实现这一点。我第一个想法是使用类型varray的输入参数,但我得到错误:PLS-00201:标识符’VARRAY’必须声明错误,当过程定义看起来像这样:

创建或更换过程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可以被所有人使用。

猜你在找的Oracle相关文章