आप एक स्टेटमेंट में दो टेबल से डिलीट नहीं कर सकते - insert all
. के बराबर कोई डिलीट नहीं है . (जब तक कि आपके पास ऐसी बाधाएँ न हों जो डिलीट को कैस्केड करती हैं, या ऐसा ट्रिगर जो मैन्युअल रूप से करता है)। दस्तावेज
दिखाता है कि आपका सिंटैक्स मान्य नहीं है, क्योंकि एक से अधिक तालिका निर्दिष्ट करने का कोई पथ नहीं है।
आपको पहले चाइल्ड टेबल से रिकॉर्ड्स को हटाने के लिए दो डिलीट स्टेटमेंट्स की आवश्यकता होगी:
DELETE FROM login
WHERE login.id_user_login = p_id_user;
DELETE FROM users
WHERE users.id_user = p_id_user;
आप कर सकते थे अपनी विदेशी कुंजी बाधा को delete cascade
. में बदलें :
alter table login add constraint login_fk_user foreign key (id_user_login)
references users(id_user) on delete cascade;
... जिसका अर्थ यह होगा कि आपको केवल users
. से स्पष्ट रूप से हटाना होगा मेज़; लेकिन यह वास्तव में वह नहीं हो सकता है जो आप चाहते हैं, क्योंकि यह एक स्तर के सत्यापन को हटा देता है - यदि आप बच्चे हैं तो आप मूल कुंजी को गलती से हटा देना चाहते हैं। दो डिलीट जारी करना वास्तव में यहां चोट नहीं पहुंचाता है।
संयोग से, आपकी पहली प्रक्रिया प्रतिबद्ध नहीं है, जिसकी आप अपेक्षा कर रहे होंगे। इस पंक्ति में:
...
SELECT * FROM DUAL COMMIT;
... COMMIT
DUAL
. के लिए एक उपनाम के रूप में व्याख्या की गई है तालिका, एक अलग आदेश नहीं। DUAL
. के बाद आपको एक अर्धविराम की आवश्यकता होगी , और अधिमानतः COMMIT;
. के लिए एक नई लाइन . लेकिन आमतौर पर इसे बेहतर नहीं माना जाता है एक प्रक्रिया में प्रतिबद्ध होने के लिए, और शीर्ष-स्तरीय कॉलर को यह तय करने दें कि डेटा अखंडता को बनाए रखने के लिए प्रतिबद्ध या रोल बैक करना है या नहीं।