存储过程作用:
- 可以像编程的方式处理查询的结果,更灵活
- 可以使用游标操作进行更复杂的操作,比如联表查询做不到返回的结果是其他表名,然后再对这些表进行操作
变量类型
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 存储过程名;