2010-12-22 11 views
14

हमारे SVN-कोड भंडार में, मैं कुछ लाइनों को हटानेक्या यह पीएल/एसक्यूएल कंपाइलर में एक बग है?

create or replace package tq84 as 
    return varchar2(10); 
end tq84; 
/

करने पर निर्भर करता एक पैकेज विनिर्देश कि -After में आए मुझे ऐसा लगता है कि इस तरह के एक विनिर्देश भावना की बहुत नहीं है और इसलिए बिल्कुल संकलित नहीं होना चाहिए। लेकिन शायद, मुझे स्पष्ट दिखाई नहीं दे रहा है, तो: क्या यह वास्तव में एक बग है?

completness के लिए 'खातिर:

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 ऊपर दिए गए के रूप में में कीवर्ड लेकिन एक (पैकेज) अलग-अलग नहीं है। लेकिन यह मामला होने के लिए नहीं लगता है के बाद से निम्नलिखित समान रूप से ठीक संकलित:

create or replace package tq84 as 

    return varchar2(10); 
    return number; 
    return date; 

end tq84; 
/

और स्पष्ट रूप से, संकलक ने मुझे बताया कि मैं एक ही चर कई बार घोषित करना चाहिए।

संपादित 2: JOTN, सही निश्चित रूप से है, और return एक चर रहा है, और इसके अलावा, संकलक अग्रिम नहीं बताता है, अगर एक ही नाम के साथ एक चर दो बार या उससे अधिक घोषित किया जाता है, बजाय , यह रनटाइम पर्यावरण है, जो करता है।

तो, इस बात को ध्यान में साथ, यह संभव तरह

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 एक चर नाम के रूप में अनुमति दी है, लेकिन फिर, यह अगर संकलक कम से कम एक चेतावनी देना चाहिए अगर एक ही नाम के साथ एक चर रहा है विवादास्पद है कई बार घोषित किया।

+0

मैंने अभी चेतावनी दी कि कैसे चेतावनियां चालू करें। – JOTN

+3

यह एक बग नहीं है ... इसकी एक विशेषता है;) – guigui42

उत्तर

9

स्पष्ट रूप से यह आपको एक चर के रूप में "वापसी" नाम का उपयोग करने की अनुमति देता है। उस स्थिति में यह एक पैकेज चर घोषित कर रहा है। मुझे लगता होगा कि यह असफल होगा क्योंकि यह एक कीवर्ड है, लेकिन मैंने कोशिश की और यह काम किया।

इस कोड का प्रयास करें:

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; 
/

यह एक चर के रूप में वापसी से पता चलता है और यह एक और नाम का एक ही चर एक बार से अधिक घोषित करने की अनुमति देता है।

अब अगर आप somevar तक पहुँचने का प्रयास है, तो आप इस मिल:

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 
3

बस आगे चित्रण जोड़ने के लिए है कि JOTN के जवाब सही है चाहता था। यह बुरा लगता है कि संकलक आपको एक ही नाम के साथ कई चर घोषित करने देता है, लेकिन हो सकता है कि यह पीएल/एसक्यूएल विधि ओवरलोडिंग को कैसे लागू करता है इसका दुष्प्रभाव है। रनटाइम पर, यदि नाम कई बार घोषित किया गया है तो यह एक त्रुटि उठाता है।

अपने मूल उदाहरण की तरह नमूना में, यह स्पष्ट है कि 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 
संबंधित मुद्दे