存储函数和存储过程不同的地方有以下几点:

DECLARE语句允许我们创建变量。它将出现在代码块中任何游标和处理及任何过程语句声明之前,DECLARE语句的语法如下:

1.函数的参数列表中模式只能为IN。

常用的MySQL数据类型

2.函数必须返回一个值,它的类型被定义于函数的头部

数据类型 解释 相应值的示例
INT,INTEGER 32位整数。取值范围为-21亿到+21亿,如果是非符号数值可以达到42亿,但这样做就不能包扩负数 123,345,-2,000,000,000
BIGINT 64位整数。取值范围为-9万亿到+9万亿或者非负的0到18万亿 9,000,000,000,000,000,000
FLOAT 32位浮点数。取值范围为-1.7e38to1.7e38或者非负的0到3.4e38 0.000000000000002,17897.890790,-345.8908770,1.7e21
DOUBLE 64位浮点数。取值范围接近无限(1.7e308) 1.765e23,-1.765e100

DECIMAL(precision,scale)

NUMERIC(precision, scale)

定点数。存储情况取决于precision,能保存可能出现的数字范围。NUMERIC通常用来保存重要的十进制数,例如现金 78979.00,-87.50,9.95
DATE 日期类型,没有详述时间 ‘1999-12-31’
DATETIME 日期和时间,时间精确到秒 ‘1999-12-31 23:59:59’
CHAR(length) 定长字符串。值会被空白填充至指定长度,最大长度为255字节 ‘hello world’
VARCHAR(length) 最大长度为64K的可变字符串 ‘hello world’
BLOB,TEXT 最大64K长度,BLOB用来保存2进制数据,TEXT用来保存文本数据 任何想象的内容
LONGBLOB,LONGTEXT BLOB和TEXT的加长版本,存储能力达4GB 任何想象的内容,但比BLOB和TEXT能存放更大的长度

美高梅电子游戏,3.函数能被SQL语句所调用

DECLARE l_int1            int default -2000000
DECLARE l_int2            INT unsigned 4000000
DECLARE l_bigint1         BIGINT DEFAULT 4000000000000000     
DECLARE l_float           FLOAT DEFAULT 1.8e8
DECLARE l_double          DOUBLE DEFAULT 2e45
DECLARE l_numeric         NUMERIC(8,2) DEFAULT 9.95;

DECLARE l_date            DATE DEFAULT '1999-12-31'
DECLARE l_datetime        DATETIME DEFAULT '1999-12-31 23:59:59'

DECLARE l_char            CHAR(255) DEFAULT 'This will be padded to 255 chars';
DECLARE l_varchar         VARCHAR(255) DEFAULT 'This will not be padded'

DECLARE l_text            TEXT DEFAULT 'This is a really long string. In sored programs we can use text colums fairly freely, but
                           in tables there are some limiations regarding indexing and use in various expressions.'

4.函数可能不返回任何结果集

字面常量

DELIMITER $$

DROP FUNCTION IF EXISTS discount_price$$

CREATE FUNCTION discount_price
        normal_price NUMERIC(8, 2)
        RETURN NUMERIC(8, 2)
        DETERMINISTIC
BEGIN 

    DECLARE v_discount_price NUMERIC(8, 2);

    IF (normal_price > 500) THEN
        SET discount_price = normal_price * .8;
    ELSE IF (normal_price > 1000) THEN 
        SET discount_price = normal_price * .9;
    ELSE 
        SET discount_price = normal_price;

    END IF;

    RETURN (discount_price);

END$$

下面是三大基本字面量类型

1.函数的参数列表中模式只能为IN。
2.函数必须返回一个,它的类型被定义于函数的头部 3.函…

数字字面常量,十六进制的传统表示方法,在它前面加上’0x’。

日期字面变量

字符字面变量

变量命名规则

参数

IN除非被具体定义,否则参数都假定IN属性。这意味着他们的值必须被主叫程序所指定,并且任何在存储程序内部对该参数的修改都不能在主叫程序中起作用

OUT
当存储程序开始时,任何OUT变量的值都被赋值为NULL,不管这个值在主叫程序中是否被赋予其他值。

CREATE PROCEDURE sp_demo_in_parameter(IN p_in INT)
BEGIN
    /*We can see the value of the IN parameter*/
    SELECT p_in;
    /*We can modify it */
    SET p_in = 2;
    /* show that the modification took effect */
    select p_in;
END;

/*This output shows that the changes made within the stored program cannot be accessed from the calling program(in this case, the mysql client):*/

set @p_in = 1
call sp_demo_in_parameter(@p_in)

select @p_in, 'We can''t see the changed value from the calling program'

OUT参数的例子

CREATE PROCEDURE sp_demo_out_parameter(OUT p_out INT)
BEGIN
    /*We can't see the value of the OUT parameter*/
    SELECT p_out, 'We can''t see the value of the OUT parameter';
    /*We can modify it */
    SET p_out = 2;
    SELECT p_out, 'OUT parameter value has been  changed';

END;

SET @p_out = 1

CALL sp_demo_out_parameter(@p_out)
SELECT @p_out, "Calling program can see the value of the changed OUT parameter"

INOUT参数的例子

CREATE PROCEDURE sp_demo_inout_parameter(INOUT p_inout INT)
BEGIN
    SELECT p_inout, 'We can see the value of the INOUT parameter in the stored program';

    SET p_inout = 2;
    SELECT p_inout, 'INOUT parameter value has been changed';
END;
set @p_inout = 1
call sp_demo_inout_parameter(@p_inout)
select @p_inout, "Calling program can see the value of the changed INOUT parameter"

Author

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章