zoukankan      html  css  js  c++  java
  • MySQL的Stored Function的调用

    MySQL的Stored Function和Trigger

    Stored Function
    存储Function可以作为表达式在内建方法可以调用的地方使用以及SELECT、UPDATE、DELETE、INSERT语句中使用

    Java代码 复制代码
    1. CREATE FUNCTION function_name(parameter[,...])   
    2.     RETURNS datatype   
    3.     [LANGUAGE SQL]   
    4.     [ [NOT] DETERMINISTIC]   
    5.     [ {CONTAINS SQL | NO SQL | MODIFIES SQL DATA | READS SQL DATA} ]   
    6.     [ SQL SECURITY {DEFINER|INVOKER} ]   
    7.     [COMMENT comment_string ]   
    8.     function_statements  
    CREATE FUNCTION function_name(parameter[,...])
        RETURNS datatype
        [LANGUAGE SQL]
        [ [NOT] DETERMINISTIC]
        [ {CONTAINS SQL | NO SQL | MODIFIES SQL DATA | READS SQL DATA} ]
        [ SQL SECURITY {DEFINER|INVOKER} ]
        [COMMENT comment_string ]
        function_statements
    


    三点与存储过程不同的地方:
    1,必须要一个RETURNS语句来定义返回值类型
    2,不能指定参数的IN、OUT或INOUT修饰符,所有参数隐式的为IN
    3,Function体必须包含RETURN语句来终结Function执行并返回指定的结果给调用者

    Example:

    Java代码 复制代码
    1. CREATE FUNCTION cus_status(in_status CHAR(1))   
    2.     RETURNS VARCHAR(20)   
    3. BEGIN   
    4.     DECLARE long_status VARCHAR(20);   
    5.   
    6.     IF in_status = 'O' THEN   
    7.         SET long_status='Overdue';   
    8.     ELSEIF in_status = 'U' THEN   
    9.         SET long_status='Up to date';   
    10.     ELSEIF in_status = 'N' THEN   
    11.         SET long_status='New';   
    12.     END IF;   
    13.   
    14.     RETURN(long_status);   
    15. END;  
    CREATE FUNCTION cus_status(in_status CHAR(1))
        RETURNS VARCHAR(20)
    BEGIN
        DECLARE long_status VARCHAR(20);
    
        IF in_status = 'O' THEN
            SET long_status='Overdue';
        ELSEIF in_status = 'U' THEN
            SET long_status='Up to date';
        ELSEIF in_status = 'N' THEN
            SET long_status='New';
        END IF;
    
        RETURN(long_status);
    END;
    


    好像MySQL当前最新版本(5.1)还不支持嵌套的Stored Function,仅支持嵌套的Stored Procedure

    Trigger
    Trigger是数据库中的事件触发,当前MySQL的实现是对特定table的DML语句(INSERT/UPDATE/DELETE)调用时触发

    Java代码 复制代码
    1. CREATE [DEFINER={user|CURRENT_USER}] TRIGGER trigger_name   
    2.   {BEFORE|AFTER}   
    3.   {INSERT|UPDATE|DELETE}   
    4. ON table_name   
    5. FOR EACH ROW   
    6. trigger_statements  
    CREATE [DEFINER={user|CURRENT_USER}] TRIGGER trigger_name
      {BEFORE|AFTER}
      {INSERT|UPDATE|DELETE}
    ON table_name
    FOR EACH ROW
    trigger_statements
    


    AFTER类型的Trigger不能修改NEW记录的值
    如果同时对大量的行做操作,Trigger可能性能开销较大,所以尽量避免在Trigger里放入性能消耗大的SQL语句

    Example: Using trigger to implememt audit logging

    Java代码 复制代码
    1. CREATE TRIGGER account_balance_au   
    2.     AFTER UPDATE ON account_balance FOR EACH ROW   
    3.     BEGIN   
    4.         INSERT into transaction_log   
    5.             (user_id, description)   
    6.             VALUES(user(),   
    7.                 CONCAT('Adjusted account ',   
    8.                     NEW.account_id, ' from ', OLD.balance,   
    9.                         ' to ', NEW.balance));   
    10. END;  
  • 相关阅读:
    window.onload 、body.onload 以及 jQuery 等dom加载完成后执行脚本的区别
    HTML5事件-pageshow 和 pagehide
    动态加载script 和 link
    递归 recursive
    HTML5事件-自定义右键菜单
    left与margin-left区别
    偏移量、客户区、滚动大小
    屏幕适配
    KVC和KVO
    HUD总结
  • 原文地址:https://www.cnblogs.com/cy163/p/1311988.html
Copyright © 2011-2022 走看看