Oracle存储过程学习笔记

时间:2021-06-26 21:57:12

SQL是一种语言!

SQL是一种语言!

SQL是一种语言!

个人理解:存储过程就相当于Java中的方法;声明变量区域就相当于java中的声明局部变量一样,只是放到一个指定区域定义了

一、先看一部分基础:

1、语法:

CREATE OR REPLACE PROCEDURE 存储过程名字
(
  --声明参数(注意不需要写长度,和java的定义新的方法时的参数一样)
  参数1 IN NUMBER,
  参数2 out NUMBER
)IS   -- 声明变量区域,不需要声明变量可以不写
  -- 变量声明,每个声明用分号结束。可以在声明的同时初始化
  变量1 INTEGER :=0;
  变量2 DATE; BEGIN   --业务逻辑执行区域 END 存储过程名字; 这里的IS也可以用AS替代!

举个例子:

create        -- 存储过程头部区域开始
or replace --可选表示如果数据库中已经存在一条相同名称的存储过程就把它替换掉
procedure
proc_emp_create --存储过程名称 procedure_name
(
  empno number, ename varchar2, job varchar2, mgr number, hiredate date, sal number, comm number, deptno number
)
as
  --声明区域,不需要声明变量可以不写
begin -- PL/SQL标准执行语句
  --执行区域
insert into emp values(empno, ename, job, mgr, hiredate, sal, comm, deptno);
end;

一个存储过程可以分成三个区域:

头部区域
用于编写最基本的存储过程头部标记,定义是否要创建一个替代原有存储过程的存储过程;决定是否定义参数;定义参数的类型(in out inout);定义执行权限(Schema)。 声明区域
用于声明变量(要定义长度)包括cursor; 执行区域
用于执行业务逻辑代码,可以使用条件语句(选择、判断、循环。。。)来进行一些业务逻辑CRUD的处理;

2.SELECT INTO STATEMENT

将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条
记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)
例子:
BEGIN
  SELECT col1,col2 into 变量1,变量2 FROM typestruct where xxx;
EXCEPTION
WHEN NO_DATA_FOUND THEN
  xxxx;
END; 在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"no data found"异常。
可以在该语法之前,先利用select count(*) from 查看数据库中是否存在该记录,如果存在,再利用select...into...

注意事项:

1、在oracle中,数据表别名不能加as,如:
select a.appname from appinfo a;-- 正确
select a.appname from appinfo as a;-- 错误
也许,是怕和oracle中的存储过程中的关键字as冲突的问题吧; 2、oracle 的is 和as有什么区别?
在存储过程(PROCEDURE)和函数(FUNCTION)中没有区别;
在视图(VIEW)中只能用AS不能用IS;
在游标(CURSOR)中只能用IS不能用AS;

二、再看一个例子来熟悉创建和调用(自己操作看结果)

create table mytest(
name varchar2(50),
age number(10)
); --循环往表中插入数据
DECLARE
X number; --声明变量
BEGIN
x := 1; --给初值
FOR X IN REVERSE 1 .. 10 LOOP
insert into mytest values ('张三',10);
END LOOP;
COMMIT;
END; --创建存储过程
create or replace procedure AutoUpdateName(
  v_oldName in VARCHAR2,/*旧名称*/
  v_newName in VARCHAR2/*新名称*/
)
is
begin   UPDATE mytest SET name=REPLACE(name,v_oldName,v_newName) WHERE name LIKE '%'||v_oldName||'%';   COMMIT; end AutoUpdateName; --调用该存储过程
begin
  AutoUpdateName('张三','李四');
  commit;
end; 结果会看到,调用该存储过程后将表中的数据张三全部替换成为了李四;

end;