错误:在decode的oracle plsql中:PLS-00382:表达式类型错误

eit6fx6z  于 2023-04-20  发布在  Oracle
关注(0)|答案(3)|浏览(210)

问题:你的块应该读入两个真实的,并判断这两个数字的乘积是否等于或大于100。使用dbms_output.put_line在屏幕上显示输出。(在需要的地方使用decode而不是IF语句)。数据必须由用户输入。
我在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
gg58donl

gg58donl1#

如果我没说错的话,你不能像那样使用布尔值。但是如果你能把它转换成一个算术运算,得到一个整数值,你就得到了你想要的。所以试着从p中减去100,然后检查它是否是一个正数。如果它是一个正数,p就大于100。

CREATE OR REPLACE PROCEDURE two
AS
    i number;
    j number;
    p number;

    msg varchar2(100);
BEGIN
    i:=&x;
    j:=&y;
    p:=i*j;

    select DECODE(sign(p-100),1,'True','False') into msg from dual;
    dbms_output.put_line(msg);
END;
e5nqia27

e5nqia272#

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

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

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

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

fiddle

eni9jsuy

eni9jsuy3#

你不能这样做:

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;

或者不要使用布尔值。

相关问题