Error: in oracle plsql of decode: PLS-00382: expression is of wrong type

问题描述 投票:0回答:3

问题: 你的块应该读入两个实数并判断 两个数等于或大于100。在屏幕上显示输出 使用 dbms_output.put_line。 (使用 decode 而不是 IF 语句 where 必需的)。数据必须由用户输入。

我在 oracle plsql 上尝试这个并卡在这里。

代码:

CREATE OR REPLACE PROCEDURE two
AS
    i number;
    j number;
    p number;
    b boolean;
    msg varchar2(100);
BEGIN
    i:=&x;
    j:=&y;
    p:=i*j;
    b:=p>=100;
    select DECODE(b,1,'True','False') into msg from dual;
    dbms_output.put_line(msg);
END;

错误:

LINE/COL ERROR
-------- -----------------------------------------------------------------
13/16    PLS-00382: expression is of wrong type
sql oracle plsql decode
3个回答
0
投票

如果我没记错的话,你不能那样使用布尔值。但是,如果您可以将其转换为算术运算,从而得到一个整数值,那么您就得到了想要的结果。因此尝试从 p 中减去 100 并检查它是否为正数。如果它是一个正数 p 大于 100.

CREATE OR REPLACE PROCEDURE two
AS
    i number;
    j number;
    p number;
    b boolean;
    msg varchar2(100);
BEGIN
    i:=&x;
    j:=&y;
    p:=i*j;
    b:=p>=100;
    select DECODE(sign(p-100),1,'True','False') into msg from dual;
    dbms_output.put_line(msg);
END;

0
投票

你不能这样做:

select DECODE(b,1,'True','False') into msg from dual;

布尔值不是 SQL 数据类型的一部分。它是一种仅限 PL/SQL 的数据类型,因此您不能在 SELECT 语句中使用它。另外,您正在将布尔值与整数进行比较,尽管它在 Javascript 中有效,但在 SQL 中却无效。

你必须这样做:

IF b
THEN
  msg := 'True';
ELSE
  msg := 'False';
END IF;

或者不要使用布尔值。


0
投票

您不能在过程中使用替换变量(因为它们将在过程编译时计算,而不是在过程运行时计算)。您需要为过程使用参数:

CREATE OR REPLACE PROCEDURE two(
  i IN NUMBER,
  j IN NUMBER
)
AS
  msg varchar2(100);
BEGIN
  DBMS_OUTPUT.PUT_LINE(CASE WHEN i * j >= 100 THEN 'True' ELSE 'False' END);
END;
/

然后,当您调用过程时,您可以使用替换变量:

BEGIN
  DBMS_OUTPUT.ENABLE();
  two(&x, &y);
END;
/

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.