使用機器人框架執行包含 SQL 腳本的預存程序
P粉031492081
2023-08-28 22:08:52
<p>我想運行包含資料庫和表格創建以及預存程序創建的sql腳本。
但是當我嘗試使用<strong>execute sql script</strong>關鍵字在<strong>database library</strong>中運行sql腳本時,我會得到以下錯誤:</p>
<pre class="brush:php;toolbar:false;">ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right synt to your MariaDB server version for the use synt to 'DELIMITER $$\n CREATE OR
REPLACE PROCEDURE `proc_GetCustomerDetails`(\n I...' at line 2")</pre>
<p>在預存程序之前,我有這樣的<strong>delimiter</strong>:</p>
<pre class="brush:php;toolbar:false;">DELIMITER $$
CREATE OR REPLACE PROCEDURE `proc_GetCustomerDetails`(
IN CustomerNbr LONGTEXT,
IN Lang VARCHAR(5)
)
DETERMINISTIC
BEGIN
IF Lang IS NULL THEN SET lang = "fin";
END IF;
SELECT * from dbname.customer;
END;$$
DELIMITER ;</pre>
<p>如果我註解掉預存程序部分,sql檔將在其餘的表建立語句中運行而不會出錯。 </p>
<p>我在Google上搜尋了一下,沒有找到相關的問題。我看到我們有呼叫預存程序的關鍵字。但是我想把表格建立和預存程序放在同一個sql檔案中並運行。我在這個任務中使用的是MariaDB。 </p>
<p><strong>使用的函式庫</strong>:</p>
<ul>
<li>pymysql</li>
<li>機器人框架資料庫</li>
</ul>
<p>如果我使用HeidiSQL運行sql文件,它將在預存程序和分隔符號中運行而不會出現任何錯誤。這意味著沒有sql錯誤。 </p>
<p><strong>有人可以告訴我如何解決這個問題嗎? </strong></p>
DELIMITER是僅支援客戶端的語句,伺服器不支援它,因此出現錯誤。解決方案-刪除它。
這裡有一個帶有非常好答案的問題,解釋了DELIMITER是什麼以及為什麼需要。
簡而言之-當你與客戶端一起工作時,你需要一種方法來指示它“這不是立即執行的語句,這仍然只是你將發送給伺服器的存儲過程中的一行”-所以你告訴(客戶端)「語句之間的DELIMITER暫時是$$」。伺服器不需要/關心這個-它知道
CREATE PROCEDURE, BEGIN, END
之間的所有內容都是連接的語句,一個區塊。當你透過API(pymysql)連接到資料庫時,與互動式客戶端(shell,heidisql等)相比-你將SP作為一個區塊發送,沒有辦法逐個運行它的語句,因此DELIMITER是不需要的,伺服器不支援該命令,並且會產生錯誤。刪除它。