如何使用PL / SQL数组或集合作为参数,然后按索引将它们联接在一起

代码新手

我正在尝试创建一个非常简单的过程来创建一个或多个帐户。为了做到这一点,我希望对本程序进行的Call的实现尽可能简单。Procedure后面的代码可以是复杂的也可以是简单的,但这并不是我在这里完全关心的,因为我首先是从将要调用create_account()Proc的用户的角度来处理这个问题的。

创建帐户的简单调用-正如您在我提供的代码中看到的,存在零声明...在进行调用时,我没有初始化任何内容。这对于最大限度地简化此过程的使用非常重要。

BEGIN    
  create_account(p_entity_id      => 550005
               , p_sub_id         => 100051
               , v_contacts_fname => sys.odcivarchar2list('dan','bob')
               , v_contacts_lname => sys.odcivarchar2list('anderson','bebop')
  );       
END;

基本上,我正在寻找一种最简单的方法,允许用户通过数组在此调用中键入一个简单的逗号分隔值列表,该数组随后将被解析以便在accounts表中插入。

问题:由于我当前正在研究程序的两个集合,因此如何按索引将条目绑定在一起?集合1的索引1应该绑定到集合2的索引1,依此类推。在create_account()过程中包含的PL / SQL中建立此连接的最佳方法是什么?

理想情况下,我希望能够执行与C#中类似的操作,即无需声明该对象并将其发送到Procedure或某种形式的multi中,而只需新建一个LIST()对象即可。列数组,但是我不能RECORD直接Type发送到Procedure,这就是为什么我认为使用Oracle提供的sys.odcivarchar2list集合可以工作的原因。这种方法的确允许我基于基本的逗号分隔值创建集合,但是它们仅是单列集合,因此对于这里我关心的两个参数,我必须使用两个集合。最终,我想按比例放大参数,以包括account_type,phone_numbers等...,但是我首先需要发现基于索引将这些集合捆绑在一起的最佳方式。

看到下面我到目前为止已经开始的工作。完整的脚本/代码-非常基本,但是很重要。

/* This code will run on it's own.  Single PL/SQL Block. */
DECLARE

PROCEDURE create_account(p_entity_id NUMBER
                         , p_sub_id NUMBER
                         , v_contacts_fname sys.odcivarchar2list
                         , v_contacts_lname sys.odcivarchar2list
                         )
  IS

  BEGIN

    dbms_output.put_line('Entity_id: ' || p_entity_id || ' - Sub_id: ' || p_sub_id);

    FOR f IN (SELECT m.column_value fname FROM TABLE(v_contacts_fname) m)
    LOOP

      FOR l IN (SELECT m.column_value lname FROM TABLE(v_contacts_lname) m)
      LOOP
        dbms_output.put_line(l.lname ||', ' || f.fname);
      END LOOP;

    END LOOP;


END create_account;

BEGIN

  create_account(p_entity_id            => 550005
                     , p_sub_id         => 100051
                     , v_contacts_fname => sys.odcivarchar2list('dan','bob')
                     , v_contacts_lname => sys.odcivarchar2list('anderson','bebop')
      ) ;

END;

输出量

/* I just thru a dbms_output() within both loops for display but of course this is NOT */
/*   how I want to tie together the entries of both collections to each other */
Entity_id: 550005 - Sub_id: 100051
anderson, dan 
bebop, dan
anderson, bob
bebop, bob

正确的输出当然是:

anderson, dan
bebop, bob
亚历克斯·普尔

您使用的集合类型是varray,因此已建立索引;你可以做:

FOR i IN 1..v_contacts_fname.COUNT
LOOP

  dbms_output.put_line(v_contacts_fname(i) ||', ' || v_contacts_lname(i));

END LOOP;

修改示例代码:

DECLARE

PROCEDURE create_account(p_entity_id NUMBER
                         , p_sub_id NUMBER
                         , v_contacts_fname sys.odcivarchar2list
                         , v_contacts_lname sys.odcivarchar2list
                         )
  IS

  BEGIN

    dbms_output.put_line('Entity_id: ' || p_entity_id || ' - Sub_id: ' || p_sub_id);

    FOR i IN 1..v_contacts_fname.COUNT
    LOOP

      dbms_output.put_line(v_contacts_fname(i) ||', ' || v_contacts_lname(i));

    END LOOP;


END create_account;

BEGIN

  create_account(p_entity_id            => 550005
                     , p_sub_id         => 100051
                     , v_contacts_fname => sys.odcivarchar2list('dan','bob')
                     , v_contacts_lname => sys.odcivarchar2list('anderson','bebop')
      ) ;

END;
/

现在得到

Entity_id: 550005 - Sub_id: 100051
dan, anderson
bob, bebop


PL/SQL procedure successfully completed.

您可以在开始时进行非常基本的检查,以验证count两个数组中的相同-如果不相同,则可能引发异常。

如果要传递单个集合参数,则该参数将需要是记录或对象类型的集合,可以在模式级别或在程序包中声明,具体取决于您希望使用的内容(在某种程度上) ,您正在使用的Oracle版本)。听起来您好像不想这样做。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何正确地将这些字符串连接在一起(按列然后按行)?

如何制作功能装饰器并将它们链接在一起?

Spark sql:如何过滤数据框两次,然后再联接在一起?

如何使用多个'Where'表达式,并使用C#/。NET将它们与AND和OR链接在一起?

如何分隔数字中的数字,然后用Java将它们加在一起?

控制器中的Java MVC ActionListener,视图中的JButton。如何将它们链接在一起?

如何加入字符串列表并删除重复的字母(将它们链接在一起)

如何将重复的数字排列在一起(最好是排列在一个数组中),然后根据它是哪个数字将它们分开?

如何使用教义QueryBuilder将具有额外参数和额外条件的多对多表联接在一起

如何找到每行的2个最大值,然后将它们加在一起?

如何从文件中读取所有数字,然后将它们加在一起?

如何使用PL / SQL遍历JSON响应?

如何在PL / pgSQL函数中将WITH与IF一起使用

我创建了多个过滤器功能,每个功能都可以完成自己的工作,但是,我不确定如何将它们链接在一起,以便它们一起工作

如何将不同的错误接口实现存储在一起,然后在Go中将它们用于类型比较?

Laravel:如何获取重复的记录并将它们分组在一起?

php如何遍历现有值并将它们放在一起?

如何匹配列字段并将它们的值组合在一起?

如何检查反向 Pandas DF 列并将它们添加在一起

如何在 POJO 类中填充列表并将它们拼凑在一起

如何将两个表单锁定在一起并将它们作为一个单独移动?

如何取两个字符串数组来构建一个将它们组合在一起的数组?

使用MYSQL查询将2个表与if条件联接在一起

JSON,REST,SOAP,WSDL和SOA:它们如何链接在一起

如何在 python 3 中将菜单连接在一起并在它们之间导航?

如何在VB.NET或C#中使用具有两个不同值的xml从xml中填充下拉列表,同时使用定界符将它们连接在一起

如何从 json 数组中获取 Json 对象并将它们与模型类一起使用

如何将两个任务集合链接在一起?

Java-我有一个2D数组。如何将它们的块加在一起?