1. 程式人生 > 其它 >mysql詳解8:儲存過程和函式

mysql詳解8:儲存過程和函式


儲存和管理sql程式碼
儲存過程中的sql程式碼執行更快
更能加強資料安全性

建立儲存過程
DELIMITER $$
CREATE PROCEDURE get_clients () BEGIN
SELECT
* FROM promote_advertisers;

END$$
DELIMITER;
DELIMITER $$表示修改預設分隔符
CALL get_clients() 使用儲存過程

刪除儲存過程
DROP PROCEDURE IF EXISTS get_clients;

在儲存過程中新增引數
DELIMITER $$
CREATE PROCEDURE get_clients_by_state
(
state CHAR(2)
)

BEGIN
SELECT * FROM clients c where c.state=state;
END$$
DELIMITER;

CALL get_client_by_state('CA')

用使用過程更新 刪除資料
CREATE PROCEDURE make_payment
(
invoice_id INT,
payment_amount DECIMAL(9,2),
payment_date DATE
)
BEGIN
IF payment_amout<=0 THEN
SIGUNAL SQLSTATE '22003'
set MESSAGE_TEXT ="Invaild payment amount";
END IF;
update invoices i
set
i.payment_total =payment_amount,
i.payment_date = payment_date
where i.invoice_id =invoice_id;
END
通過引數驗證以防傳入錯誤引數


輸出引數
CREATE PROCEDURE get_unpaid_invoice_for_client
(
client_id INT,
OUT invoices_count INT,
OUT invoice_total DECIMAL(9,2)
)
BEGIN
select count(*),SUM(invoice_total)
from invoicies i
where i.client_id =client_id
and payment_total =0;
END

SELECT @invoice_count,@invoices_total;

變數
set @invoice_count = 0
DECLARE 宣告變數

CREATE PROCEDURE get_risk_factor()
BEGIN
DECLARE risk_factor DECIMAL(9,2) DEFAULT 0;
DECLARE invoice_total DECIMAL(9,2);
DECLARE invoice_count INT; ’

select count(*),sum(invoice_total)
into invoices_count,invoices_total
from invoices;
set risk_factor =invoice_total/invoice_count *5;
END

call sql_invoicing.get_risk_factor();

函式
函式只能返回單一值
CREATE FUNCTION get_risk_factor_for_client (
client_id INT
)
RETURNS INTEGER
BEGIN
DECLARE risk_factor DECIMAL(9,2) DEFAULT 0;
DECLARE invoice_total DECIMAL(9,2);
DECLARE invoice_count INT; ’
select count(*),sum(invoice_total)
into invoices_count,invoices_total
from invoices;
set risk_factor =invoice_total/invoice_count *5;
return IFNULL(risk_factor);
END
使用函式
select
client_id,
name,
get_risk_factor_for_client(client_id) as risk_factor;
刪除函式
DROP FUNCTION IF EXISTS get_risk_factor_for_client;

其他約定
函式命名 下劃線或者駝峰式