Laksanakan prosedur tersimpan yang mengandungi skrip SQL menggunakan Rangka Kerja Robot
P粉031492081
2023-08-28 22:08:52
<p>Saya mahu menjalankan skrip sql yang mengandungi pangkalan data dan penciptaan jadual serta penciptaan prosedur tersimpan.
Tetapi apabila saya cuba menjalankan skrip sql dalam <strong>pustaka pangkalan data</strong> menggunakan kata kunci <strong>execute sql</strong>
<pre class="brush:php;toolbar:false;">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")</pre>
<p>Sebelum prosedur tersimpan, saya mempunyai <strong>pembatas</strong>: </p>
<pre class="brush:php;toolbar:false;">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 ;</pre>
<p>Jika saya mengulas bahagian prosedur yang disimpan, fail sql akan berjalan tanpa ralat bersama-sama dengan penyataan penciptaan jadual yang lain. </p>
<p>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. </p>
<p><strong>Perpustakaan digunakan</strong>: </p>
<ul>
<li>pymysql</li>
<li>Perpustakaan Pangkalan Data Rangka Kerja Robot</li>
</ul>
<p>Jika saya menjalankan fail sql menggunakan HeidiSQL, ia berjalan dalam prosedur tersimpan dan pembatas tanpa sebarang ralat. Ini bermakna tiada ralat sql. </p>
<p><strong>Bolehkah sesiapa memberitahu saya cara untuk membetulkannya? </strong></p>
DELIMITER ialah kenyataan pelanggan sahaja, pelayan tidak menyokongnya, maka ralat berlaku. Penyelesaian - padamkannya.
Berikut ialah soalan dengan jawapan yang sangat baik yang 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.