PL/SQL

2010-08-11 11 views
6

में एक अस्थायी तालिका मैं एक Oracle 10g डाटाबेस के साथ काम कर रहा हूँ बनाएँ, और मैं एक मेज से रिकॉर्ड के एक समूह को निकालने, और उसके बाद का उपयोग करें कि संबंधित तालिकाओं का एक समूह से बाहर रिकॉर्ड खींचने के लिए करना चाहते हैं।PL/SQL

इस तो T-SQL थे मैं इसे इस तरह कुछ करना चाहते हैं,:,

CREATE TABLE #PatientIDs (
    pId int 
) 

INSERT INTO #PatientIDs 
    select distinct pId from appointments 

SELECT * from Person WHERE Person.pId IN (select pId from #PatientIDs) 

SELECT * from Allergies WHERE Allergies.pId IN (select pId from #PatientIDs) 

DROP TABLE #PatientIDs 

हालांकि, सभी उपयोगी पृष्ठों मैं मेकअप को देखो यह एक बहुत अधिक काम की तरह लग रहे तुलना में यह संभवतः हो सकता है तो मुझे लगता है कि मुझे कुछ स्पष्ट याद आना चाहिए।

(बीटीडब्लू, इसे एक स्क्रिप्ट के रूप में चलाने के बजाय, मैं शायद ओरेकल एसक्यूएल डेवलपर में एक सत्र खोलूंगा, अस्थायी तालिका बनाउंगा, और उसके बाद प्रत्येक क्वेरी को चलाऊंगा, सीएसवी को निर्यात करूँगा जैसा कि मैं साथ जाऊंगा। कि काम करता है?)

धन्यवाद!

+0

क्यों आप अस्थायी तालिका कदम की जरूरत है? आप बस एक चयन को दूसरे के साथ बदल रहे हैं। क्या प्रारंभिक चयन बहुत महंगा है - या यदि समवर्ती लेन-देन चीजों को बदलता है तो क्या यह है? –

+4

ओरेकल SQL सर्वर नहीं है, और ऐसी परिस्थितियां जहां हमें अस्थायी तालिकाओं का उपयोग करने की आवश्यकता है, वास्तव में काफी असामान्य हैं। http://stackoverflow.com/questions/1192265/local-temporary-table-in-oracle-10-for-the-scope-of-stored-procedure/1193443#1193443 – APC

+0

मैं: कृपया इस समान प्रश्न करने के लिए अपने जवाब पढ़ें सरलीकृत कर रहा था - जो मैं वास्तव में करने की कोशिश कर रहा था वह पिछले 100 रोगियों को पकड़ लेता था (कम से कम डुप्लिकेशंस)। लेकिन नीचे बात करते हुए मुझे याद दिलाया कि मैं आज सुबह मध्यरात्रि से शुरू होने वाले 100 मरीजों को पकड़ सकता हूं, और साथ ही साथ चलने के बाद SYSDATE के बारे में चिंता करने की ज़रूरत नहीं है। :-) – SarekOfVulcan

उत्तर

12

ओरेकल अस्थायी तालिकाओं है, लेकिन वे स्पष्ट सृजन की आवश्यकता:

create global temporary table... 

एक अस्थायी तालिका में डेटा सत्र है कि यह बनाया है और सत्र-विशिष्ट या लेन-देन विशिष्ट हो सकता है के लिए निजी है। यदि डेटा सत्र के समाप्त होने तक हटाए जाने के लिए नहीं है, आप बयान बनाने के अंत में ON COMMIT PRESERVE ROWS उपयोग करने के लिए की जरूरत है। उनके लिए कोई रोलबैक या प्रतिबद्ध समर्थन भी नहीं है ...

मुझे आपके द्वारा दिए गए उदाहरण में अस्थायी तालिकाओं की कोई आवश्यकता नहीं दिखती है - यह जोखिम है कि APPOINTMENTS तालिका में किए गए अपडेट को अस्थायी रूप से अस्थायी रूप से प्रदर्शित नहीं किया जाएगा।

SELECT p.* 
    FROM PERSON p 
WHERE EXISTS (SELECT NULL 
       FROM APPOINTMENTS a 
       WHERE a.personid = a.id) 

SELECT p.* 
    FROM PERSON p 
WHERE p.personid IN (SELECT a.id 
         FROM APPOINTMENTS a) 

SELECT DISTINCT p.* 
    FROM PERSON p 
    JOIN APPOINTMENTS a ON a.id = p.personid 

में शामिल होने के जोखिम डुप्लिकेट अगर वहाँ एक से अधिक नियुक्ति एक ही व्यक्ति के रिकॉर्ड, जिसके कारण मैं DISTINCT जोड़ा से जुड़े रिकॉर्ड कर रहे हैं: में/प्रयोग करें/शामिल हों मौजूद है।

+0

इस तरह मैं पहली बार में यह कर विचार कर रहा था था, लेकिन मैं, apptDate SarekOfVulcan

+0

कल है 'apptdDate> = TRUNC (sysdate) -1 और apptdDate ThinkJet

5

जबकि सही समस्या हल हो गई है, यदि आप इस क्षेत्र में कुछ उपयोगी कौशल बनाना चाहते हैं, तो मैं पीएल/एसक्यूएल संग्रहों पर विशेष रूप से थोक/एसक्यूएल संग्रह (बल्क संग्रह/थोक बाइंड), रिटर्निंग क्लॉज, और% ROWTYPE का उपयोग करके संग्रह को परिभाषित करना।

आप नाटकीय रूप से समझने के माध्यम से PL/SQL कोड की राशि है जो आप लिखना कम कर सकते हैं सब से ऊपर - हालांकि हमेशा याद रखना कि एक सब एसक्यूएल समाधान लगभग हमेशा एक PL/SQL एक हरा होगा।

6

ओरेकल लापरवाही से एसक्यूएल सर्वर के रूप में एक ही तरह से अस्थायी टेबल बनाने के लिए सुविधा नहीं है। आपको तालिका स्कीमा (create global tempory table) में स्पष्ट रूप से तालिका बनाना है। इसका यह भी अर्थ है कि आपको अनुमतियों की आवश्यकता है जो आपको टेबल बनाने की अनुमति देते हैं, और स्क्रिप्ट को डेटाबेस परिवर्तन के रूप में स्पष्ट रूप से तैनात किया जाना चाहिए। तालिका वैश्विक नाम स्थान में भी दिखाई दे रही है।

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

Idiomatic PL/SQL प्रक्रियात्मक कोड को छोड़ने के लिए बहुत तेज़ है, और शायद आप नकली अस्थायी तालिकाओं की कोशिश करने से ऐसा करना बेहतर होगा। ध्यान दें कि पीएल/एसक्यूएल में कर्सर और नेस्टेड परिणाम सेट (कर्सर एक्सप्रेशन) पर स्पष्ट समांतर प्रसंस्करण के लिए प्रवाह नियंत्रण जैसे प्रदर्शन उन्मुख संरचनाएं हैं; हाल के संस्करणों में एक जेआईटी कंपाइलर है।

आप उपकरण प्रक्रियात्मक PL/SQL कोड जल्दी से रन बनाने के लिए की एक श्रृंखला के लिए उपयोग किया है, और यह यकीनन मुहावरेदार PL/SQL प्रोग्रामिंग है। अंतर्निहित प्रतिमान T-SQL से कुछ अलग है, और अस्थायी तालिकाओं के लिए दृष्टिकोण प्रमुख अंक जहां प्रणाली वास्तुकला और प्रोग्रामिंग मुहावरों अलग से एक है।

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