Oracle
创建和删除存储过程
创建存储过程,需要有 CREATE PROCEDURE 或 CREATE ANY PROCEDURE 的系统
权限。该权限可由系统管理员授予。创建一个存储过程的基本语句如下:
CREATE [OR REPLACE] PROCEDURE 存储过程名[(参数[IN|OUT|IN OUT] 数据类型…)]
{AS|IS}
[说明部分] BEGIN
可执行部分
[EXCEPTION
错误处理部分]
END [过程名]; 其中:
选关键字 OR REPLACE 表示如果存储过程已经存在,则用新的存储过程覆盖,通常用于存储过程的重建。 参数部分用于定义多个参数(如果没有参数,就可以省略)。
参数
参数的作用是向存储过程传递数据,或从存储过程获得返回结果。正确的使用参数可
以大大增加存储过程的灵活性和通用性。 参数的类型有三种,如表 8-1 所示。
表 6-1 参数的类型
参数类型 说 明
IN 定义一个输入参数变量,用于传递参数给存储过程
OUT 定义一个输出参数变量,用于从存储过程获取数据
IN OUT 定义一个输入、输出参数变量,兼有以上两者的功能
参数的定义形式和作用如下:
参数名 IN 数据类型 DEFAULT 值;
定义一个输入参数变量,用于传递参数给存储过程。在调用存储过程时,主程序的实际参数可以是常量、有值变量或表达式等。DEFAULT 关键字为可选项,用来设定参数的默认值。如果在调用存储过程时不指明参数,则参数变量取默认值。在存储过程中,输入变量接收主程序传递的值,但不能对其进行赋值。
参数名 OUT 数据类型;
定义一个输出参数变量,用于从存储过程获取数据,即变量从存储过程中返回值给主
程序。
在调用存储过程时,主程序的实际参数只能是一个变量,而不能是常量或表达式。在存储过程中,参数变量只能被赋值而不能将其用于赋值,在存储过程中必须给输出变量至少赋值一次。
参数名 IN OUT 数据类型 DEFAULT 值;
定义一个输入、输出参数变量,兼有以上两者的功能。在调用存储过程时,主程序的实际参数只能是一个变量,而不能是常量或表达式。DEFAULT 关键字为可选项,用来设定参数的默认值。在存储过程中,变量接收主程序传递的值,同时可以参加赋值运算,也可以对其进行赋值。在存储过程中必须给变量至少赋值一次。 如果省略 IN、OUT 或 IN OUT,则默认模式是 IN。
例:
编写给雇员增加工资的存储过程 CHANGE_SALARY,通过 IN 类型的参数传递要增加工资的雇员编号和增加的工资额。
####步骤 1:输入以下存储过程并执行:
CREATE OR REPLACE PROCEDURE CHANGE_SALARY(P_EMPNO IN NUMBER
DEFAULT 7788,P_RAISE NUMBER DEFAULT 10)
AS
V_ENAME VARCHAR2(10); V_SAL NUMBER(5);
BEGIN
SELECT ENAME,SAL INTO V_ENAME,V_SAL FROM EMP WHERE
EMPNO=P_EMPNO;
UPDATE EMP SET SAL=SAL+P_RAISE WHERE EMPNO=P_EMPNO;
DBMS_OUTPUT.PUT_LINE(' 雇 员 '||V_ENAME||' 的 工 资 被 改 为
'||TO_CHAR(V_SAL+P_RAISE));
COMMIT;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('发生错误,修改失败!');
ROLLBACK;
END;
执行结果为: 过程已创建。
步骤 2:调用存储过程,在输入区中输入以下语句并执行:
EXECUTE CHANGE_SALARY(7788,80);
显示结果为:
雇员 SCOTT 的工资被改为 3080
说明:从执行结果可以看到,雇员 SCOTT 的工资已由原来的 3000 改为 3080。
参数的值由调用者传递,传递的参数的个数、类型和顺序应该和定义的一致。如果顺
序不一致,可以采用以下调用方法。如上例,执行语句可以改为:
EXECUTE CHANGE_SALARY(P_RAISE=>80,P_EMPNO=>7788);
可以看出传递参数的顺序发生了变化,并且明确指出了参数名和要传递的值,=>运算符左侧是参数名,右侧是参数表达式,这种赋值方法的意义较清楚。
Mysql
创建存储过程
语法:
CREATE PROCEDURE sp_name ( [ proc_parameter ])
[ characteristics ... ]
routune_body
说明: proc_parameter 的形式有: [ IN | OUT | INOUT ] 参数名 类型
routune_body 为SQL语句组成。
例1:
创建一个名称为AvgPrice的存储过程,返回所有产品的平均价格。如下:
/* 此存储过程虽然没有参数。但是后面的 () 还是得要加上 */
CREATE PROCEDURE AvgPrice ()
BEGIN
SELECT AVG(price) AS avgPrice
FROM product;
END;
例2:
创建一个名为CountProc的存储过程,带有输出参数。
CREATE PROCEDURE CountProc( OUT param1 INT )
BEGIN
SELECT COUNT(*) INTO param1 FROM product;
END;
注意: 使用DELIMITER命令时候,应该避免使用反斜杠(‘ \ ’)字符,因为反斜杠是转义字符。
例3:
创建存储过程EMP_MANAGER_SAL,使用OUT类型参数获得EMP表中所有MANAGER的平均工资。并编写程序调用该过程进行测试,给出输出的结果。
DELIMITER $$
drop procedure if exists EMP_MANAGER_SAL$$
create procedure EMP_MANAGER_SAL(out avg_sal numeric(7,2))
begin
select avg(sal) into avg_sal
from emp
where job ='MANAGER';
select avg_sal;
end $$
call EMP_MANAGER_SAL(@avg_sal);