2.操练存储过程

概念了解

       存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。

       存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回单个或多个结果集以及返回值。

       由于存储过程在创建时即在数据库服务器上进行了编译并存储在数据库中,所以存储过程运行要比单个的SQL语句块要快。同时由于在调用时只需用提供存储过程名和必要的参数信息,所以在一定程度上也可以减少网络流量、简单网络负担。

纸上谈兵

 存储过程

  CREATE OR REPLACE PROCEDURE 存储过程名
  IS
  BEGIN
  NULL;
  END;

 

行1:    CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程, 如果存在就覆盖它;

行2:    IS关键词表明后面将跟随一个PL/SQL体。

行3:    BEGIN关键词表明PL/SQL体的开始。

行4:    NULL PL/SQL语句表明什么事都不做,这句不能删去,因为PL/SQL体中至少需要有一句;

行5:    END关键词表明PL/SQL体的结束


存储过程创建语法:

create or replace procedure 存储过程名(param1 in type,param2 out type) 

as 

变量1 类型(值范围); --vs_msg   VARCHAR2(4000); 

变量2 类型(值范围);

Begin

Select count(*) into 变量1 from 表A where列名=param1;

    If (判断条件) then

       Select 列名 into 变量2 from 表A where列名=param1;

       Dbms_output。Put_line(‘打印信息’);

    Elsif (判断条件) then

       Dbms_output。Put_line(‘打印信息’);

    Else
    
       Raise 异常名(NO_DATA_FOUND);

    End if;

Exception

    When others then

       Rollback;

End;


注意事项:

1, 存储过程参数不带取值范围,in表示传入,out表示输出

类型可以使用任意Oracle中的合法类型。

2,  变量带取值范围,后面接分号

3,  在判断语句前最好先用count(*)函数判断是否存在该条操作记录

4,  用select 。。。into。。。给变量赋值

5,  在代码中抛异常用 raise+异常名

全军出击

实参形参:

create or replace procedure myDemo04(name in varchar,age in int)
as
begin
  dbms_output.put_line('name='||name||', age='||age);
end;

declare
 name varchar(10);
 age int;
begin
  name:='xiaoming';
  age:=18;
  myDemo04(name=>name,age=>18);--此时不能myDemo04(name=>name,18),不能完成调用。

end;

注;在调用存储过程时,=>前面的变量为存储过程的形参且必须于存储过程中定义的一致,而=>后的参数为实际参数。当然也不可以不定义变量保存实参

in,out参数问题



create or replace procedure myDemo05(name out varchar,age in int)
as
begin
       dbms_output.put_line('age='||age);
  select 'seaco' into name from dual;
end;

declare
 name varchar(10);
 age int;
begin
  myDemo05(name=>name,age=>10);
  dbms_output.put_line('name='||name);
end;

 注:in代表输入,out用于输出

crud

create or replace procedure mydemo07(ids in int, username in varchar,userpass in varchar, userage in int)
as
begin
-- insert into students(id,username,userpass,userage)
-- values(ids,username,userpass,userage); --增
-- delete from students where id=ids; --删
-- update students set userage=100 where id=ids;--改
commit;
end;
begin
  mydemo07(10,'a','b','17');
end;
---------------------------
create or replace procedure mydemo08(ids in int, age out int)
as
begin
  select userage into age from students where id=ids; --查
  commit;
end;
declare
 ids int;
 age int;
begin
  ids:=1;
  myDemo08(ids=>ids,age=>age);
  dbms_output.put_line('age='||age);
end;

for循环

create or replace procedure mydemo09
as
begin

 for stu in (select * from students) loop
     if (stu.id<5) then
        dbms_output.put_line(stu.id);
      end if;
  end loop;
commit;
end;

begin
  mydemo09();
end;

while循环

create or replace procedure test_while_loop as
  n_count number := 0;
begin
  while n_count < 10 loop
    dbms_output.put_line(n_count);
    n_count := n_count + 1;
  end loop;
end;
 
begin
  test_while_loop();
end;

你可能感兴趣的:(2.操练存储过程)