存储过程的创建:存储过程是在大型数据库系统中专门定义的一组SQL语句集。
定义过程语法:(Oracle) dbms_output.put_line('学习使用存储过程!');
CREATE [OR REPLACE] PROCEDURE 过程名称([参数名称[参数模式] NOCOPY 数据类型 [参数名称 [参数模式] NOCOPY 数据类型,...]])
[AUTHID [DEFINER | CURRENT_USER]]
AS || IS
[PRAGMA AUTONOMOUS_TRANSACTION;]
声明部分;
BEGIN
程序部分;
EXCEPTION
导常处理;
END;
参数中定义参数模式表示过程的数据的接收操作,一般分为IN,OUT,IN OUT 3类
CREATE [OR REPLACE]:表示创建或者替换过程,如果过程存在则替换,如果不存在就创建一个新的
AUTHID子句定义了一个过程的所有者权限,DEFINER(默认)表示定义者权限执行,或者用CURRENT_USER覆盖程序的默认行为,变为使用者权限
PRAGMA AUTONOMOUS_TRANSACTION:表示过程启动一个自治事务,自治事务可以让主事挂起,在过程中执行完SQL后,由用户处理提交或者回滚自治事务,
然后恢复主事务
EXECUTE 过程名 来调用过程
或者EXEC 过程名
在sqlplus中设置过程显示
SET serveroutput ON
//Mysql 中存储过程语法的定义
create procedure 存储过程名称()
begin
sql语句
end;
//一个简单的存储过程
create procedure a()
BEGIN
select "dasd1111";
END
call a; //执行存储过程
//变量的使用
使用关键字 declare 来定义变量
DECLARE myparam INT default 100;
//为变量赋值
//先声明,再赋值: declare var1,var2,var3 INT; set var1 = 10,var2 = 20; set var3 = var1 + var2;
//参数类型
in表示输入参数,表示该参数必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回.
out 输出参数,该值可在存储过程中改变,并能够被返回.
inout 可在调用时给值,并能够被改变.
//使用in的实例
CREATE PROCEDURE demo_in_parameter(IN p_in int)
BEGIN
SELECT p_in;
SET p_in=2;
SELECT p_in;
END;
SET @p_in=1;
CALL demo_in_parameter(@p_in);
select @p_in;
得到的结果是:1,2,1
//使用out的实例
CREATE PROCEDURE demo_out_parameter(OUT p_out int) BEGIN SELECT p_out; SET p_out=2; SELECT p_out; END; SET @p_out=1; CALL demo_out_parameter(@p_out); SELECT @p_out;
//输出的值分别是,null,2,2
//inout 的实例
CREATE PROCEDURE demo_inout_parameter(INOUT p_inout int) BEGIN SELECT p_inout; SET p_inout=2; SELECT p_inout; END; SET @p_inout=1; CALL demo_inout_parameter(@p_inout) ; select @p_inout;
//得到的结果是:1,2,2
//存储过程的查询
select name from mysql.proc where db='数据库名';
或
SHOW procedure status where db='数据库名';
或
select routine_name from information_schema.routines where routine_schema='数据库名';
//查看存储过程的详情
SHOW CREATE PROCEDURE 数据库.存储过程名;
//删除存储过程
DROP PROCEDURE
//游标的使用
//声明一个游标
1. DECLARE employee_csr CURSOR FOR SELECT id FROM employee WHERE valid=0;
2.open 游标名称
3.fetch 游标名称 into 参数... [将游标中的值,放入到参数中]
4.close 关闭游标
// 流程控制的语法,if语句 if 条件一 then 执行语句 elseif 条件二 then 执行语句... else 执行语句 end if //终结符
例子:
if val is null then select 'val is NULL'; else select 'val is not NULL'; end if;
// 格式一(case语句的用法) case case_expr when when_value then statement_list [when when_value then statement_list] ... [else statement_list] end case
例子:
// 格式一 case val when 1 then select 'val is 1'; when 2 then select 'val is 2'; else select 'val is not 1 or 2'; end case; // 格式二 case when val is NULL then select 'val is NULL'; when val < 0 then select 'val is less than 0'; when val > 0 then select 'val is greater then 0'; end case;
//loop语句:创建一个循环操作,使用leave退出循环 起一个loop名称: LOOP statement-list end LOOP loop名称 // 参数说明 loop_label:loop语句的标注名称,非必填。
例子:
declare id int default 0; add_loop:LOOP set id = id + 1; if id >= 10 then leave add_loop; //id大于等于10时退出循环 end if; end loop add_loop;
//while 循环语句
while的名称: WHILE expr_condition DO statement_list END WHILE [while_label while的名称] // 参数说明 while_label:标注名称,可省略。
例子:
declare i int default 0; while i < 10 DO set i = i + 1; end while;
一个Oracle的存储过程:
create or replace procedure find_custsum_procedure AS CRM_ALLOCATER_ID VARCHAR2(100); count_num VARCHAR2(1000); cursor find_custsum_cursor is select CRM_ALLOCATER_ID, count(1) as num from (select b.CRM_ALLOCATER_ID from (select CUST_ID, ACCU from (select CUST_ID, sum(CURR_M_ACCU / STATIS_DT) AS ACCU from XAN_INDIV_ACCT_BAL_ACCU GROUP BY CUST_ID) a where a.accu > 5000000) aa right JOIN XAN_INDIV_ASSET_ALLOT_DTL b on aa.CUST_ID = b.CUST_ID) bb group by bb.CRM_ALLOCATER_ID; BEGIN open find_custsum_cursor; loop FETCH find_custsum_cursor into CRM_ALLOCATER_ID, count_num; exit when find_custsum_cursor%notfound; dbms_output.put_line('放入到数据库中'); end loop; close find_custsum_cursor; end;