【问题标题】:How do I pass a list of varchar to procedure in Oracle?如何将 varchar 列表传递给 Oracle 中的过程?
【发布时间】:2021-02-20 03:22:15
【问题描述】:

我想将一个 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;

或者除了varray还有什么办法吗?

谢谢

【问题讨论】:

  • 该类型也可以在包中声明。
  • 顺便说一句,您的 varray 缺少限制,例如create type my_type as varray(42) of varchar2(1);我很少发现它的用途,与嵌套表集合相比,可变数组的功能减少了(type indicator_t as table of varchar2(1),所以我建议使用它们。
  • 声明你想要的集合有什么问题?您可以利用在 Oracle 提供的包之一中声明的集合—— dbms_sql 包有很多。 docs.oracle.com/cd/B28359_01/appdev.111/b28419/… 但通常声明和使用您控制的集合类型更有意义。
  • @WilliamRobertson - 可变数组与嵌套表完全不同,根据定义(与 Oracle 实现相比)更是如此。可变数组是有序的,嵌套表不是 - 并且利用 Oracle 的愚蠢实现,它们 公开 嵌套表的数组索引(谢天谢地,仅在 PL/SQL 中,而不是在普通 SQL 中),使嵌套表 ordered 是一种非常糟糕的做法。如果顺序在 OP 的问题中有意义,那么他应该使用可变数组,而不是嵌套表。

标签: sql oracle


【解决方案1】:

您可以按照 MT0 的建议创建自己的数据类型,但您也可以使用 Oracle 已经提供的数据类型。例如,sys.odcivarchar2listvarchar2 类型的预定义 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 将其视为传递字符串集合。

【讨论】:

    【解决方案2】:

    创建一个集合:

    CREATE TYPE string_list IS TABLE OF VARCHAR2(10);
    

    然后您可以在实例化集合时填充集合,而无需将其分配给变量:

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

    【讨论】:

      猜你喜欢
      • 2017-12-01
      • 1970-01-01
      • 2016-09-06
      • 1970-01-01
      • 2011-10-23
      • 2010-12-08
      • 2011-07-09
      • 1970-01-01
      相关资源
      最近更新 更多