zoukankan      html  css  js  c++  java
  • 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;

    其他约定
    函数命名 下划线或者驼峰式

  • 相关阅读:
    一种基于HBase韵海量图片存储技术
    八种常用的排序算法
    hibernate session的常用方法解析
    EJB到底是什么,真的那么神秘吗??<转>
    一名实习生在腾讯的感受<很值得一看>
    Jenkins持续集成报告列表显示不正确的问题解决
    Jenkins配置,tomacat版本输出乱码和页面打开报404的问题
    Jenkins部署持续集成远程机节点的问题
    浅析软件测试人员如何对JVM进行内存溢出检测
    python自动化测试,读取excal数据报"'str' object has no attribute 'items'"问题解决
  • 原文地址:https://www.cnblogs.com/yxj808/p/15080915.html
Copyright © 2011-2022 走看看