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

स्प्रिंग बूट एप्लिकेशन के लिए स्कीमा.एसक्यूएल में मौजूद होने पर ड्रॉप टेबल का उपयोग करने में असमर्थ

आपने अपना जावा कोड नहीं दिखाया है, लेकिन स्टैक ट्रेस से ऐसा लगता है कि आप ScriptUtil's executeSqlScript() विधि , जो डिफ़ॉल्ट अर्धविराम कथन विभाजक का उपयोग करता है।

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

आप उपयोग कर सकते हैं the executeSqlScript() . का संस्करण जो आपको डिफ़ॉल्ट को ओवरराइड करने और / . का उपयोग करने देता है इसके बजाय:

जिसका अर्थ यह होगा कि आपकी स्क्रिप्ट के सभी SQL कथनों को / . का उपयोग करना होगा अर्धविराम के बजाय विभाजक भी:

BEGIN
  EXECUTE IMMEDIATE 'DROP TABLE table_a';
  EXCEPTION
  WHEN OTHERS THEN
  IF SQLCODE != -942 THEN
    RAISE;
  END IF;
END;
/

CREATE TABLE table_a
  (
    id               VARCHAR(5) PRIMARY KEY,
    name             VARCHAR(100)
  )
/

...

जैसा कि टिप्पणियों में बताया गया है, आपका मूल ब्लॉक वैसे भी बिल्कुल सही नहीं था; और create PL/SQL के माध्यम से करने की आवश्यकता नहीं है, भले ही drop होना चाहिए।

लेकिन उस विधि में एक ignoreFailedDrops . भी है ध्वज, जो ठीक वही करता है जो आप चाहते हैं (हालांकि मैं इसे जांचने के लिए परीक्षण नहीं कर सकता):

यदि आप उस संस्करण का उपयोग करते हैं और उस ध्वज के लिए सत्य पास करते हैं तो आपको ड्रॉप के चारों ओर पीएल/एसक्यूएल रैपर की आवश्यकता नहीं होती है; आप अर्धविराम विभाजक रख सकते हैं और इस पर वापस जा सकते हैं:

DROP TABLE table_a;

CREATE TABLE table_a
(
    id                       VARCHAR(5) PRIMARY KEY,
    name                     VARCHAR(100)
);

...

यदि आपकी स्कीमा स्क्रिप्ट में कोई अन्य पीएल/एसक्यूएल - ट्रिगर, पैकेज इत्यादि शामिल है - तो फिर भी आपको हर चीज के लिए स्लैश विभाजक (या अपनी पसंद का कोई अन्य विभाजक; स्लैश पारंपरिक है) का उपयोग करने के लिए स्विच करने की आवश्यकता होगी।

  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 11g प्रतिकृति - दूरस्थ डेटाबेस (डेटाबेस लिंक) के साथ रिफ्रेश ऑन रिफ्रेश का उपयोग करना

  2. संग्रह और व्यवस्था पर Oracle तालिका अभिव्यक्ति

  3. Oracle खाली स्ट्रिंग्स को NULL मानता है जबकि SQL सर्वर नहीं करता है - यह सबसे अच्छा कैसे संभाला जाता है?

  4. Oracle के साथ भौतिकीकृत दृश्य

  5. varchar2(n BYTE|CHAR) डिफ़ॉल्ट -> CHAR या BYTE