簡體   English   中英

創建 MaillingListCount 的存儲過程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM