Sql 如何将varchar列表传递给Oracle中的过程?
我想将char列表作为一个参数传递给我的过程,我知道我可以使用varray。但是在将varray实例传递给我的过程之前,我必须声明它吗?我想要的是这样的东西: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) :
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,而不是嵌套表。