### Oracle存储过程简介 存储过程是一种命名的PL/SQL代码块,存储在Oracle数据库中,可以被用户调用。 存储过程可以包含参数,**一般没有返回值** 存储过程是事先编译好的代码,再次调用的时候不需要重新编译,因此程序的运行效率较高。 ### Oracle存储过程 Oracle存储过程包含三部分:过程声明,执行过程部分,存储过程异常(可写可不写,要增强脚本的容错性和调试的方便性那就写上异常处理) ### Oracle存储过程的创建 语法格式如下: ```sql create [or replace] procedure pro_name (参数列表) as 局部变量声明 begin 程序语句序列 exception 异常处理 end pro_name ``` 1. 参数列表 - `in` 输入参数,使用 `username in varchar`,表示接受外部过程传递来的值。 - `out` 输出参数,使用`username out varchar`,表示此参数将在过程中被复制,并传递到过程体外。 - `in out` 表示具有输入参数特性,又有输出型特性 2. 参数类型不能指定长度,只需要指定数据类型即可。 3. 局部变量只在过程中有效 e.g ```sql create or replace PROCEDURE p_insert_aa (username in varchar, age in number) IS idn number(30); BEGIN select aa_id.nextval into idn from dual; insert into aa(id,username, age, createman,createdate) values (idn, username, age, 'admin', sysdate); commit; end p_insert_aa; ``` ### Oracle存储过程的调用和删除 存储过程可以在 SQL Plus或PL/SQL块中调用。 1. 在SQL Plus中调用 ```sql exec pro_name(param1, param2,...); execute pro_name(param1, param2,...); ``` 2. 在PL/SQL块中调用 不需要使用关键字exec,即可直接调用 3. 存储过程的删除 ```sql drop procedure pro_name; ``` ### Oracle查询 ```sql procedure M_SP_QUERYTODAYSUTTLE (WEIGHID_VAR in varchar2,DATASET_CUR_VAR out dataset_cur) as cur_var sys_refcursor; begin open cur_var for SELECT t.heatname, t.kettle_no, t.gross, to_char(t.grosstime, 'mm-dd hh24:mi:ss') as grosstime, t.tare, to_char(t.taretime, 'mm-dd hh24:mi:ss') as taretime, t.dross, t.suttle, to_char(t.suttletime, 'mm-dd hh24:mi:ss') as suttletime, t.grossweighname, to_number(substr(t.sequence_no, length(t.sequence_no) - 5 + 1, 5)) as sequence_no, t.materialname, t.sourcecode, t.sourcename, t.targetcode, t.targetname FROM MSR_IRON_V t ``` 注意事项: 1, 存储过程参数不带取值范围,in表示传入,out表示输出,类型可以使用任意Oracle中的合法类型。 2, 变量带取值范围,后面接分号 3, 在判断语句前最好先用count(*)函数判断是否存在该条操作记录 4, 用select 。。。into。。。给变量赋值 5, 在代码中抛异常用 raise+异常名