gpt4 book ai didi

sql - 具有即时模式和错误的 Oracle DDL 执行

转载 作者:行者123 更新时间:2023-12-04 14:35:36 24 4
gpt4 key购买 nike

在对立即执行和错误处理的各种问题进行了大约两个小时的研究之后,我认为我没有遇到我将要提出的问题。我已将问题简化为以下示例。问题是:

当我在立即模式下执行过程创建时,在变量中创建文本并且在创建文本中出现语法错误,立即执行调用会抛出一个错误,表明它失败了。但我无法了解潜在的错误或其文本。

但是,当我直接在 sqlplus(没有中间模式)中创建相同的过程时,得到错误的效果很好。

那么,如何找到导致即时模式失败的错误呢?

我在输出中穿插了我的评论 (MOP) 并减少了空行的数量:

SQL*Plus: Release 10.2.0.1.0 - Production on Mon Mar 25 15:57:06 2013
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> set serveroutput on

SQL> declare
2 eSQL varchar(568);
3 begin
4 eSQL := 'create or replace procedure MOPMOP
5 as
6 begin
7 select 1 from dual;
8 end;
9 ';
10 execute immediate eSQL;
11 end;
12 /
ERROR:
ORA-24344: success with compilation error
ORA-06512: at line 10
Warning: PL/SQL compilation errors.

这很好。有一个编译错误。那么,现在让我问一下那个编译错误是什么:

SQL> show errors;
No errors.

这样不好。有一个编译错误。它以前如何!?!?!?对比一下:

SQL> create or replace procedure MOPMOP
2 as
3 begin
4 select 1 from dual;
5 end;
6 /

Warning: Procedure created with compilation errors.

这很好。有一个编译错误。那么,现在让我问一下那个编译错误是什么:

SQL> show errors;
Errors for PROCEDURE MOPMOP:

LINE/COL ERROR
-------- -----------------------------------------------------------------
4/5 PLS-00428: an INTO clause is expected in this SELECT statement
SQL>

这很好。有一个编译错误。现在我知道是什么了。

那么,我如何获得中间模式以吐出底层 (00428) 错误?

最佳答案

当您单独运行show errors 时,它会显示 sqlplus 本身所做的任何先前“创建”/“更改”的错误,在这种情况下什么都没有(因为它被隐藏了sqlplus 因为动态 SQL)

你必须明确地说你想看到这个案例的程序错误:

SQL> declare
2 eSQL varchar(568);
3 begin
4 eSQL := 'create or replace procedure MOPMOP
5 as
6 begin
7 select 1 from dual;
8 end;
9 ';
10 execute immediate eSQL;
11 end;
12 /
ERROR:
ORA-24344: success with compilation error
ORA-06512: at line 10



Warning: PL/SQL compilation errors.

SQL> show errors procedure mopmop
Errors for PROCEDURE MOPMOP:

LINE/COL ERROR
-------- -----------------------------------------------------------------
4/5 PLS-00428: an INTO clause is expected in this SELECT statement
SQL>

由于创建运行在服务器端而不是通过 sqlplus,sqlplus 不知道失败,因此无法正确获取错误。

此外,如果您之前有过失败,它会保留:

SQL> create or replace procedure MOPMOP2
2 as
3 begin
4 select 1 from dual;
5 end;
6 /

Warning: Procedure created with compilation errors.

SQL> declare
2 eSQL varchar(568);
3 begin
4 eSQL := 'create or replace procedure MOPMOP
5 as
6 begin
7 select 1 from dual;
8 end;
9 ';
10 execute immediate eSQL;
11 end;
12 /
ERROR:
ORA-24344: success with compilation error
ORA-06512: at line 10



Warning: PL/SQL compilation errors.

SQL> show errors
Errors for PROCEDURE MOPMOP2:

LINE/COL ERROR
-------- -----------------------------------------------------------------
4/5 PLS-00428: an INTO clause is expected in this SELECT statement
SQL>

关于sql - 具有即时模式和错误的 Oracle DDL 执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15624178/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com