Sql 如何将varchar列表传递给Oracle中的过程?

Sql 如何将varchar列表传递给Oracle中的过程?,sql,oracle,Sql,Oracle,我想将char列表作为一个参数传递给我的过程,我知道我可以使用varray。但是在将varray实例传递给我的过程之前,我必须声明它吗?我想要的是这样的东西: My_Procedure(['a','b','c','d','e']) 我可以将数组列表直接传递到过程中。 但我学到的是我必须这样做 create type my_type as varray of varchar; declare my_array My_Arraytype; begin my_array(1) :

我想将char列表作为一个参数传递给我的过程,我知道我可以使用varray。但是在将varray实例传递给我的过程之前,我必须声明它吗?我想要的是这样的东西:

My_Procedure(['a','b','c','d','e'])
我可以将数组列表直接传递到过程中。 但我学到的是我必须这样做

create type my_type as  varray of varchar;
declare 
    my_array My_Arraytype;
begin
    my_array(1) := 'a';
    my_array(2) := 'b';
    my_array(3) := 'c';
    my_array(4) := 'd';

    my_procedure(my_array)
end;
或者除了瓦雷还有别的办法吗

谢谢

创建一个收藏:

创建类型字符串\u列表是VARCHAR2(10)的表;
然后,您可以在实例化集合时填充该集合,而无需将其分配给变量:

BEGIN
  my_procedure( string_list( 'A', 'B', 'C', 'D' ) );
END;
/
创建一个集合:

创建类型字符串\u列表是VARCHAR2(10)的表;
然后,您可以在实例化集合时填充该集合,而无需将其分配给变量:

BEGIN
  my_procedure( string_list( 'A', 'B', 'C', 'D' ) );
END;
/

您可以按照MT0的建议创建自己的数据类型,但也可以使用Oracle提供的数据类型。例如,
sys.odcivarchar2list
varchar2
类型的预定义
varray

下面我将展示一个接受此数据类型作为参数的过程,然后我将展示如何调用它

create or replace procedure my_procedure(str_list sys.odcivarchar2list)
as
  l_str varchar2(30000);
begin
  for i in 1 .. str_list.count loop
    l_str := case when i > 1 then l_str || ' ' end || str_list(i);
  end loop;
  dbms_output.put_line(l_str);
end;
/



exec my_procedure(sys.odcivarchar2list('eenie','meenie','miney','mo'))


eenie meenie miney mo


PL/SQL procedure successfully completed.

但是,无论哪种方式,如果过程必须接收动态数量的参数,这意味着您必须使用集合类型(系统定义的或您自己的),并且在调用过程时必须使用构造函数(或在过程外部-创建集合类型的实例,填充它,并将其传递给过程;但仍然必须在某个地方调用构造函数)。您不能简单地给出单个字符串,并期望Oracle将其视为传递字符串集合。

您可以按照MT0的建议创建自己的数据类型,但也可以使用Oracle提供的数据类型。例如,
sys.odcivarchar2list
varchar2的预定义
varray
e> 类型

下面我将展示一个接受此数据类型作为参数的过程,然后我将展示如何调用它

create or replace procedure my_procedure(str_list sys.odcivarchar2list)
as
  l_str varchar2(30000);
begin
  for i in 1 .. str_list.count loop
    l_str := case when i > 1 then l_str || ' ' end || str_list(i);
  end loop;
  dbms_output.put_line(l_str);
end;
/



exec my_procedure(sys.odcivarchar2list('eenie','meenie','miney','mo'))


eenie meenie miney mo


PL/SQL procedure successfully completed.

但是,无论哪种方式,如果过程必须接收动态数量的参数,这意味着您必须使用集合类型(系统定义的或您自己的),并且在调用过程时必须使用构造函数(或在过程外部-创建集合类型的实例,填充它,并将其传递给过程;但仍然必须在某个地方调用构造函数)。您不能简单地给出单个字符串,并期望Oracle将其视为传递字符串集合。

请参阅此链接,类型也可以在包中声明。顺便说一下,您的varray缺少一个限制,例如,
将类型my_type创建为varchar2(1)的varray(42)
我很少发现它的用途,与嵌套表集合相比,varray的功能减少了(
类型指示符\u t作为varchar2(1)的表)
,因此我建议改用它们。声明您想要的集合有什么问题?您可以利用Oracle提供的一个包中声明的集合—dbms_sql包中有许多这样的集合。但是声明和使用您控制的集合类型通常更有意义。@WilliamRobertson-varray与嵌套表有很大的不同,从定义上看更是如此(与Oracle实现相比)。varray是有序的,嵌套表不是——并且利用了Oracle愚蠢的实现,它们公开了嵌套表的数组索引(谢天谢地,仅在PL/SQL中,不在普通SQL中),使嵌套表有序化是一种非常糟糕的做法。如果order在OP的问题中有意义,那么他应该使用varray,而不是嵌套表。请参阅此链接,类型也可以在包中声明。顺便说一下,您的varray缺少一个限制,例如,
create type my_type as varray(42)of varchar2(1)
我很少发现它的用途,与嵌套表集合相比,varray的功能减少了(
类型指示符\u t作为varchar2(1)的表)
,因此我建议改用它们。声明您想要的集合有什么问题?您可以利用Oracle提供的一个包中声明的集合—dbms_sql包中有许多这样的集合。但是声明和使用您控制的集合类型通常更有意义。@WilliamRobertson-varray与嵌套表有很大的不同,从定义上看更是如此(与Oracle实现相比)。varray是有序的,嵌套表不是——并且利用了Oracle愚蠢的实现,它们公开了嵌套表的数组索引(谢天谢地,仅在PL/SQL中,不在普通SQL中),使嵌套表有序是一种非常糟糕的做法。如果有序在OP的问题中有意义,那么他应该使用varray,而不是嵌套表。