PL/SQL 컴파일러의 버그입니까?
SVN-Code Repository에서 몇 줄을 제거한 후 패키지 사양을 발견했습니다.
create or replace package tq84 as
return varchar2(10);
end tq84;
/
제가 보기에 그러한 사양은 말이 되지 않으므로 컴파일을 전혀 해서는 안 됩니다.하지만 아마도, 저는 명백한 것을 보지 못했을 것입니다. 이것이 정말로 벌레일까요?
완벽을 위해:
me @ xxx.yyy.zz > select * from v$version;
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
PL/SQL Release 10.2.0.4.0 - Production
CORE 10.2.0.4.0 Production
TNS for IBM/AIX RISC System/6000: Version 10.2.0.4.0 - Productio
NLSRTL Version 10.2.0.4.0 - Production
편집: 위와 같은 사양에서 제안되었습니다.return
키워드가 아니라 (package-) 키워드입니다.그러나 다음과 같은 컴파일은 동일하게 양호하기 때문에 그렇지 않은 것 같습니다.
create or replace package tq84 as
return varchar2(10);
return number;
return date;
end tq84;
/
그리고 분명히 컴파일러는 내가 같은 변수를 여러 번 선언한다고 말해야 합니다.
편집 2: 물론 JOTN이 옳습니다.return
IS는 변수이며, 게다가 컴파일러는 동일한 이름을 가진 변수가 두 번 이상 선언되면 사전에 알려주지 않습니다. 대신 런타임 환경이 그렇게 합니다.
그래서, 그것을 염두에 두고, 다음과 같은 것을 컴파일하는 것이 가능합니다.
create or replace package return as
subtype return is varchar2(10);
end return;
/
create or replace package tq84 as
constant constant
return . return := 'return';
function function
return return . return;
end tq84;
/
적어도 언뜻 보기에는 이상하게 보입니다.
그래서, 내 생각에, 그것은 컴파일러 버그가 아닙니다. 왜냐하면 return
변수 이름으로 허용되지만, 같은 이름의 변수가 여러 번 선언된 경우 컴파일러가 최소한 경고를 주어야 하는지 여부는 논란의 여지가 있습니다.
"return"이라는 이름을 변수로 사용할 수 있는 것 같습니다.이 경우 패키지 변수를 선언합니다.키워드라서 실패할 줄 알았는데, 해보니 잘 됐어요.
이 코드를 사용해 보십시오.
create or replace package tq84 as
return varchar2(10);
somevar varchar2(5);
somevar varchar2(5);
end tq84;
/
set serveroutput on
BEGIN
tq84.return:='Test';
dbms_output.put_line(tq84.return);
END;
/
이는 반환을 변수로 표시하고 다른 이름의 동일한 변수를 두 번 이상 선언할 수 있도록 합니다.
이제 일부 var에 액세스하려고 하면 다음과 같은 정보가 표시됩니다.
PLS-00371: at most one declaration for 'TQ84.SOMEVAR' is permitted
그래서 분명히 어떤 이유로 검사가 지연됩니다.
컴파일할 때 이러한 문제를 어떻게 감지할 수 있는지 방금 알게 되었습니다.추가할 항목:
alter session set plsql_warnings = 'enable:all';
위의 코드는 다음과 같은 경고와 컴파일됩니다.
LINE/COL ERROR
-------- -----------------------------------------------------------------
1/1 PLW-05018: unit TQ84 omitted optional AUTHID clause; default
value DEFINER used
2/3 PLW-06010: keyword "RETURN" used as a defined name
4/3 PLW-05001: previous use of 'SOMEVAR' (at line 3) conflicts with
this use
JOTN의 답변이 옳다는 설명을 추가하고 싶습니다.컴파일러가 동일한 이름으로 여러 변수를 선언할 수 있도록 하는 것은 좋지 않은 것 같지만, 이것은 PL/SQL이 메서드 오버로드를 구현하는 방식의 부작용일 수 있습니다.런타임에 이름이 여러 번 선언된 경우 오류가 발생합니다.
당신의 원래 예와 같은 표본에서, 그것은 명백합니다.return
변수 이름으로 사용되고 있습니다.아래와 같이 값을 할당하고 읽을 수 있습니다.
dev> set serveroutput on
dev> create or replace package test
2 as
3 return varchar2(10);
4 end test;
5 /
Package created.
dev> exec test.return := 'Hi!';
PL/SQL procedure successfully completed.
dev> exec dbms_output.put_line( test.return );
Hi!
PL/SQL procedure successfully completed.
dev> create or replace package test
2 as
3 return varchar2(10);
4 return varchar2(20);
5 end test;
6 /
Package created.
dev> exec test.return := 'Hi!';
BEGIN test.return := 'Hi!'; END;
*
ERROR at line 1:
ORA-06550: line 1, column 12:
PLS-00371: at most one declaration for 'TEST.RETURN' is permitted
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
언급URL : https://stackoverflow.com/questions/4510064/is-this-a-bug-in-the-pl-sql-compiler
'programing' 카테고리의 다른 글
C# 및 ODP.NET에서 패키지의 함수를 호출하기 위한 코드 (0) | 2023.07.27 |
---|---|
목표 C HTML 이스케이프/에스케이프 해제 (0) | 2023.07.27 |
MariaDB Connector v1.0.5 및/또는 Mysql Connection v 5.3.4 컴파일 (0) | 2023.07.27 |
Python의 산점도 및 색상 매핑 (0) | 2023.07.27 |
Angular 2에서 한 구성 요소에서 다른 구성 요소로 객체를 전달하는 방법은 무엇입니까? (0) | 2023.07.27 |