问题描述
你好,汤姆,
在PL/SQL程序中,有没有一种方法可以不同地管理 “语义错误” 和 “语法错误”?
在集团 “例外” 中,我希望计算这类错误,我该怎么办?
我在文档中没有发现任何内容,我认为这两个错误都没有保留的数字,但也许我错了。
祝你愉快,
大卫·德
专家解答
如果语句符合SQL规则,则在语法上是正确的: 关键字拼写正确,位置正确等。
例如,以下的语法无效:
语义发生在具有有效语法的语句上。这验证了你所引用的对象是否真的存在!
例如,以下是语法上有效的SQL。但它引发了一个语义错误,因为数据库中没有名为a_table的对象!
在大多数情况下,您无需担心PL/SQL中的这种差异。只有在语法和语义上有效的情况下,您才能使用静态SQL编译程序。所以你不必担心异常处理,因为PL/SQL本身不会运行!
关键的例外是,如果你正在编写动态SQL。
但是即使在这里,我也不知道为什么您关心语法与语义之间的区别。无论哪种情况,你的程序都失败了。ORA错误将提供有关问题所在的详细信息。
例如,以下的语法无效:
slct * frm a_table; Unknown Command
语义发生在具有有效语法的语句上。这验证了你所引用的对象是否真的存在!
例如,以下是语法上有效的SQL。但它引发了一个语义错误,因为数据库中没有名为a_table的对象!
select * from a_table; ORA-00942: table or view does not exist
在大多数情况下,您无需担心PL/SQL中的这种差异。只有在语法和语义上有效的情况下,您才能使用静态SQL编译程序。所以你不必担心异常处理,因为PL/SQL本身不会运行!
关键的例外是,如果你正在编写动态SQL。
create table t (
c1 int
);
insert into t values ( 1 );
commit;
create or replace function f
return int authid current_user as
retval int;
begin
execute immediate
'select count(*) from not_a_real_table'
into retval;
return retval;
end f;
/
select f from dual;
ORA-00942: table or view does not exist
create or replace function f
return int authid current_user as
retval int;
begin
execute immediate
'slct count(*) fr not_a_real_table'
into retval;
return retval;
end f;
/
select f from dual;
ORA-00900: invalid SQL statement但是即使在这里,我也不知道为什么您关心语法与语义之间的区别。无论哪种情况,你的程序都失败了。ORA错误将提供有关问题所在的详细信息。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




