2010-09-10 16 views
5

ओरेकल में, आप कुछ का उपयोग कर एक अस्थायी तालिका बना सकते हैं जैसे:एसक्यूएल सर्वर/ओरेकल: निजी अस्थायी टेबल

CREATE GLOBAL TEMPORARY TABLE temp_table (
    field1 NUMBER, 
    field2 NUMBER 
) 
ON COMMIT DELETE ROWS; 

... जो सुंदर निफ्टी हो सकता है, क्योंकि यह सभी को दिखाई देने वाली तालिका बनाता है, लेकिन तालिका में एक INSERT डेटा केवल दृश्यमान होता है उसे या उसके लिए। इसके अतिरिक्त, लेन-देन के अंत में या सत्र (इसकी घोषणा के आधार पर) उस डेटा को स्वचालित रूप से हटा दिया जाता है, जिससे हर किसी के अस्थायी डेटा को बिना किसी नुकसान पहुंचाया जाता है।

SQL सर्वर में, हालांकि, आप एक temp तालिका बना सकते हैं:

CREATE TABLE #temp_table (field1 INT, field2 INT); 

... जो, जैसा कि मैं इसे समझता हूं, ओरेकल के कार्यान्वयन से काफी और कार्यात्मक रूप से अलग है। यह अस्थायी तालिका केवल आपके लिए दृश्यमान है, और उपयोग के तुरंत बाद (तालिका) गिरा दी गई है।

क्या ऊपर वर्णित ओरेकल व्यवहार की नकल करने के लिए SQL सर्वर में कोई क्षमता है? या अस्थायी डेटा के साथ काम करने का एकमात्र तरीका है जिसमें काम के प्रत्येक पुनरावृत्ति के साथ बार-बार सारणी बनाना है?

+0

क्या आप समझा सकते हैं कि आप SQLServer में ओरेकल व्यवहार की नकल क्यों करना चाहते हैं? क्या यह केवल CREATE तालिका कथन निष्पादित करने की आवश्यकता से बचने के लिए है? –

+0

@ मार्क ~ ठीक है, वह मुख्य रूप से। लेकिन अगर मैं (1) दोहराव वाले अस्थायी डेटा आवेषण से निपट रहा था, (2) आम तौर पर एक ही डेटा प्रारूप और फ़ील्ड के साथ, (3) और उपयोगकर्ता-अद्वितीय है (यानी डेटा उपयोगकर्ता सत्र के लिए निजी है), यह बहुत अधिक बनाता है ओरेकल के कार्यान्वयन के अनुसार तालिका में सभी को संभालने का अर्थ। :) –

+0

[ओरेकल निजी अस्थायी टेबल्स] (https://stackoverflow.com/a/48852466/5070879) – lad2025

उत्तर

9

जैसा कि आपने SQL सर्वर & खोजा है ओरेकल अस्थायी सारणी मूल रूप से भिन्न हैं।

ओरेकल वैश्विक अस्थायी सारणी में स्थायी वस्तुएं हैं जो अस्थायी सत्र विशिष्ट (या लेनदेन विशिष्ट) डेटा संग्रहीत करती हैं।

SQL सर्वर अस्थायी सारणी में अस्थायी ऑब्जेक्ट्स अस्थायी डेटा संग्रहीत कर रहे हैं, #temp_tables एक सत्र के लिए स्थानीय डेटा संग्रहीत करते हैं और ## temp_tables वैश्विक डेटा संग्रहीत करते हैं। (मुझे कभी भी SQL सर्वर वैश्विक अस्थायी तालिकाओं की आवश्यकता नहीं है और यह नहीं पता कि वे किस समस्या को हल करते हैं।) यदि संग्रहित प्रक्रिया में #temp_table बनाया गया था तो संग्रहीत प्रक्रिया समाप्त होने पर इसे हटा दिया जाएगा। अन्यथा सत्र बंद होने पर इसे गिरा दिया जाएगा।

और नहीं, वास्तव में SQL सर्वर नकल ओरेकल बनाने का कोई तरीका नहीं है। आप सत्र आईडी संग्रहीत एक अतिरिक्त कॉलम के साथ एक सामान्य तालिका का उपयोग कर सकते हैं। लेकिन आपको कम लॉगिंग के संबंध में अस्थायी तालिकाओं के फायदे नहीं मिलेंगे। आपको अस्थायी डेटा मैन्युअल रूप से हटाना होगा। और समय से पहले छोड़ने वाले सत्रों से सफाई के साथ सौदा करें।

संपादित करें: ओरेकल और एसक्यूएल सर्वर के बीच एक और अंतर यह है कि SQL सर्वर अन्य विवरणों के साथ लेनदेन में डीडीएल को लपेटने की अनुमति देता है। इसलिए यदि आपको एक बड़े लेनदेन के हिस्से के रूप में एक temp तालिका का उपयोग करने की आवश्यकता है, तो create table #table_name... कथन वर्तमान लेनदेन को create table कथन ओरेकल में नहीं करेगा।

+0

~ इसी प्रकार, मैं SQL सर्वर ## temp_tables के आसपास भी अपना सिर नहीं प्राप्त कर सका। :) मान्य है, मैं ओरेकल के अनुसार एक कार्यान्वयन करना चाहता हूं, लेकिन यदि SQL सर्वर में यह संभव नहीं है, तो आपके सुझाव/सबसे अधिक समझ में आता है। धन्यवाद! +1 –

+0

मेरे पास एक सहकर्मी है जिसने ## temp_tables के लिए उपयोग किया है - वह कुछ प्रक्रियाओं के लिए एसएसआईएस का उपयोग करता है और यदि आप एक प्रो में ## का उपयोग करते हैं, और वह प्रो एक अन्य प्रोसेस कहता है, तो proC# 2 ## temp_table का उपयोग कर सकता है। – user158017

+0

@sql_mommy: मेरे पास एक सहकर्मी था जिसने एक समान काम किया था, जिसमें वे कुल प्रोसेस का उपयोग करने के लिए ## टेबल का उपयोग कर रहे थे। हालांकि, उनके पास अंतिम उपयोगकर्ताओं को एक ही प्रक्रिया को बंद करने से रोकने का कोई तरीका नहीं था, जबकि कोई और पहले से चल रहा था, इसलिए जोखिम बढ़ गया कि दोनों उपयोगकर्ताओं के काम वैश्विक अस्थायी तालिका में मिश्रित हो जाएंगे। हमने temp तालिका परिभाषाओं को शीर्ष प्रो में ले जाया, इसलिए सभी बुलाए गए प्रोसेस उन्हें देख सकते थे और उन्हें स्थानीय टेम्पलेट टेबल बना सकते थे। एसएसआईएस के लिए, यदि यह एक बैच प्रक्रिया है जिसे नौकरी से निकाल दिया जाता है, तो शायद ठीक है। –

1

यह बंद है विषय लेकिन आप जानते हैं कि एसक्यूएल सर्वर में आप इस तरह एक अस्थायी तालिका बना सकते हैं: जब आप विभिन्न स्रोतों से डेटा को मर्ज करने की जरूरत है

एसक्यूएल में
select * 
into #temp_table 
from mytable 
+0

हाँ, मैंने किया। फिर भी इसे इंगित करने के लिए धन्यवाद। –

1

अस्थायी तालिकाओं बहुत उपयोगी हो सकता है कि एक आम विलय क्षेत्र है, लेकिन जहां दो स्रोतों के लिए शुद्ध योग की तुलना करने के लिए आपको विलय से पहले रकम की राशि की आवश्यकता है। एक वित्तीय प्रणाली में उपयोगी है। जब हम SQL सर्वर से ओरेकल में चले गए तो मैं निराश था क्योंकि मैंने उस कार्यक्षमता को खो दिया था।

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

मुझे आशा है कि किसी को यह उपयोगी लगेगा। यह उस समय मेरी मदद की।

/*** START NESTED QUERY #1            ***/ 
/*** THE FOLLOWING CREATES TWO TEMP TABLES WITH NET AVAILABLE PER FUND ***/ 
/*** WITH ONE AMOUNT BASED ON KK TABLES AND ONE AMOUNT BASED ON  ***/ 
/*** BUDGETARY GL BALANCES. THEN TEMP TABLES ARE MERGED BY FUND AND ***/ 
/*** NET DIFFERENCE CALCULATED-SELECTING FUNDS WITH DIFFERENCES.  ***/ 
/*** IF BUDGET CHECKING IS COMPLETE AND JOURNALS CREATED AND POSTED ***/ 
/*** THERE SHOULD BE NO DIFFERENCES.         ***/ 

--create a temp table with journal amounts summed by fund code 
CREATE TABLE #JRNLsum(
FUND_CODE char(5), 
JRNLAMT decimal(19,2)) 
INSERT INTO #JRNLsum (FUND_CODE, JRNLAMT) 
select FUND_CODE, sum(MONETARY_AMOUNT * -1) JRNLAMT 
FROM PS_JRNL_LN 
INNER JOIN PS_JRNL_HEADER 
ON PS_JRNL_LN.JOURNAL_ID = PS_JRNL_HEADER.JOURNAL_ID 
where ((ACCOUNT BETWEEN 430000 and 469999) and (FISCAL_YEAR >= '2009')) 
GROUP BY FUND_CODE order by FUND_CODE 


--create a temp table with KK ledger amounts summed by fund code 
CREATE TABLE #KKsum(
FUND_CODE char(5), 
KKAMT decimal(19,2)) 
INSERT INTO #KKsum (FUND_CODE, KKAMT) 
select FUND_CODE, sum(POSTED_TOTAL_AMT * -1) KKAMT 
from PS_LEDGER_KK where LEDGER like 'FUND_%' 
group by FUND_CODE order by FUND_CODE 

--join kk temp date to journal temp data, keep only 
--fund code, kk net amount, and journal net amount 
--and select only fund codes where there is a difference 
--between kk net amount and journal net amount 
select #KKsum.FUND_CODE, JRNLAMT, KKAMT from #JRNLsum 
INNER JOIN #KKsum 
on #KKsum.FUND_CODE=#JRNLsum.FUND_CODE 
where (JRNLAMT - KKAMT) <> 0.00 


--drop the two temp tables 
drop table #KKsum 
drop table #JRNLsum 

/*** END NESTED QUERY #1 
संबंधित मुद्दे