[英]Stored procedure to create a MaillingListCount
我sql in 10 minutes
關注sql in 10 minutes
以學習“存儲過程”
#+BEGIN_SRC sql :engine mysql :dbuser org :database grocer
CREATE PROCEDURE MailingListCount (
ListCount OUT INTEGER )
IS
v_rows INTEGER;
BEGIN
SELECT COUNT(*) INTO v_rows
FROM Customers
WHERE NOT cust_email IS NULL;
ListCount := v_rows;
END;
#+END_SRC
#+RESULTS:
| |
它報告錯誤:
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'OUT INTEGER )
IS
v_rows INTEGER' at line 2
你能提供任何提示嗎?
幾個修復:
OUT
出現在參數名稱之前IS
BEGIN
END
塊中聲明變量SET
所以:
CREATE PROCEDURE MailingListCount(OUT ListCount INTEGER )
BEGIN
declare v_rows INTEGER;
SELECT COUNT(*) INTO v_rows
FROM Customers
WHERE NOT cust_email IS NULL;
SET ListCount := v_rows;
END;
通常,處理結果集的過程輸出比處理OUT
變量更容易。 OUT
變量主要用於過程之間的調用。
因此,如果您打算從應用程序調用例程,請使用:
CREATE PROCEDURE MailingListCount()
BEGIN
SELECT COUNT(*) as 'Count'
FROM Customers
WHERE NOT cust_email IS NULL;
END;
首先是 OUT 關鍵字的位置。 它應該在參數名稱之前。
然后第二個不需要創建變量 v_rows 來存儲輸出,然后最終將其分配回 OUT 參數 listCount。
如果你想檢查條件,比如 email 不應該為空,那么你應該做一些類似WHERE cust_email IS NOT NULL
而不是WHERE NOT cust_email IS NULL
請參考以下代碼以供參考:
DELIMITER $$
CREATE PROCEDURE `MailingListCount` (OUT listCount INTEGER)
BEGIN
SELECT COUNT(*) INTO listCount
FROM Customers
WHERE cust_email IS NOT NULL;
END$$
DELIMITER ;
您可以為 MySql 存儲過程和函數使用不同的分隔符。
MySql 使用;
作為默認分隔符,所以除默認之外的分隔符;
通常在定義函數、存儲過程和觸發器時使用,其中必須定義多個語句。 您定義了一個不同的分隔符,如$$
用於定義整個過程的結尾,但在其中,各個語句都以;
結尾;
. 這樣,當代碼在mysql客戶端運行時,客戶端可以知道整個過程在哪里結束並作為一個單元執行,而不是執行內部的單個語句。
您可以參考https://dev.mysql.com/doc/refman/8.0/en/create-procedure.html來學習 MySQL 存儲過程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.