Sql 过程如何使用 IN OUT 返回多个值:PLS-00103 错误

Posted

技术标签:

【中文标题】Sql 过程如何使用 IN OUT 返回多个值:PLS-00103 错误【英文标题】:How Sql Procedure return mulltiple values with IN OUT :PLS-00103 error 【发布时间】:2016-01-14 08:51:40 【问题描述】:

我正在使用 oracle 10g 我想创建一个返回多个值的 sql 过程我在我的过程中使用 IN OUT

    create or replace procedure proc_mull_val
(
e_id in chr_emgt_employee.employee_code%type,
head_id out chr_emgt_employee.employee_code%type,
zone_id out chr_emgt_employee.employee_code%type
)
is
begin

SELECT   (SELECT   employee_code
            FROM   chr_emgt_employee
           WHERE   EMPLOYEE_ID = emgt1.SUPERVISOR_EMP_ID)
            , (SELECT   employee_code
                                FROM   chr_emgt_employee
                               WHERE   employee_id = EMGT2.SUPERVISOR_EMP_ID)

  INTO   head_id,zone_id
  FROM   chr_emgt_employee emgt1, chr_emgt_employee emgt2
 WHERE   EMGT2.employee_id = emgt1.SUPERVISOR_EMP_ID
         AND emgt1.employee_code = e_id;

end;

程序已成功创建,但是当我执行此程序时

declare
head_id  chr_emgt_employee.employee_code%type;
zone_id  chr_emgt_employee.employee_code%type;
begin
execute proc_mull_val(151018,head_id,zone_id);
end;

执行时遇到这个错误

PLS-00103:在预期以下情况之一时遇到符号“PROC_MULL_VAL”: := 。 (@%;立即 符号“:=”被替换为“PROC_MULL_VAL”以继续。

如果有人对此查询或我的问题有更好的建议,请告诉我

【问题讨论】:

删除调用过程中的execute。此外,您的程序似乎在变量中插入了许多值;如果需要的话,最好考虑BULK COLLECT和数据结构 是的,我的程序在变量中插入了一个子查询。但我很抱歉我没有让你批量收集那是什么 因此,如果您的查询之一可以返回多个值,则不能使用单个变量。尝试类似:DECLARE TYPE t_tab IS TABLE OF NUMBER; tab t_tab; BEGIN SELECT LEVEL BULK COLLECT INTO tab FROM DUAL CONNECT BY LEVEL < 3; for i in tab.first .. tab.last loop DBMS_OUTPUT.put_line('Size: ' || tab(i)); end loop; END; / 您的意思是多个值,就像两个 OUT 参数中的每一个中的单个标量值一样,因此您可以从对过程的调用中获得每个值;或者您想从一次调用中检索多个 head_id 和/或多个 zone_id 值? 【参考方案1】:

我认为你的程序没有问题,只是你的调用方式发生了变化

   DECLARE
   head_id   varchar2 (20);
   zone_id   varchar2 (20);
BEGIN
   proc_mull_val ('151018', head_id, zone_id);

   DBMS_OUTPUT.put_line (head_id || '..... ' || zone_id);
END;

试试这个,如果不能解决,请告诉我更改数据类型,然后重试

【讨论】:

谢谢你非常接近问题是数据类型我是大傻瓜对不起,谢谢你的耐心【参考方案2】:

Execute 是一个SQL*PLUS comand,因此您不能在 pl/sql 匿名块中使用它。

【讨论】:

【参考方案3】:

首先在您的数据库中创建集合对象。并将该集合对象用作输出参数。 参考Passing an array of data as an input parameter to an Oracle procedure

【讨论】:

以上是关于Sql 过程如何使用 IN OUT 返回多个值:PLS-00103 错误的主要内容,如果未能解决你的问题,请参考以下文章

存储过程和函数

MySQL存储过程返回多个值

创建存储过程 in,out,inout

使用两个过程用 OUT 和 IN 参数进行简单计算,PL/SQL Oracle

oracle中调用存储过程时传递参数值的3种方式。。

java中如何获取oracle存储过程返回的多个值。