判断语句、循环语句、复合数据类型

一。if语句

if-then-end if
if-then-else-end if
if-then-elsif-end if

语法:

IF condition THEN
	statements;
[ELSIF condition THEN
	statements;]
[ELSE
	statements;]
END IF;

例子:假如雇员的名字是Alice,则他的经理号设为22,佣金设为薪水的20%.

if v_name='Alice' then
	v_mgr:=22;
	v_comm:=sal*20%;
end if;

例子:给定一个值,根据不同条件计算不同的值。

if v_start>100 then
	v_start :=2*v_start;
elsif v_start>=50 then
	v_start :=0.5*v_start;
else 
	v_start :=0.1*v_start;
end if;

二。循环语句

是一个语句或者一组语句能够执行多次。
三种循环结构:
loop、for循环、while循环

1.loop

不管条件符合不符合,先执行一次。
语法:

loop
	statement;
	...
	exit [when condition];
end loop;

例子:

declare
	v_ordid item.ordid%type :=600;
	v_counter number(2) :=1;
begin
	loop
		insert into item(ordid, itemid)
		values(v_ordid, v_counter);
		v_counter:=v_counter+1;
		exit when v_counter>10;
	end loop;
end;

2.for

不管条件符合不符合,先执行一次。

declare 
	v_ordid item.ordid%type :=601;
begin
	for i in 1..10 loop
		insert into item(ordid, itemid)
		values(v_ordid, i);
	end loop;
end;

3.while

只有条件符合,才会执行。

语法:

WHILE condition LOOP
	statement1;
	statement2;
END LOOP;

4.嵌套循环和标记

BEGIN
	<<Outer Loop>>
	LOOP
	....
		<<Inner loop>>
 		LOOP
		....
		END LOOP Inner loop;	
	...
	END LOOP Outer LOOP;
END;

5.练习

写一个pl/sql块,向dept表中循环插入5条记录。要求:每条记录的deptno值比表中最大的值增加1,dname的值分别为education1,education2,…education5,
loc值为空。

declare 
	v_max_deptno number(3);
begin
	select max(deptno) into v_max_deptno  from dept2;
	for i in 1..5 loop
	v_max_deptno  :=v_max_deptno  +1;
	insert into dept2(deptno, dname) values(v_max_deptno ,'education' || i);
	end loop;
end;

写一个pl/sql块,删除dept表中所有loc字段为空的记录,如果删除的行数为0,则输出:没有行数被删除;若不为零,则输出删除的记录数。

begin
	delete from dept2 where loc is null;
	if sql%rowcount=0 then
	dbms_output.put_line('没有行数被删除');
	else
	dbms_output.put_line(sql%rowcount || '行被删除');
	end if;
end;

三。复合数据类型

1.pl/sql记录

可以把记录理解为一个复杂一点的变量,这个变量包含表里面的好多列。
也可以把记录理解为Java的类,表中的列理解为类中的属性,记录就是把表中列封装起来。

创建:

TYPE type_name IS RECORD
	(field_declaration[,field_declaration]);
identifier type_name;

例子:创建一个记录,来保存一个雇员的name、job、salary信息。

TYPE emp_record_type IS RECORD
	(ename varchar2(10),
	job varchar2(9),
	sal number(7,2));
emp_cord emp_record_type ;

比如:

declare
	type emp_record_type is record
		(ename varchar2(10),
		job varchar2(9),
		sal number(7,2));
	emp_record emp_record_type;
begin
	select ename, job, sal into emp_record 
	from emp where empno=7788;
	dbms_output.put_line(emp_record.ename || ',  ' || emp_record.job || ',  ' ||emp_record.sal );
end;

2.%rowtype

作用:把表或视图的好多列声明一个变量。

例子:
声明一个变量,来保存一个雇员的信息,就像保存在emp表中的一行数据一样。

emp_record emp%rowtype;

比如:

declare 
	emp_type emp%rowtype;
begin
	select * into emp_type 
	from emp where empno=7788;
	dbms_output.put_line(emp_type.ename || ',  '||  emp_type.job || ',  '||  emp_type.sal);
end;

3.pl/sql表

①组成:
每个pl/sql表中包括两个组成部分。
类型为binary_integer的主键
一个类型为标量、或者record数据类型的列

②语法:

TYPE ename_table_type IS TYPE OF emp.ename%TYPE
	INDEX BY BINARY_INTEGER;
ename_table ename_table_type ;

比如:

declare
	type ename_table_type is table of emp.ename%type
		index by binary_integer;
	type hiredate_table_type is table of date
		index by binary_integer;
	ename_table ename_table_type ;
	hiredate_table hiredate_table_type ;
begin
	ename_table (1):='AAA';
	ename_table (2):='BBB';
	ename_table (3):='CCC';
	hiredate_table (8):=sysdate+7;
	dbms_output.put_line(ename_table (1) || ename_table (2) || ename_table (3) ||hiredate_table (8) );
end;

③方法:

方法描述
exists(n)用于判断表中指定位置元素是否存在
count返回pl/sql表中包含元素的数量
first/last返回表中第一个/最后一个元素的索引数字
prior(n)在pl/sql表中返回索引n之前的编号
next(n)在pl/sql表中返回索引n之后的编号
extend向pl/sql表后添加一个null元素
extend(n)向pl/sql表后面添加n个元素
extend(n,i)向pl/sql表后添加n个i元素的副本
trim把一个元素从pl/sql表的最后移开
trim(n)把元素n从pl/sql表的最后移开
delete把所有元素从pl/sql表中删除
delete(n)把第n个元素从pl/sql表中删除
delete(m,n)把从m到n之间的元素从pl/sql表中删除
declare 
         type tabletype1 is table of varchar2(9) index by binary_integer; 
         table1 tabletype1; 
    begin 
         table1(1):='成都市'; 
         table1(2):='北京市'; 
         table1(3):='青岛市'; 
         dbms_output.put_line('总记录数:'||to_char(table1.count)); 
         dbms_output.put_line('第一条记录:'||table1.first); 
         dbms_output.put_line('最后条记录:'||table1.last); 
         dbms_output.put_line('第二条的前一条记录:'||table1.prior(2)); 
         dbms_output.put_line('第二条的后一条记录:'||table1.next(2)); 
     end; 

输出:
总记录数:3
第一条记录:1
最后条记录:3
第二条的前一条记录:1
第二条的后一条记录:3

4.pl/sql表记录

声明一个pl/sql表变量来保存部门信息。

declare
	type ename_table_type is table of emp.ename%type
		index by binary_integer;
	e_tab ename_table_type;
begin
	e_tab(1):='Smith';
	update emp
	set sal = 1.1*sal
	where ename=e_tab(1);
	commit;
end;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值