oracle函数不显示结果

Posted

技术标签:

【中文标题】oracle函数不显示结果【英文标题】:oracle function not displaying results 【发布时间】:2021-06-16 13:03:36 【问题描述】:

我对此很陌生,所以它可能听起来很基础,但是我想创建一个函数,它接受两个输入参数(一个主键和一个数值)并进行计算以比较输入数值 (v_priceWantToInsert)大于表列中的最大值并返回结果为真或假。 这是代码:

CREATE OR REPLACE FUNCTION PRICE_CHECK(v_productID IN VARCHAR2, v_priceWantToInsert in NUMBER)
RETURN VARCHAR2
IS
   RETURN BOOLEAN AS
    v_Bool BOOLEAN;
    v_MAXPRICE NUMBER;  
BEGIN
   SELECT
    MAX(B.BIDPRICE) INTO v_MAXPRICE
    FROM
        PRICEBID B
    WHERE B.PRODUCTID = v_productID;
    IF (v_MAXPRICE > v_priceWantToInsert) THEN
        v_Bool := FALSE;
    ELSE
        v_Bool := TRUE;
    END IF;
END PRICE_CHECK;



DECLARE
    var1 VARCHAR2(100);
BEGIN
     var1 := case when PRICE_CHECK('P00001',45) then 'true' else 'false' end;
    DBMS_OUTPUT.PUT_LINE('It is: ' || var1);
END; 

但是我的代码显示对象无效的错误并且通常是 PL/SQL 编译错误。我愿意接受任何解决方案,只要它给我一个真或假值。

【问题讨论】:

【参考方案1】:

我在代码中看到了一些时刻:

    在 DECLARE 部分缺少字符串的长度。当变量是“字符串”类型时,Oracle 需要指定变量的长度,例如 VARCHAR 或 CHAR。限制为 32767:

     var1 VARCHAR2(100); -- might be up to 32767
    

    在函数中,您使用的是未定义的变量 v_MAXPRICE。它必须在函数定义的 IS 和 BEGIN 部​​分之间完成。我认为它应该是这样的:

     IS
       v_MAXPRICE number;
     BEGIN
    

    更新问题后,您的代码中还有另一个时刻

     RETURN VARCHAR2
     IS
        RETURN BOOLEAN AS
         v_Bool BOOLEAN;
         v_MAXPRICE NUMBER;  
    

有2个return是错误的,替换为

       RETURN BOOLEAN
       IS
        v_Bool BOOLEAN;
        v_MAXPRICE NUMBER;  

因为它是一个函数并且必须返回一些你需要添加的东西

return v_bool

在“结束如果”之后

    我认为最后一部分是匿名块

首先,您的函数将布尔值返回到定义为 varchar2 的 var1 中。这是错误的,因为 Oracle 无法将布尔值转换为字符串,因此需要帮助。

试试看:

    var1 := case when PRICE_CHECK('P00001',45) then 'true' else 'false' end;

【讨论】:

更改了这个,但出现错误:PLS-00905: object user.PRICE_CHECK is invalid. 你使用什么开发工具?只是sqlplus吗? 我使用 sqldeveloper,我必须说获得错误并不是很友好,但那是我的学校项目,我无法更改它。我已经用我现在正在尝试的内容更新了上面的代码。 @pun_intended 请检查更新的答案 嘿,还是一样。这些是错误: 06550. 00000 - "line %s, column %s:\n%s" *原因:通常是 PL/SQL 编译错误。 *行动:

以上是关于oracle函数不显示结果的主要内容,如果未能解决你的问题,请参考以下文章

我要用oracle根据我截取到的年龄分组,查询显示其它字段,但是不用max(),sum()等聚合函数

Oracle中的通用函数

oracle中nvl()函数有啥用啊?

oracle中nvl()函数有啥用啊?

oracle todate函数

oracle 聚合函数求和后,小数点前面的零不显示