ORGANIZATION
. से सब कुछ आगे पीएल/एसक्यूएल कोड के रूप में देखा जा रहा है, आपके गतिशील एसक्यूएल कथन का हिस्सा नहीं। आप तालिका के नाम को create table
. में जोड़ रहे हैं लेकिन फिर बाकी को उस स्टेटमेंट स्ट्रिंग के हिस्से के रूप में नहीं जोड़ना। आपको कुछ ऐसा करने की ज़रूरत है:
execute immediate 'create table ' || p_tab_name || '
( /* put column names and types here */ )
ORGANIZATION EXTERNAL
(
TYPE ORACLE_LOADER
DEFAULT DIRECTORY DE_DUBFILE
ACCESS PARAMETERS
(
RECORDS DELIMITED BY NEWLINE
CHARACTERSET US7ASCII
BADFILE UPLOAD:''' || p_tab_name || '.bad''
DISCARDFILE UPLOAD:''' || p_tab_name || '.dis''
LOGFILE UPLOAD:''' || p_tab_name || '.log''
FIELDS TERMINATED BY '',''
optionally enclosed by ''"''
MISSING FIELD VALUES ARE NULL
(
t1 ,t2,t3,t4,t5 date mask "YYYYMMDD" ,t6,t7,
t8 ,t9, t10,t11
)
LOCATION (''' || DATAFILE || ''')
)';
पहली पंक्ति में टर्मिनेटिंग सेमीकोलन को एक नए स्ट्रिंग लिटरल के संयोजन से बदल दिया गया है। चर के संदर्भ p_tab_name
और DATAFILE
उस शाब्दिक से भी अलग होना होगा, और अधिक एकल उद्धरण और संयोजन की आवश्यकता होगी; और सिंगल कोट्स जो वास्तव में स्टेटमेंट का हिस्सा हैं, उन्हें दोगुना करके बचने की जरूरत है। कई अन्य उद्धरण भी गायब थे। जो दिखाया गया है वह अब चलना चाहिए।
मैंने उपयोग किए जा रहे तालिका नाम को भी केवल p_tab_name
. में बदल दिया है , लेकिन आपको कॉलम नाम और डेटा प्रकार स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता है। as select * ...
एक बाहरी तालिका के लिए। यह कानूनी वाक्यविन्यास नहीं है, या तो ORGANIZATION
. से पहले या बाकी के बाद यदि वर्तमान कथन। मुझे लगता है कि आप उस जानकारी को all_tab_columns
. से निकाल सकते हैं और उस हिस्से को गतिशील रूप से भी बनाएं, लेकिन यदि आप इसे एक निश्चित तालिका पर आधारित कर रहे हैं तो आपको वैसे भी उनको जानना चाहिए।
छोड़ने/बनाने का आपका तर्क भी बंद है - मुझे लगता है कि आप बस चाहते हैं:
if n>0 then
execute immediate 'drop table ' || p_tab_name;
end if;
execute immediate 'create table ' || p_tab_name || '
...
... इसलिए आपको दोनों शाखाओं में क्रिएट स्टेटमेंट को दोहराने की जरूरत नहीं है।
मैंने कुछ अन्य गलतियों को भी सुधारा है; PARAMETERS
इसके बजाय PARAMETERS
; FIELDS
इसके बजाय FILEDS
; हटा दिया गया TRAILING NULLCOLS
. कमांड को डायनामिक में बदलने से पहले स्टैटिक SQL के रूप में निष्पादित करने का प्रयास करें। अभी भी अन्य मुद्दे हो सकते हैं।
और मैंने पिछले दो परिकलित कॉलम हटा दिए हैं:
DETL_CLMNS_HASH "ORA_HASH( :t4||:t7 )",
KEY_CLMNS_HASH "ORA_HASH(:t1||:t2||:t5)")
ORACLE_LOADER
ड्राइवर
उस तरह के जोड़तोड़ की अनुमति नहीं देता है; एसक्यूएल * लोडर करता है लेकिन वे बिल्कुल वही नहीं हैं। आप बाहरी टेबल पर वर्चुअल कॉलम भी परिभाषित नहीं कर सकते हैं। यदि आप इसे किसी अन्य (वास्तविक) तालिका में डेटा लोड करने के लिए एक स्टेजिंग टेबल के रूप में उपयोग कर रहे हैं तो आप स्थानांतरण के दौरान उन हैश की गणना कर सकते हैं; अन्यथा आप इस बाहरी तालिका पर एक दृश्य बना सकते हैं जिसमें परिकलित कॉलम शामिल हैं।