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

फोर्स ओरेकल ड्रॉप ग्लोबल टेम्प टेबल

Oracle वैश्विक अस्थायी तालिकाएँ क्षणिक वस्तु नहीं हैं। वे उचित ढेर टेबल हैं। हम उन्हें एक बार और कोई भी सत्र . बनाते हैं उनका उपयोग डेटा संग्रहीत करने के लिए कर सकते हैं जो केवल उस सत्र . के लिए दृश्यमान है ।

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

मुद्दा यह है कि हमें अस्थायी तालिकाओं को छोड़ना और फिर से बनाना नहीं है। यदि आप SQL सर्वर शैली तर्क को Oracle में पोर्ट करने का प्रयास कर रहे हैं तो आपको अस्थायी डेटा इन-मेमोरी बनाए रखने के लिए PL/SQL संग्रह का उपयोग करने पर विचार करना चाहिए। और अधिक जानकारी प्राप्त करें।

ORA-14452 . का विशिष्ट कारण यह है कि हम एक वैश्विक अस्थायी तालिका को नहीं छोड़ सकते हैं जिसमें सत्र के दौरान डेटा शामिल होने पर सत्र का दायरा दृढ़ता है। भले ही टेबल वर्तमान में खाली हो...

SQL> create global temporary table gtt23 (col1 number)
  2  on commit preserve rows
  3  /

Table created.

SQL> insert into gtt23 values (1);

1 row created.

SQL> commit;

Commit complete.

SQL> delete from gtt23;

1 row deleted.

SQL> commit;

Commit complete.

SQL> drop table gtt23;
drop table gtt23
           *
ERROR at line 1:
ORA-14452: attempt to create, alter or drop an index on temporary table already in use

SQL>

समाधान सत्र को समाप्त करना और फिर से कनेक्ट करना है, या (कुछ हद तक विचित्र रूप से) तालिका को छोटा करना और फिर उसे छोड़ देना है।

SQL> truncate table gtt23;

Table truncated.

SQL> drop table gtt23;

Table dropped.

SQL> 

यदि कोई अन्य सत्र वैश्विक अस्थायी तालिका का उपयोग कर रहा है - और यह संभव है (इसलिए वैश्विक नामकरण) तब आप सभी सत्रों के डिस्कनेक्ट होने तक तालिका को छोड़ने में सक्षम नहीं होंगे।

तो वास्तविक समाधान वैश्विक अस्थायी तालिकाओं का ठीक से उपयोग करना सीखना है:प्रत्येक रिपोर्ट से मेल खाने के लिए विशिष्ट वैश्विक अस्थायी तालिकाएँ बनाएँ। या, जैसा कि मैं कहता हूं, इसके बजाय पीएल/एसक्यूएल संग्रह का उपयोग करें। या, यहां तक ​​​​कि, केवल अच्छी तरह से ट्यून किए गए SQL लिखना सीखें। अक्सर हम एक खराब लिखित क्वेरी के समाधान के रूप में अस्थायी तालिकाओं का उपयोग करते हैं जिसे बेहतर पहुंच पथ के साथ सहेजा जा सकता है।

आपका पूरा कोड देखने के बाद, प्रवाह और भी विचित्र लगता है:

  1. एक वैश्विक अस्थायी तालिका छोड़ें और फिर से बनाएं
  2. अस्थायी तालिका भरें
  3. अस्थायी तालिका से PL/SQL सरणी में चयन करें
  4. पीएल/एसक्यूएल सरणी से बल्क इंसर्ट का उपयोग करके वास्तविक तालिका में सम्मिलित करें

यहाँ बहुत अधिक ओवरहेड और व्यर्थ गतिविधि है। आपको बस इतना करना है कि आप जो डेटा डालें उसे v2d_temp . में लें और सीधे vertical_design को पॉप्युलेट करें , आदर्श रूप से INSERT INTO के साथ ... चयन करें * कथन से। JSON सरणी को क्वेरी में बदलने के लिए आपको कुछ पूर्व-प्रसंस्करण की आवश्यकता होगी, लेकिन यह जावा या PL/SQL में प्राप्त करना आसान है।

मुझे यह निश्चित लगता है कि वैश्विक अस्थायी तालिकाएँ आपके परिदृश्य के लिए सही समाधान नहीं हैं।

<ब्लॉकक्वॉट>

"हमारे बॉस या अन्य लोग अपने तरीके से कुछ न कुछ करते रहते हैं, इसलिए आप उसे बदल नहीं सकते"

आपके पास एक बॉस समस्या है प्रोग्रामिंग समस्या . नहीं है . नतीजतन यह ऑफ-विषय है जहां तक ​​​​स्टैक ओवरफ्लो जाता है। लेकिन फिर भी यहाँ कुछ सुझाव दिए गए हैं।

याद रखने वाली महत्वपूर्ण बात यह है कि हम कुछ उप-इष्टतम वास्तुकला पर किसी समझौते के बारे में बात नहीं कर रहे हैं:जो आपके बॉस ने स्पष्ट रूप से प्रस्तावित किया है काम नहीं करेगा एक बहु-उपयोगकर्ता वातावरण में। तो, आपके विकल्प हैं:

  1. ORA-14452 पर ध्यान न दें त्रुटि, उत्पादन में आगे बढ़ें और फिर "लेकिन आपने मुझे बताया" रक्षा का उपयोग करें जब यह सब बहुत गलत हो जाए। यह सबसे कमजोर नाटक है।
  2. वैश्विक तालिकाओं को गुप्त रूप से रद्दी करें और कुछ ऐसा लागू करें जो बहु-उपयोगकर्ता परिदृश्य में काम करेगा। यह उच्च जोखिम वाला है क्योंकि यदि आप कार्यान्वयन को विफल करते हैं तो आपके पास कोई बचाव नहीं है।
  3. अपने बॉस से बात करें। उन्हें बताएं कि आप ORA-14452 . में चल रहे हैं त्रुटि, मान लें कि आपने कुछ जांच की है और यह इस तरह से वैश्विक अस्थायी तालिकाओं का उपयोग करने के साथ एक मौलिक समस्या प्रतीत होती है लेकिन जाहिर है कि आपने कुछ अनदेखा कर दिया है। फिर, उनसे पूछें कि जब उन्होंने इसे पहले लागू किया है तो उन्हें इस समस्या से कैसे निजात मिली। यह कई तरह से हो सकता है, हो सकता है कि उनके पास एक समाधान हो, शायद उन्हें पता चलेगा कि वैश्विक अस्थायी तालिकाओं का उपयोग करने का यह गलत तरीका है, हो सकता है कि वे आपको खो जाने के लिए कहें। किसी भी तरह से, यह सबसे अच्छा तरीका है:आपने चिंताओं को उचित स्तर तक उठाया है।

शुभकामनाएँ।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एजेंट अवरुद्ध है

  2. Oracle SQL डेवलपर में डेटाबेस का नाम कैसे क्वेरी करें?

  3. ओरेकल में लोअरकेस अक्षरों वाली पंक्तियों को खोजने के 4 तरीके

  4. स्ट्रिंग ISO-8601 दिनांक को oracle के टाइमस्टैम्प डेटाटाइप में बदलें

  5. PowerShell में SQL प्लस स्क्रिप्ट कैसे चलाएं