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