5.1格式写法
declare
--变量的声明部分
a number;
b varchar2(10);
c date;
begin
--代码的逻辑和执行部分
a:=100;
b:='hello';
c:=sysdate;
dbms_output.put_line(a||b||c);
end;
5.2 变量
变量主要有3种类型:普通变量、引用型变量、记录型变量。
5.2.1 普通变量
普通变量
a number;
5.2.2 引用型变量
格式:变量名字 表名.列名%type;
declare
v_sal emp.sal%type;
begin
select sal into v_sal from emp where empno=7369;
dbms_output.put_line('工资是'||v_sal);
end;
5.2.3 记录型变量
记录型变量也叫数组型变量
格式:变量名 表名%rowtype;
declare
v_user emp%rowtype;
begin
select * into v_user from emp where empno=7369;
dbms_output.put_line(v_user.ename||','||v_user.job);
end;
5.2.4 变量输入
变量值的输入:
数字类型的变量名:=&提示语句;
字符串类型的变量名:='&提示语句';
例:
declare
v_user emp%rowtype;
--v_empno emp.empno%type;
v_ename emp.ename%type;
begin
--v_empno:=&输入要查询的员工编号;
v_ename:='&输入员工姓名';
select * into v_user from emp where ename=v_ename;
dbms_output.put_line(v_user.ename||','||v_user.job);
end;
注:
1.在代码块中,所有的select都一定要有into来存放你查询出来的数据
into 变量,只能放一个数据,并且一定要有数据。
2.在提示语句中,字符串和数值的一个有引号一个没有引号
5.3 If条件判断语句
If判断语句3种写法,应该都不难于理解。
1.
if 条件判断 then
执行sql语句;
end if;
2.
if 条件判断 then
执行sql语句;
else
执行sql语句;
end if;
3.
if 条件判断 then
执行sql语句;
elsif 条件判断 then
执行sql语句;
elsif 条件判断 then
执行sql语句;
......
else
执行sql语句;
end if;
和if语句相同类型和效果的另一些判断语句的写法:case when
case
when 条件判断 then 执行的sql语句 ;
when 条件判断 then 执行的sql语句 ;
when 条件判断 then 执行的sql语句 ;
......
else 执行的sql语句;
end case;
例:输入部门编号得到部门员工数量。
declare
v_deptno number :=&输入部门编号;
c number;
v_user emp%rowtype;
begin
select count(*) into c from emp where deptno=v_deptno;
if c=0 then
dbms_output.put_line('部门编号:'||v_deptno||'的部门没有员工');
elsif c>=2 then
dbms_output.put_line('部门编号:'||v_deptno||'的部门有'||c ||'名员工');
else
select * into v_user from emp where deptno=v_deptno;
dbms_output.put_line('部门编号:'||v_deptno||'的部门'||'员工编号:'||v_user.empno
||'的工资是'||v_user.sal);
end if;
end;
5.4 循环语句
Oracle循环有3种:for循环、while循环、loop循环。
循环终止有两个关键字:
continue:直接开始下一次的循环,忽略掉continue后面的代码。
exit:跳出整个循环,停止循环。
在循环中有个特别的关键语句:goto,但是不建议使用,容易引起逻辑的混乱,不过也有奇效,后续不再讲,就在此处单独说说。
定义:可以理解为一个标签,使用goto能进行代码的任意的跳转。
例:(可以自己试验下结果就能理解它的定义作用)
declare
begin
for i in 1..10 loop
if i=5 then
goto here;
end if;
dbms_output.put_line(i);
end loop;
dbms_output.put_line('world');
<<here>>
dbms_output.put_line('hello');
end;
5.4.1 for循环
功能:有循环范围的循环方式,一开始就知道运行次数的循环方法。
格式:
for 变量名 in 循环范围 loop
执行的sql语句;
end loop;
例1:将1+3+5++......+99的和,计算出来
declare
s number;
begin
s:=0;
for i in 1..99 loop
if mod(i,2)=1 then
s:=s+i;
end if;
end loop;
dbms_output.put_line(s);
end;
例2:输入部门编号,输出部门人数。
declare
v_dept number :=&请输入部门编号;
c number;
--v_user emp%rowtype;
begin
select count(*) into c from emp where deptno= v_dept;
case
when c=0 then
dbms_output.put_line('部门编号:'||v_dept || '的部门没有员工');
else
dbms_output.put_line('部门编号:'||v_dept || '的部门有' || c ||'名员工!!!');
for i in (select * from emp where deptno=v_dept) loop
dbms_output.put_line('-----'||i.empno||' '||i.ename||' '||i.job);
end loop;
end case;
end;
5.4.2 While循环
while循环,当循环的范围不是特别确定的时候。
while条件如果判断为真,就进入到循环,否则跳出循环
格式:
while 条件判断 loop
执行的sql语句;
end loop;
例:输出数字1到10
declare
n number;
begin
n:=1;
while n<=10 loop
dbms_output.put_line('数字'||n);
n:=n+1;
end loop;
end;
5.4.3 Loop循环
Loop循环也是适用当循环的范围不是特别确定的时候。
Loop循环条件判断为真,则exit退出循环,否则进入循环。
格式:
loop
exit when 条件判断;
执行的sql语句;
end loop;
例:输出10,8,6,4,2,0
declare
n number;
begin
n:=10;
loop
exit when n<0;
dbms_output.put_line(n);
n:=n-2;
end loop;
end;
5.3.4 continue和exit
定义:
continue:直接开始下一次的循环,忽略掉continue后面的代码
exit:跳出整个循环,停止循环
用例来说明它们之间的区别:
declare
begin
for i in 1..5 loop
for j in 1..3 loop
if j=2 then --当i=5时结束内层循环,继续下一个内循环j=3。
continue;
end if;
dbms_output.put_line(i);
end loop;
dbms_output.put_line('a');
end loop;
end;
输出结果:
1
1
a
2
2
a
3
3
a
4
4
a
5
5
a
declare
begin
for i in 1..5 loop
for j in 1..3 loop
if j=2 then --当i=5时跳出内层循环,继续下一个外循环i
exit;
end if;
dbms_output.put_line(i);
end loop;
dbms_output.put_line('a');
end loop;
end;
输出结果:
1
a
2
a
3
a
4
a
5
a
根据结果显示:很明显的看出continue是结束内层当前循环,继续下一次的内层循环。exit是直接结束整个循环,整个循环没有后续循环操作了。
5.5 动态SQL
定义:将SQL语句写在一个字符串中,在存储过程中解析字符串执行SQL。
一般情况下代码块只支持dml和dql语句。 增加关键字 execute immediate 可以执行动态sql语句。
继续举例说明:
需求:备份所有E开头的表,备份的表名格式:原表名_月日,如:emp_0729。
--要先准备一个表,用来存储当前所需要的找出来的表名
create table tmp_t(tn varchar2(100));
declare
c number; --E开头的表的数量
v_tn varchar2(100);--存储表名的变量
s varchar2(200);
begin
--找出E开头的表的数量
select count(*) into c from user_tables where table_name like 'E%';
--将表名保存到表中
insert into tmp_t select table_name from user_tables where table_name like 'E%';
commit;
for i in 1..c loop
select tn into v_tn from (select tn,rownum r from tmp_t) where r=i;
s:='create table '||v_tn||'_0926 as select * from ' || v_tn;
dbms_output.put_line(s);
execute immediate s;
end loop;
end;
另外说明一个知识点,打印输出:
dbms_output.put是总共就输出一行,然后在后面依次输出数据(变成一行多列)。
dbms_output.put_line是总共就输出一列,然后在下面依次输出数据(变成一列多行)。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_63021300/article/details/132267190
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




