天天看點

判斷語句、循環語句、複合資料類型一。if語句二。循環語句三。複合資料類型

一。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;