Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

क्रिएट का उपयोग किए बिना Oracle में एक दृश्य को परिभाषित करें

सही अनुमति प्राप्त करना और स्थायी वस्तुएँ बनाना सबसे अच्छा तरीका है। ऐसा लगता है कि इस दृश्य का उपयोग केवल एक ही स्क्रिप्ट में किया जाएगा, जो जरूरी नहीं कि इसे बनाने के लिए इसे कम मान्य बनाता है, लेकिन आपको अपने DBA और नीतियों के आधार पर इसे सही ठहराना कठिन हो सकता है। यह निश्चित रूप से उस दृष्टिकोण को आजमाने लायक है, जैसा कि @DCookie ने सुझाव दिया था।

यदि वह विफल हो जाता है, तो उस क्लाइंट के आधार पर हैकी वर्कअराउंड हो सकते हैं, जिसमें आप इस स्क्रिप्ट को चलाएंगे।

उदाहरण के लिए, SQL*प्लस में यह संभव है प्रतिस्थापन चर का दुरुपयोग करना आप जो वर्णन करते हैं उसके करीब कुछ पाने के लिए। यह define का उपयोग करता है आदेश एक प्रतिस्थापन चर बनाने के लिए जिसमें 'दृश्य' क्वेरी शामिल है, और फिर उस चर का उपयोग WITH के अंदर करता है खंड। (आप संपूर्ण withसे प्रतिस्थापित नहीं कर सकते हैं इस तरह, लेकिन यह वैसे भी इस तरह स्पष्ट हो सकता है)। मैं एक तुच्छ डमी क्वेरी का उपयोग कर रहा हूँ:

define tempview_query = 'SELECT * -
FROM dual -
UNION ALL -
SELECT * -
FROM dual'

WITH tempview AS (&tempview_query)
SELECT * FROM tempview;

WITH tempview AS (&tempview_query)
SELECT * FROM tempview;

जब स्क्रिप्ट चलाई जाती है तो उत्पादित आउटपुट होता है:

D
-
X
X

2 rows selected.


D
-
X
X

2 rows selected.

मैंने set verify off . भी क्रियान्वित किया है प्रतिस्थापनों को छिपाने के लिए, लेकिन इसे चालू करना यह देखने के लिए शिक्षाप्रद हो सकता है कि क्या हो रहा है।

क्वेरी की प्रत्येक पंक्ति के अंत में डैश पर ध्यान दें; वह निरंतरता वर्ण है , और जैसा कि define डॉक्स उल्लेख:

इसलिए set verify on . द्वारा दिखाई गई 'नई' क्वेरी आपकी संपूर्ण दृश्य क्वेरी एक ही पंक्ति में होगी (यदि आप इसे प्रदर्शित करते हैं)। यह संभव है कि एक लंबी पर्याप्त क्वेरी के साथ आप कुछ लाइन की लंबाई सीमा तक पहुंच गए हों, लेकिन उम्मीद है कि आप उस बिंदु तक नहीं पहुंचेंगे (सिवाय आपने किया; नीचे देखें)।

आप SQL डेवलपर में एक ही काम कर सकते हैं, लेकिन वहां निरंतरता को दो डैश का उपयोग करने की आवश्यकता है, इसलिए:

define tempview_query = 'SELECT * --
FROM dual --
UNION ALL --
SELECT * --
FROM dual'

सिवाय इसके कि यह एसक्यूएल * प्लस में निरंतरता के समान नहीं है; यहां परिभाषा को डैश के साथ समाप्त करना है, लेकिन इसे SQL * प्लस दस्तावेज़ों के वर्णन के तरीके से प्रतिस्थापित नहीं किया गया है - इसलिए एक डैश के साथ परिभाषित कार्य करता है लेकिन क्वेरी अमान्य हो जाती है। (कम से कम 4.2.0 में; संभवत:एक बग...) दो डैश का उपयोग करके मल्टी-लाइन डिफाइन स्टिल काम करता है, डैश क्वेरी का हिस्सा बने रहते हैं, लेकिन उन्हें टिप्पणी मार्कर के रूप में माना जाता है; इसलिए वे प्रतिस्थापित क्वेरी को अजीब बनाते हैं (फिर से, यदि आप इसे प्रदर्शित करते हैं) लेकिन इसे काम करना बंद न करें। set verify off . के साथ आप ध्यान नहीं देंगे जब तक कोई v$sql . में न दिखे ।

यदि आपकी क्वेरी 240 वर्णों से अधिक है - जो तब तक संभव है जब तक कि यह किसी भी तरह दोहराने के लिए पर्याप्त छोटा न हो - आप कुछ ऐसा हिट करेंगे:

string beginning "'SELECT * ..." is too long. maximum size is 240 characters.

SQL*Plus और SQL डेवलपर दोनों आपको column ... new_value आदेश :

column tempalias new_value tempview_query
set termout off

select q'[SELECT *
FROM dual
UNION ALL
SELECT *
FROM dual]'
FROM dual;

set termout on

क्वेरी आपके व्यू क्वेरी के टेक्स्ट को एक स्ट्रिंग के रूप में चुनती है; मैंने वैकल्पिक उद्धरण प्रणाली का उपयोग किया है , [] . के साथ सीमांकक के रूप में, इसलिए आपको दृश्य क्वेरी में किसी एकल उद्धरण से बचने की आवश्यकता नहीं है। (आपको एक ऐसा सीमांकक चुनना होगा जो निश्चित रूप से क्वेरी में भी प्रकट नहीं हो सकता है)। यह भी ध्यान रखें कि अब आपको लाइन कंटिन्यूएशन कैरेक्टर की जरूरत नहीं है।

टेक्स्ट शाब्दिक जो क्वेरी उत्पन्न करता है उसे tempalias . के रूप में उपनाम दिया गया है . column कमांड tempview_query सेट करता है जो कुछ भी अलियास्ड कॉलम एक्सप्रेशन में है, उसके लिए प्रतिस्थापन चर। तब प्रतिस्थापन चर का उपयोग पिछले उदाहरणों की तरह ही होता है।

WITH tempview AS (&tempview_query)
SELECT * FROM tempview;

set termout लाइनें बस उस जनरेटिंग क्वेरी को छुपाती हैं; आप अस्थायी रूप से off को छोड़ सकते हैं यह देखने के लिए कि क्वेरी क्या उत्पन्न करती है, और यह कि यह आपके द्वारा अपेक्षित दृश्य क्वेरी से सटीक रूप से मेल खाती है।

अन्य ग्राहकों के पास समान तंत्र हो सकते हैं, लेकिन वे केवल दो ही हैं जिनसे मैं वास्तव में परिचित हूं। मुझे शायद यह भी दोहराना चाहिए कि यह थोड़ा सा हैक है, और ऐसा कुछ नहीं है जिसकी मैं अनिवार्य रूप से अनुशंसा करता हूं...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle:LIKE जहाँ एक स्ट्रिंग का कोई भाग दूसरे स्ट्रिंग के किसी भाग से मेल खाता है

  2. ORACLE - सबक्वेरी पर काउंट चुनें

  3. ओरेकल एक बाधा खोजें

  4. Oracle 10g में पिवट/क्रॉसस्टैब क्वेरी (डायनामिक कॉलम नंबर)

  5. एक विशिष्ट मूल्य (ओरेकल) के लिए सभी तालिकाओं में सभी फ़ील्ड खोजें