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