Laksanakan prosedur tersimpan yang mengandungi skrip SQL menggunakan Rangka Kerja Robot
P粉031492081
P粉031492081 2023-08-28 22:08:52
0
1
426

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:

  • pymysql
  • Perpustakaan Pangkalan Data Rangka Kerja Robot

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?

P粉031492081
P粉031492081

membalas semua (1)
P粉268284930

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 antaraCREATE PROCEDURE, BEGIN, ENDialah 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.

    Muat turun terkini
    Lagi>
    kesan web
    Kod sumber laman web
    Bahan laman web
    Templat hujung hadapan
    Tentang kita Penafian Sitemap
    Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!