暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 如何区分 “语义错误” 和 “句法错误”?

ASKTOM 2019-03-11
1126

问题描述


你好,汤姆,

在PL/SQL程序中,有没有一种方法可以不同地管理 “语义错误” 和 “语法错误”?

在集团 “例外” 中,我希望计算这类错误,我该怎么办?

我在文档中没有发现任何内容,我认为这两个错误都没有保留的数字,但也许我错了。

祝你愉快,

大卫·德

专家解答

如果语句符合SQL规则,则在语法上是正确的: 关键字拼写正确,位置正确等。

例如,以下的语法无效:

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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论