Oracle存储过程学习笔记(一)

SQL是一种语言!

一、先看一部分基础:

也可参考该文章:https://www.cnblogs.com/Singleorb/p/6217268.html;
1、语法 
 CREATE OR REPLACE PROCEDURE 存储过程名字
    (
        参数1 IN NUMBER,
        参数2 IN 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
) -- parameter_declaration 声明参数(注意不需要写长度),存储过程头部区域结束
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...


注意事项在oracle中,数据表别名不能加as,如:
select a.appname from appinfo a;-- 正确
select a.appname from appinfo as a;-- 错误
也许,是怕和oracle中的存储过程中的关键字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;

 结果会看到,调用该存储过程后将表中的数据张三全部替换成为了李四;

猜你喜欢

转载自www.cnblogs.com/YLQBL/p/9947863.html