PLS-00382:表达式类型错误,无法显示 DBMS_OUTPUT.PUT_LINE

Posted

技术标签:

【中文标题】PLS-00382:表达式类型错误,无法显示 DBMS_OUTPUT.PUT_LINE【英文标题】:PLS-00382: expression is of wrong type, can't show DBMS_OUTPUT.PUT_LINE 【发布时间】:2020-12-05 05:49:22 【问题描述】:

多次遇到这个问题,SQL Developer 无法显示 DBMS_OUTPUT.PUT_LINE 尽管已经打开了服务器输出并且从视图工具栏打开了 Dbms 输出

set serveroutput on;
accept p_angka prompt 'Input Number : ';

declare
    a integer;
    b integer :=&p_angka;

begin
    dbms_output.put_line('---ODD NUMBER---');
    for a in 1..b loop
        if (a mod 2) then
            dbms_output.put_line(a);
        end if;
    end loop;
end;

控制台成功请求输入,但无法在任何地方显示所需的输出

ORA-06550: line 8, column 12:
PLS-00382: expression is of wrong type
ORA-06550: line 8, column 9: error

【问题讨论】:

在 Oracle 中,mod 是一个函数,而不是一个运算符。 mod(a, 2) 而不是 a mod 2 - 正如大力水手已经在他的回答中解释的那样。此外,这不是 C - 您不能使用算术表达式并期望它被隐式转换为布尔值。您必须明确地将您的“mod”与 0 或 1 进行比较,正如 Popeye 所展示的那样。 a mod 2 在 PL/SQL 以及 SQL 中的常规 mod() 函数中有效。 您没有看到 dbms_output 的原因是 PL/SQL 是一种编译语言,并且由于第 8 行的语法错误(if 条件)它无效并且永远不会启动。即使是这样,dbms_output 调用也在错误行之后。 顺便说一句,C 类型语言使用括号来表示 if 条件,例如if (a > b) do_something。 PL/SQL 的 if 条件改为由 then 关键字终止,例如if a > b then do_something. 【参考方案1】:

我认为您的代码中有几个错误,在以下代码中内联提到:

set serveroutput on;
-- accept p_angka prompt 'Input Number : '; -- not needed 
declare
--a integer; -- not needed
b integer := &p_angka;
begin
  dbms_output.put_line('---ODD NUMBER---');
  for a in 1..b loop
    if (mod(a,2) = 0) then -- mod function should be used like this
      dbms_output.put_line(a);
    end if;
  end loop;
end;
/

DB<>Fiddle,b 值为常数。

【讨论】:

您将 ACCEPT 命令标记为“不需要”。你知道那个命令是做什么的吗? OP 完全按照预期使用它;您的评论表明您不熟悉该命令及其使用方式。

以上是关于PLS-00382:表达式类型错误,无法显示 DBMS_OUTPUT.PUT_LINE的主要内容,如果未能解决你的问题,请参考以下文章

PLS-00382:表达式的类型错误触发器

PLS-00382:表达式类型错误,PL/SQL:语句被忽略

PL/SQL:PLS-00382:表达式类型错误。语句被忽略

ORA-06550:第 1 行,第 13 列:PLS-00382:表达式类型错误 ORA-06550:第 1 行,第 7 列:PL/SQL:语句被忽略

将值插入记录类型表

为啥`SYS.odcivarchar2list`不能与`PIPELINED`函数一起使用