Oracle 函数中的布尔参数

Posted

技术标签:

【中文标题】Oracle 函数中的布尔参数【英文标题】:Boolean parameter in Oracle function 【发布时间】:2017-05-11 15:57:36 【问题描述】:

这是我的 Oracle 函数的签名

 FUNCTION functionName(
     param1 VARCHAR2, 
     param2 VARCHAR2, 
     param3 DATE, 
     param4 DATE, 
     param5 BOOLEAN) 
 RETURN myOwnType;

我用它:

myOwnTypeVar := functionName('something', 'some', SYSDATE, SYSDATE, TRUE);

我有这个错误:

PLS-00382 expression is of wrong type.

所有类型似乎都受到尊重。我想知道我是否可以在函数中使用布尔参数(在程序中使用它没有问题)。

谢谢。

注意:myOwnTypeVar 的声明

myOwnTypeVar myOwnType; 

【问题讨论】:

返回类型是否与变量类型匹配? myOwnTypeVar 是如何声明的? 问题不在于布尔参数。显示更多代码 - 特别是在错误消息中提到的行周围。错误消息应该告诉您错误发生的位置(代码中的哪一行)。 如果您需要具体帮助,您需要发布functionname 的代码和myOwntype 的声明。 【参考方案1】:

"我想知道我是否可以在函数中使用布尔参数"

是的。 PL/SQL 支持布尔数据类型。如果myOwnType 是这样的PL/SQL 记录...

create or replace package p23 as
    type myOwnType is record (
        attr1 varchar2(10), 
        attr2 varchar2(30), 
        attr3 date, 
        attr4 date, 
        attr5 boolean
     );
    function functionname(
        param1 varchar2, 
        param2 varchar2, 
        param3 date, 
        param4 date, 
        param5 boolean) 
    return myowntype;    
end p23;
/
create or replace package body p23 as
    function functionname(
        param1 varchar2, 
        param2 varchar2, 
        param3 date, 
        param4 date, 
        param5 boolean) 
        return myowntype
    is
        rv myOwnType;
    begin
        rv.attr1 := param1;
        rv.attr2 := param2;
        rv.attr3 := param3;
        rv.attr4 := param4;
        rv.attr5 := param5;
        return rv;
    end;
end p23;
/

...没问题:

SQL> declare
  2    myOwnTypeVar p23.myowntype;
  3  begin
  4    myOwnTypeVar := p23.functionName('something', 'some', SYSDATE, SYSDATE, TRUE);
  5  end;
  6  /   

PL/SQL procedure successfully completed.

SQL> 

那么导致错误的原因是什么? PLS-00382 是分配失败。你还没有发布myOwnType 的声明,但是如果它是用字符串属性而不是布尔值定义的,像这样......

    type myOwnType is record (
        attr1 varchar2(10), 
        attr2 varchar2(30), 
        attr3 date, 
        attr4 date, 
        attr5 varchar2(1)
     );

...那么这个赋值会抛出那个错误:

   rv.attr5 := param5;

顺便说一句,Oracle SQL 不支持布尔值,即使是类型:

SQL> create or replace type myOwnType as object (
  2        attr1 varchar2(10), 
  3        attr2 varchar2(30), 
  4        attr3 date, 
  5        attr4 date, 
  6        attr5 boolean
  7  );
/   

Warning: Type created with compilation errors.

SQL> sho err
Errors for TYPE MYOWNTYPE:

LINE/COL ERROR
-------- -----------------------------------------------------------------
6/8      PLS-00530: Illegal type used for object type attribute:
         'BOOLEAN'.

SQL>

在这种情况下,functionName() 无法编译,因此无法投掷 PLS-00382 expression is of wrong type

【讨论】:

这里的 SQL 类型有什么关系?这是一个 PL/SQL 函数,它只有一个布尔参数,这意味着它不能从 SQL 中调用;但这不应该阻止它被 PL/SQL 调用。 @JeffreyKemp - 你现在就在。最初它在那里是因为达米安的回答(自从删除但你得到了代表)。根源是,OP 没有在他们的原始问题中包含 类型的定义,也没有费心回答我们的问题。 我明白了。很公平。

以上是关于Oracle 函数中的布尔参数的主要内容,如果未能解决你的问题,请参考以下文章

使用带有布尔输入参数的 PL/SQL 在 oracle 中调用 java 存储过程

从 oracle 函数返回布尔值

Oracle中实现布尔类型

Oracle 中的 JPA 和 Flyway 布尔类型

导出的 C 函数与结构与 .Net 编组中的布尔大小

布尔函数参数和返回