2016-09-16 7 views
15

यह थोड़ा अजीब लग रहा है लेकिन Oracle 11g वास्तव में इस तरह के एक प्रश्नओरेकल को एक ही खंड में समान alias_name के साथ कई सबक्वायरीज़ क्यों अनुमति देते हैं?

with 
    a as (select 1 from dual), 
    a as (select 2 from dual) 
select * 
from a; 

चलाने के लिए यह पहली बार सबक्वेरी के परिणाम देता है की अनुमति देता है (अर्थात 1)।

मैं ऐसी स्थिति की कल्पना नहीं कर सकता जब ऐसी सुविधा उपयोगी हो। मेरे मामले में यह एक समस्या का कारण बन गया जब मैं प्रतिलिपि/पेस्ट करने के बाद एक सबक्वायरी का नाम बदलना भूल गया और समग्र क्वेरी गलत/अप्रत्याशित परिणाम लौट रही थी। सौभाग्य से क्वेरी काफी सरल थी और कारण तुरंत पता चला था।

वैसे भी, मैं ओरेकल को ऐसे मामले में फेंकने और अपवाद की उम्मीद करता हूं।

तो, मेरा सवाल यह है कि क्या ऐसा व्यवहार एक विशेषता या बग है? यदि सुविधा, जहां यह उपयोगी हो सकता है?

धन्यवाद।

बीटीडब्ल्यू, SQLite समान क्वेरी को चलाने और 'डुप्लिकेट WITH तालिका नाम' अपवाद फेंकने की अनुमति नहीं देता है। अभी तक किसी अन्य डीबी इंजन का प्रयास नहीं किया।

+0

पोस्टग्रेज़ या तो अनुमति नहीं देता है। –

+1

मुझे लगता है कि यह एक बग है - आप निश्चित रूप से माई ओरैकल सपोर्ट पर कोई मुद्दा उठा सकते हैं। –

+0

12.1.0.2 में पुन: उत्पादित। –

उत्तर

-2

यह उपयोगी नहीं है, लेकिन यह ओरेकल कॉलम नामों को डुप्लिकेट करने के तरीके के अनुरूप है।

+1

क्या आप इस पर विस्तृत जानकारी दे सकते हैं?ओरेकल डुप्लिकेट कॉलम नामों के साथ क्या करता है जो अन्य डीबीएमएस सामान्य रूप से नहीं करते हैं? –

1

साथ क्लॉज का उपयोग कार्यों के साथ भी किया जा सकता है। मुझे यकीन नहीं है कि यह 11 जी के साथ उपलब्ध था, लेकिन यह 12 सी के साथ है। तो यह "बग" अधिभारित कार्यों के लिए आवश्यक हो सकता है।

उदाहरण के लिए, यह प्रक्रिया एक ही इनपुट/आउटपुट डेटा प्रकारों के साथ दो बार सटीक उसी फ़ंक्शन का उपयोग करती है।

WITH 
    FUNCTION get_date(pid IN VARCHAR2) RETURN VARCHAR2 IS 
BEGIN 
RETURN 'date is '|| pid; 
END; 
    FUNCTION get_date(pid IN VARCHAR2) RETURN VARCHAR2 IS 
BEGIN 
RETURN 'date is '|| pid; 
END; 
SELECT get_date(cast(sysdate as varchar2(20))) 
FROM dual 
; 
/

जैसी उम्मीद थी, यह एक त्रुटि देता है:

ORA-06553: PLS-305: previous use of 'GET_DATE' (at line 1) conflicts with this use 

लेकिन अगर आप समारोह को ओवरलोड, तो यह एक ही नाम है, लेकिन विभिन्न पैरामीटर प्रकार स्वीकार करता है, यह काम करेंगे। प्रक्रिया बिना त्रुटि के चलती है, और परिवर्तनीय डेटा प्रकार के आधार पर, सही फ़ंक्शन का उपयोग किया जाता है।

WITH 
    FUNCTION get_date(pid IN VARCHAR2) RETURN VARCHAR2 IS 
BEGIN 
RETURN 'date is '|| pid; 
END; 
    FUNCTION get_date(pid IN DATE) RETURN VARCHAR2 IS 
BEGIN 
RETURN pid+1; 
END; 
SELECT 
get_date(cast(sysdate as varchar2(20))) /*example1*/ 
--get_date(sysdate)     /*example2*/ 
FROM dual 
; 
/

उदाहरण 1 उत्पादन: date is 16-MAR-17 उदाहरण 2 उत्पादन: 17-MAR-17

तो शायद ही नाम के साथ सबक्वेरी का उपयोग करने में सक्षम होने अतिभारित कार्यों की इजाजत दी से संबंधित है। हालांकि यह अभी भी छोटी गाड़ी लगता है, और मैं इस पर दस्तावेज़ीकरण नहीं ढूंढ पा रहा हूं।

संबंधित मुद्दे