【问题标题】:Receiving error during compile test of procedure在程序的编译测试期间接收错误
【发布时间】:2015-09-18 11:04:22
【问题描述】:

我编写了一个简短的程序,当输入捐助者 ID 时,它会根据状态字段检查活动承诺(数据类型 10 的 NUMBER 是活动的,20 是完整的)并且每月付款并返回布尔值 True 如果全部条件满足,如果不满足,则为 False。在添加 DBMS 输出之前,它可以正常编译,但出现错误 PLS-00306:wrong number or types of arguments in call"

自己解决这个问题感觉很好,但不确定我的错误在哪里。还在寻找关于异常处理程序的解释(在代码中注释)。提前感谢cmets和教学点!

我的代码:

CREATE OR REPLACE PROCEDURE DDPAY_SP
     (donor_id IN NUMBER, active_pl OUT BOOLEAN)

IS
      pay_count NUMBER;
BEGIN
      SELECT COUNT(*)
         INTO pay_count
         FROM dd_pledge 
         WHERE iddonor = donor_id AND
               idstatus = 10 AND
               paymonths > 1;

      IF pay_count > 1 THEN
         active_pl := TRUE;
      ELSE active_pl := FALSE;
      END IF;
      DBMS_OUTPUT.PUT_LINE('Active Pledge and paymonths: ' || active_pl);

      /* want to add exception but don't understand how to choose
      the handler for blocks of code that are not the Oracle defined
      exceptions--Can someone explain better than book I have? I know    
      code should be:

      EXCEPTION
      WHEN .....
      DBMS_OUTPUT.PUT_LINE('    ');  */

      END;

【问题讨论】:

  • 您不需要调用 DBMS_OUTPUT。你有一个布尔输出参数。此外,您不能将布尔值传递给 DBMS_OUTPUT。执行程序时会发生什么?

标签: oracle plsql oracle11g boolean dbms-output


【解决方案1】:

DBMS_OUTPUT.PUT_LINE('活动承诺和支付月数:' || active_pl);

您不能将 BOOLEAN 传递给 DBMS_OUTPUT。您只能传递字符串参数,即 VARCHAR2 数据类型。

这就是您收到以下错误的原因:

PLS-00306:wrong number or types of arguments in call"

理想情况下,您不希望将任何DBMS_OUTPUT 发送给您的客户端,因为您使用的是 OUT 参数,这就足够了。

如果你真的想打印布尔值,那么你必须把它转换成 VARCHAR2 数据类型。

例如,

SQL> set serveroutput on
SQL> DECLARE
  2    var_bool BOOLEAN;
  3  BEGIN
  4    var_bool := TRUE;
  5    dbms_output.put_line('Status = '||
  6    CASE
  7    WHEN var_bool THEN
  8      'TRUE'
  9    ELSE
 10      'FALSE'
 11    END);
 12  END;
 13  /
Status = TRUE

PL/SQL procedure successfully completed.

SQL>

【讨论】:

  • 我希望我使用的书能涵盖这一点。我正在处理的问题是特定的过程是返回“布尔”值 True。但是现在看它,我不明白为什么我不能将 active_proj 设为 CHAR 数据类型并返回该值?这会满足错误吗?为了测试该过程,我将在 SELECT/BEGIN 语句中返回该值以验证该过程是否正常工作。
  • @allendks45 我更愿意使用函数而不是过程。它可以灵活地调用 SQL,但是,您不能返回 boolean,因为它只是 PL/SQL 支持的数据类型。你可以从函数中返回字符串。
  • 感谢拉利特!您解释这些概念的方式非常有帮助,并且从过去的经验中能够与他人分享您所知道的知识,可以使该人在他/她的手艺上做得更好。这本书几乎完成了,但将来会通过其他资源继续学习。
  • @allendks45 一切顺利!我在博客中更新了一些很好的例子和概念,如果你有兴趣可以看看lalitkumarb.wordpress.com/posts
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-15
  • 1970-01-01
  • 1970-01-01
  • 2018-07-21
  • 2019-11-18
相关资源
最近更新 更多