oracle存储过程入门
今天第一次写oracle的存储过程,请别人修改正确后,简单根据例子总结一下存储过程的结构。
例子:
create or replace procedure add_rand_from_expens[(param1 IN NUMBER,param2 OUT NUMBER)]--1 is[as]--2 bound number(5);--3 begin for counter in (select * from clinet) loop --4 update clinet t set expens = expens+round(dbms_random.value(0,10)) where t.id = counter.id; end loop; exception --5 when NO_DATA_FOUND then dbms_output.put_line('表中缺失数据'); when others then dbms_output.put_line('未知异常'); end;
1、入参中的IN,OUT关键字可以理解为修饰符,被修饰为IN的参数只读,不能再存储过程中更改其值;被修饰为OUT的参数在数据库中可以更改其值;没有参数则可以省略()
2、IS,AS用在此处都可以,没有区别,IS到BEGIN之间都是定义变量或者常量。
3、定义变量或常量时可以赋值
4、for loop是plsql提供的一种结构化语言,有点类似于java中的for each的用法。for loop 中的范围是一个闭区间,比如0..100会循环101次,例子中counter数据类型是%ROWTYPE,代表一条记录,感觉有点面向对象的意思。
5、exception是异常处理,oracle中的异常类型有很多,也可以自定义异常。具体请参考别人的文章 总结:整理 oracle异常错误处理。
mysql与oracle在存储过程上的坑:
1、mysql没有package的概念,oracle存储过程可以写在包里;
2、如果存储过程的入参是字符,oracle要求写成varchar2,mysql要求写成varchar(SIZE);
3、oracle允许CREATE OR REPLACE语法,mysql则必须先删除(DROP PROCEDURE IF EXISTS...),再创建新的存储过程;
4、oracle调用存储过程就跟调用函数一样,直接过程名+入参,mysql调用时则需要使用CALL关键字;
5、其它的诸如mysql 不需要IS等细节,不再赘述,总之,mysql的语法相对自由简洁,但欠缺的功能就需要自己手动补上了。