Saya mahu menjalankan skrip sql yang mengandungi pangkalan data dan penciptaan jadual serta penciptaan prosedur tersimpan. Tetapi apabila saya cuba menjalankan skrip sql dalam pustaka pangkalan data menggunakan kata kunci execute sql
ProgrammingError: (1064, "Anda mempunyai ralat dalam sintaks SQL anda; semak manual yang sepadan dengan versi pelayan MariaDB anda untuk sintaks yang betul untuk digunakan berhampiran 'DELIMITER $$n BUAT ATAU PROSEDUR GANTI `proc_GetCustomerDetails`(n I...' di baris 2")
Sebelum prosedur tersimpan, saya mempunyai pembatas:
DELIMITER $$ BUAT ATAU GANTIKAN PROSEDUR `proc_GetCustomerDetails`( DALAM CustomerNbr LONGTEXT, DALAM LANG VARCHAR(5) ) DETERMINISTIK BERMULA JIKA Lang ADALAH NULL MAKA TETAPKAN lang = "fin"; TAMAT JIKA; PILIH * daripada dbname.customer; TAMAT;$$ DELIMITER ;
Jika saya mengulas bahagian prosedur yang disimpan, fail sql akan berjalan tanpa ralat bersama-sama dengan penyataan penciptaan jadual yang lain.
Saya mencari di Google dan tidak menemui soalan berkaitan. Saya nampak kami mempunyai kata kunci yang memanggil prosedur tersimpan. Tetapi saya mahu meletakkan penciptaan jadual dan prosedur tersimpan dalam fail sql yang sama dan menjalankannya. Saya menggunakan MariaDB untuk tugasan ini.
Perpustakaan digunakan:
Jika saya menjalankan fail sql menggunakan HeidiSQL, ia berjalan dalam prosedur tersimpan dan pembatas tanpa sebarang ralat. Ini bermakna tiada ralat sql.
Bolehkah sesiapa memberitahu saya cara untuk membetulkannya?
DELIMITER ialah kenyataan pelanggan sahaja, pelayan tidak menyokongnya, maka ralat berlaku. Penyelesaian - padamkannya.
Berikut ialahsoalan dengan jawapan yang sangat baikyang menerangkan apa itu DELIMITER dan mengapa ia diperlukan.
Ringkasnya - apabila anda bekerja dengan pelanggan anda memerlukan cara untuk menunjukkan kepadanya "ini bukan pernyataan yang dilaksanakan serta-merta, ini masih hanya satu baris dalam prosedur tersimpan yang anda akan hantar ke pelayan" - jadi anda memberitahu (Pelanggan) "DELIMITER antara penyata ialah $$ buat sementara waktu". Pelayan tidak memerlukan/mengambil berat tentang perkara ini - ia tahu bahawa segala-galanya di antara
CREATE PROCEDURE, BEGIN, END
ialah pernyataan yang bersambung, satu blok.Apabila anda menyambung ke pangkalan data melalui API (pymysql), berbanding dengan klien interaktif (shell, heidisql, dll.) - anda menghantar SP sebagai sebahagian dan tidak ada cara untuk menjalankan kenyataannya satu demi satu, jadi DELIMITER tidak diperlukan, Pelayan tidak menyokong arahan ini dan akan menghasilkan ralat. Padamkannya.