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

PLS-00103 गतिशील SQL के साथ एक बाहरी तालिका बनाना

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 ड्राइवर उस तरह के जोड़तोड़ की अनुमति नहीं देता है; एसक्यूएल * लोडर करता है लेकिन वे बिल्कुल वही नहीं हैं। आप बाहरी टेबल पर वर्चुअल कॉलम भी परिभाषित नहीं कर सकते हैं। यदि आप इसे किसी अन्य (वास्तविक) तालिका में डेटा लोड करने के लिए एक स्टेजिंग टेबल के रूप में उपयोग कर रहे हैं तो आप स्थानांतरण के दौरान उन हैश की गणना कर सकते हैं; अन्यथा आप इस बाहरी तालिका पर एक दृश्य बना सकते हैं जिसमें परिकलित कॉलम शामिल हैं।




  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:निर्यात चयन विवरण परिणाम SQL डेवलपर निर्यात के समान INSERT SQL कथन के रूप में सेट करें

  2. Oracle का to_char () फ़ंक्शन रिक्त स्थान क्यों जोड़ रहा है?

  3. ROW_NUMBER क्वेरी

  4. Oracle SQL का उपयोग करके पार्स Json - JSON_TABLE

  5. Oracle पॉज़िटिव के पीछे देखें