存储过程作用:

  • 可以像编程的方式处理查询的结果,更灵活
  • 可以使用游标操作进行更复杂的操作,比如联表查询做不到返回的结果是其他表名,然后再对这些表进行操作
变量

变量类型

CHAR、VARCHAR2、NUMBER、INTEGER、LONG、CLOB、BLOB、DATE、%TYPE、%ROWTYPE、BOOLEAN、自定义类型

变量赋值

方式1:直接法

v_flag := 'hello world';

方式2:select into

假设变量名为v_flag
select count(*) into v_flag from students;

方式3:execute immediate 变量名 into 变量名

   v_sqlfalg   := 'select count(*) from user_tables where table_name='''||v_tablename || '''';
   execute immediate v_sqlfalg into v_flag;

注意

  • 如果是以SQL的方式得到结果赋值给变量时,SQL的结果不能返回多条。如果SQL结果返回多条的话则建议将数据存储到临时表
循环

需求:循环输出1到4

loop

create or replace procedure pro_loop is 
i number;
begin
 i:=0;
 loop
   i:=i+1;
	 dbms_output.put_line(i);
	 if(i>3) then 
			exit;
		end if;
end loop;
end pro_loop;

while

create or replace procedure pro_while is
i number;
begin
i:= 0;
while i<5 loop
i:= i+1;
dbms_output.put_line(i);
end loop;
end pro_while;

for

方式1

create or replace procedure pro_for1 is 
i number;
begin
	i:= 0;
	for i in 1..5 loop
		dbms_output.put_line(i);
	end loop;
end pro_for1;

方式2
需求:获取每行用户的数据

create or replace procedure pro_for2 is 
-- 声明变量获取表中一行的数据
userRow t_user_20210716%rowtype;
-- 定义游标
cursor userRows is select * from t_user;
begin
	for userRow in userRows loop
		select '用户信息为:'||userRow.id||userRow.name||userRow.age;
	end loop;
end pro_for2;

注意:

  • for循环的第一种形式不需要手动对变量进行自增;for循环的第二种形式可以使用for in方式进行遍历取想要的字段;
  • 尽量不要在sql中使用user变量,因为可能是数据库中的关键字
其他命令

删除存储过程

drop procedure 存储过程名;