2013-03-25 2 views
3

실행 즉시 및 오류 처리와 관련된 여러 문제에 대해 약 2 시간 동안 연구 한 결과, 현재 제시 할 문제가 정확히 발생하지는 않았다고 생각합니다. 문제점을 아래 샘플로 줄였습니다. 문제는 다음과 같습니다.즉시 모드 및 오류가있는 Oracle DDL 실행

직접 작성 모드에서 변수 작성 텍스트와 구문 작성 오류로 작성하는 프로 시저를 실행할 때 즉시 실행 호출은 실패했음을 나타내는 오류를 발생시킵니다. 그러나 근본적인 오류나 그 본문에서 벗어날 수는 없습니다.

그러나 sqlplus (중간 모드 제외)에서 직접 동일한 proc을 만들면 오류가 완벽하게 발생합니다.

따라서 직접 모드가 실패하는 오류를 어떻게 만듭니 까?

나는 나의 의견 (MOP)으로 출력을 산재하고 공 i 행의 수 감소 :

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) 오류가 발생하지 않도록하려면 어떻게해야합니까?

답변

0

PL/SQL에서 이중 선택 ... 1을 사용할 수 없습니다. select into를 사용해야합니다. 두 경우 모두 SQL 스크립트가 아닌 PL/SQL 프로 시저를 작성합니다.

declare 
    x number; 
begin 
    select 1 into x from dual; 
end; 
/

declare 
    procedure MOPMOP 
    as 
    x number; 
begin 
    select 1 into x from dual; 
    dbms_output.put_line(x); 
end MOPMOP; 
begin 
MOPMOP; 
end; 
/

피 ORA-24344 - 아마이 동적 SQL을 사용하지 않을 것이지만 : 당신은 자신에 show errors을 실행할 때

declare 
    eSQL varchar(568); 
    x number; 
begin 
    eSQL := 'create or replace procedure MOPMOP as 
      begin 
      select 1 into x from dual; 
      end;';    
    execute immediate eSQL; 
    EXCEPTION WHEN OTHERS THEN NULL; 
end; 
/
+0

나는 그의 코드는 단지의 필요성을 설명하고 우리가 문제를 재현 할 수 있습니다 생각합니다. –

+0

물론 ... 그가 쇼 오류에 대해 알았 으면 좋겠다. – Art

+0

예, 이것은 단지 재현 일뿐입니다. – mpersico

2

이가 오류를 표시합니다 사전 "을 만들"/ " (이 때문에 동적 SQL의 SQLPLUS에서 숨겨진로)

당신이 expcitly이 경우 절차의 오류를보고 싶어 말을이 경우는 아무것도이다없는, 그 자체가 한 SQLPLUS가 "변경 :

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가 실행에 실패 했으므로 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> 
+0

그게 효과가. 당신의 분명한 대답을 많이 요구했습니다. – mpersico