IN 除非被具体定义,否则参数都假定 IN 属性。这意味这他们的值必须被主叫程序所指定,并且任何在存储程序内部 对该参数的修改都不能在主叫程序中起作用(类似于JAVA编程中的值传递,在方法内部修改这个参数后主调方法中的该变量不受影响) OUT 一个 OUT 参数可以被存储程序所修改,并且这个被修改的值可以在主叫程序中生效,主叫程序必须提供一个变量来 接受由 OUT 参数输出的内容,但是存储程序本身并没有对这个可能已经初始化的变量的操作权限,当存储程序开始 时,任何 OUT 变量的值都被赋值为 NULL,不管这个值在主叫程序中是否被赋予其他值。 (OUT类型的参数只用来做返回值,不管这个值之前有没有被赋值,存储过程都会把它设置为NULL)
CREATE PROCEDURE P11(OUT T1 VARCHAR(10),IN FLAG INT) BEGIN IF FLAG=1 THEN SET T1='CHANGED..'; END IF; END $$
MYSQL>> CALL P11(@T1,1); MYSQL>> SELECT @T1 ; --> 'CHANGED..' INOUT INOUT 参数同时扮演着 IN 和 OUT 参数的角色。那意味着,主叫程序可以提供一个值,而被叫程序自身可以修改这 个参数的值,并且当存储程序结束时主叫程序对该修改后的值具有访问权限 CREATE PROCEDURE P12(INOUT VALUE VARCHAR(20),IN FLAG INT) BEGIN IF FLAG=1 THEN SET VALUE='CHANGED...'; END IF; END $$