暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PLSQL编程

芃芃 2025-03-29
126


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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论