首頁  >  問答  >  主體

使用機器人框架執行包含 SQL 腳本的預存程序

<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>
P粉031492081P粉031492081388 天前447

全部回覆(1)我來回復

  • P粉268284930

    P粉2682849302023-08-29 11:03:12

    DELIMITER是僅支援客戶端的語句,伺服器不支援它,因此出現錯誤。解決方案-刪除它。

    這裡有一個帶有非常好答案的問題,解釋了DELIMITER是什麼以及為什麼需要。

    簡而言之-當你與客戶端一起工作時,你需要一種方法來指示它“這不是立即執行的語句,這仍然只是你將發送給伺服器的存儲過程中的一行”-所以你告訴(客戶端)「語句之間的DELIMITER暫時是$$」。伺服器不需要/關心這個-它知道CREATE PROCEDURE, BEGIN, END之間的所有內容都是連接的語句,一個區塊。

    當你透過API(pymysql)連接到資料庫時,與互動式客戶端(shell,heidisql等)相比-你將SP作為一個區塊發送,沒有辦法逐個運行它的語句,因此DELIMITER是不需要的,伺服器不支援該命令,並且會產生錯誤。刪除它。

    回覆
    0
  • 取消回覆