我正在尝试创建一个非常简单的过程来创建一个或多个帐户。为了做到这一点,我希望对本程序进行的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] 删除。
我来说两句