如何在数组中获取存储过程的输出值

Posted

技术标签:

【中文标题】如何在数组中获取存储过程的输出值【英文标题】:How to get stored procedure output value in array 【发布时间】:2019-11-13 07:44:46 【问题描述】:

我正在创建一个关于获取输出值的程序。输出值在另一个过程中被调用并存储在一个数组中。

procedure get_value_temp
(
v_name_id in out varchar2,
v_event_id out  varchar2
)
is
begin  
             select s.name_id,d.event_id into v_name_id ,v_event_id from aokk_kala_appreg_stage s inner join aokk_kala_appreg_det d
            on s.name_id=d.name_id where s.name_id=v_name_id;
            --return;
 end;

下面是另一个过程。

 declare
 V_ARRAY            MYTABLETYPE;
name_id  varchar2(100);
 BEGIN
V_ARRAY:=get_value_temp(220);--get output value and store in array.
 FOR I IN V_ARRAY.FIRST .. V_ARRAY.LAST
                    loop
                        dbms_output.put_line(V_ARRAY(I));
                    END LOOP;

end;

请帮助我如何获取数组中的存储过程输出值。

【问题讨论】:

MYTABLETYPE 是如何定义的? 这是数组类型并分配 MYTABLETYPE 变量。 V_ARRAY 是一个变量; MYTABLETYPE 是用户定义的类型,它是如何定义的? 创建或替换类型 mytabletype 作为 VARCHAR2 表 (32000) 我正在创建一个新类型 MYTABLETYPE,这是数组类型并分配 MYTABLETYPE 变量 【参考方案1】:

例如,假设您有这张桌子:

create table myTab(n number, v varchar2(100));
insert into myTab(n, v) values (1, 'one');
insert into myTab(n, v) values (2, 'two');
insert into myTab(n, v) values (2, 'TWO');

您可以构建如下程序:

create or replace procedure myProc (p_n IN number, po_mytabletype OUT mytabletype) is    
begin
    select v
    bulk collect into po_mytabletype
    from myTab
    where n = p_n;
end;

如果你这样称呼它:

declare
    v_mytabletype    mytabletype;
begin
    myProc(2, v_mytabletype);
    for i in v_mytabletype.first .. v_mytabletype.last loop
        dbms_output.put_line (v_mytabletype(i));
    end loop;
end; 

你得到:

two
TWO

【讨论】:

发生错误 myProc time [1]:(Error): PLS-00497: cannot mix between single row and multi-row (BULK) in INTO list 发生错误 [1]:(Error): PLS-00410: RECORD,TABLE 或参数列表中的重复字段是不允许的,因为 po_mytabletype 变量被发现两次。 此代码有效;如果您有错误,请编辑发布您正在使用的代码的问题【参考方案2】:

这是根据我对您的要求的理解的示例代码演示,如果不符合您的要求,请分享更多细节。

CREATE OR REPLACE PROCEDURE get_value_temp(v_name_id IN VARCHAR2, 
                                           o_events_for_nameid OUT sys_refcursor) IS
BEGIN 
  open o_events_for_nameid 
   for select s.event_id from 
  (SELECT 'A' name_id, '1' event_id FROM dual UNION 
   SELECT 'A' name_id, '2' event_id FROM dual UNION 
   SELECT 'C' name_id, ' 3' event_id FROM dual UNION 
   SELECT 'D' name_id, '4' event_id FROM dual UNION
   SELECT 'D' name_id, '5' event_id FROM dual UNION 
   SELECT 'E' name_id, '6' event_id FROM dual) s WHERE s.name_id = v_name_id;
   END;
   / 

drop type mytabletype;
/
CREATE OR REPLACE TYPE mytabletype AS TABLE OF VARCHAR2(200); -- this is nested table definition 
/

现在测试代码...

DECLARE
  v_nested_table             mytabletype :=  mytabletype();
  o_events_for_nameid        SYS_REFCURSOR;

BEGIN
  get_value_temp(v_name_id           => 'A',
                 o_events_for_nameid => o_events_for_nameid);

    FETCH o_events_for_nameid BULK COLLECT
      INTO v_nested_table;               
  FOR i IN v_nested_table.first .. v_nested_table.last
  LOOP
    dbms_output.put_line(v_nested_table(i));
  END LOOP;
END;

【讨论】:

我有第N个名字_id。那么如何在时间联合中选择一个查询。我想要单个变量中的批量数据并通过 name_id 找到它。并感谢您的帮助。 能否请您在行中分享任何示例数据...在编写任何解决方案时非常感谢和帮助。我在选择查询中使用了 where 子句.. WHERE s.name_id = v_name_id;跨度>

以上是关于如何在数组中获取存储过程的输出值的主要内容,如果未能解决你的问题,请参考以下文章

如何获取作为数组工作的存储过程输出参数?

sqlalchemy 调用 mssql存储过程如何获取返回值?

如何php调用oracle存储过程返回的是一个结果集,该怎么从php页面中吧数据循环输出呀

从存储过程中获取返回值

PHP获取存储过程的返回值

如何在sql server的另一个存储过程中执行存储过程