如何在Oracle SQL查询中获得准确的错误行?

ujv3wf0j  于 2023-11-17  发布在  Oracle
关注(0)|答案(3)|浏览(260)

我正在使用Oracle数据库(SQL Developer作为客户端)和长查询(* 大多数查询都在5 k和10 k行之间,最长的达到60 k行 *)。

**我的目标是在SQL Developer上运行查询时,我可以看到错误发生的确切行。**目前SQL Developer/Oracle DB显示错误类型(例如“missing expression”或“missing right parenthesis”),但不显示错误的位置,迫使我分析查询的每一位。

有没有一种方法可以让数据库显示错误行,或者我什么也做不了?(* 没有,我不能减少查询的大小,因为它们来自外部源;我只需要确保它们工作并修复任何错误 *)。我也已经尝试过其他客户端(VSCode,Toad,DBeaver)。
示例:运行以下查询:

SELECT
'Line 1' as column_1,
'Line 2' as column_2,
CASE WHEN 1= THEN ELSE NULL as column_3,
'Line 4' as column_4,
'Line 5' as column_5
FROM dual;

字符串
如果你想测试一个更长的查询,我已经使用this 5000-lines query作为测试,它没有显示错误在哪里(spoiler:line 2507)。

jgwigjjp

jgwigjjp1#

在SQL developer中点击Query builder会显示错误发生的确切行。我使用了您提供的示例SQL,得到了以下输出。请注意,Query builder不会识别表或视图是否不存在,它只会验证SQL语法。
x1c 0d1x的数据

Edit 1:-也可以使用DBMS_SQL.LAST_ERROR_POSITION来识别错误行。下面的链接

ORA-01722: Invalid Number, find specific line

anauzrmj

anauzrmj2#

据我所知,在过去的20年里,当在一些存储的程序单元或匿名PL/SQL块中有一些SQL语句时,你不能得到确切的行,那里有一些缺失的表达式或括号或其他东西。你可以做的是有一个日志,在那里记录错误并以下面的方式处理异常:

begin
  insert into ( ---
  )
  select ...
  ...
exception
  when others then 
    v_errmsg:=sqlcode||':'||sqlerrm;
    v_other_info:=... --- here you compose a string with relevant info for debug
  log_runs(
    p_errlevel => 0
    ,p_program => $$plsql_unit
    ,p_line => $$plsql_line
    ,p_msg => v_errmsg
    ,p_other_info => v_other info
  );
  raise;
end;

字符串
您的日志记录过程将如下所示:

procedure log_runs (
    p_errlevel number
    ,p_program varchar2
    ,p_line => number
    ,p_msg => varchar2
    ,p_other_info => varchar2
  )is
  pragma autonomous_transaction;
begin
  if config_pkg.get_error_level>p_errlevel then
    return; --- log nothing if the settings for logging level is greater
  end if;
  insert into runs_log (
    log_time,
    program_unit,
    program_line,
    errlevel,
    message,
    other_info
  ) 
  select
   sysdate log_time
   p_program program_unit,
   p_line program_line,
   p_errlevel errlevel,
   p_msg message,
   p_other_info other_info
  from dual;
  commit;
end;


因此,您可以让所有元素都发现特定SQL语句中的错误。

62lalag4

62lalag43#

好吧,我的SQL Developer(右)以及SQL*Plus(左)(与Oracle保持一致)显示了错误点:


的数据
我相信你的工具应该也能做到这一点。如果不能,你能把你自己的截图贴出来吗?这样我们就不用猜了。

相关问题