從零開始學習Oracle
阿新 • • 發佈:2018-12-10
從零開始學Oracle—PL/SQL(七)
PL/SQL簡介
PL/SQL(Procedural Language Sql,過程語言|SQL)是結合了Oracle過程語言和結構化查詢語言(SQL)的一種擴充套件語言.
PL/SQL塊是一段後臺服務程式,它負責將資料從資料庫中取出來,在PL/SQL塊中進行處理,將處理的結果送到資料庫.
優點:
1,支援SQL
2,支援面向物件程式設計(OOP)
3,更好的效能
4,可移置性
5,與SQL整合 --支援所有SQL資料型別和Null值 ,另%type %rowType屬性型別更加強了這種整合
6,安全性
PL/SQL塊包括3個部分:
1,宣告部分 --變數,遊標,自定義異常, 區域性子程式
2,可執行部分 --執行命令,可巢狀子塊
3,異常處理部分
1PL/SQL塊
2 declare
3
4 begin
5 --SQL語句
6 --直接寫的SQL語句(DML/TCL)
7 --間接寫execute immediate <DDL/DCL命令字串>
8 --select 語句
9 <1>必須帶有into子句
10 select empno into eno from emp
11 where empno =7369;
12 <2>只能查到一行**********
13 <3>欄位個數必須和變數的個數一致
14 exception --異常
15 when <異常名字> then --特定異常
16 <處理語句>
17 when others then --所有異常都可捕獲
18 <處理語句>
19 end;
20
關鍵字: 分層查詢 函式 觸發器語法 Oracle物化檢視 跟蹤sql語句
本文詳細介紹從零開始學Oracle—PL/SQL(七)
語言特徵:
<1>,大小寫不敏感
<2>,複合符號的含義
:= 賦值操作符 ||連線操作符 ..範圍操作符 **求冪操作符 《,》標籤分隔符 --單行註釋 /*,*/多行註釋
<3>宣告變數 --變數名 資料型別 :=值 例: varA varchar2(10):='宣告變數';
<4>宣告常量 --變數名 constant 資料型別 := 值
---------------- 技巧:初始化變數和常量時,保留字default可替換:=賦值操作符--------------
<5>屬性型別
%type --引用某個變數或資料庫列的資料型別來宣告變數
%rowType --提供表示表中一行的記錄型別
<6>控制結構
a,條件控制 if then 或 if then else 或 if then elsif 或 case
b,迴圈控制 loop
while exit或exit when退出
for
c,順序控制 Goto Null語句
語法示例:
1--PL/SQL 簡單語法
2
3Begin
4 null;
5End;
6/
7
8Declare
9 varA number(4);
10Begin
11 varA := 1234;
12 DBMS_output.put_line(varA);
13End;
14/
15
16Declare
17 varA number(4);
18Begin
19 varA := 1234;
20 DBMS_output.put_line(varA);
21 Declare
22 varB number(4):=2234;
23 Begin
24 DBMS_output.put_line(varA);
25 DBMS_output.put_line(varB);
26 End;
27 DBMS_output.put_line(varB);
28End;
29/
30
31Declare
32 varA number(4);
33 varB number(4):=2234;
34Begin
35 varA := 1234;
36 DBMS_output.put_line(varA||' '||varB);
37End;
38/
39Begin塊 注意事項:
40-- 資料定義語言不能直接執行
41Begin
42 drop table depta;
43End;
44/
45
46-- select不能直接執行
47select --必須使用select into 形式,只能且必須返回一行
48Declare
49 varE empa%rowType; --與表的一行型別一樣
50 vno empa.empno%type; -- 與表的某列型別一樣
51Begin
52 vno := 7902;
53 select * into varE from empa where empno = vno;
54 DBMS_output.put_line( varE.ename||' '||varE.job);
55End;
56/
57
58inset --可以直接執行
59Declare
60 vno empa.empno%type;
61 vna empa.ename%type;
62 vjob empa.job%type;
63Begin
64 vno := 1236;
65 vna := 'Wing';
66 vjob := 'MANAGER';
67 insert into empa (empno,ename,job) values(vno,vna,vjob);
68End;
69/
70
71delete --可以直接執行
72Declare
73 vno empa.empno%type;
74Begin
75 vno := 5555;
76 delete from empa where empno = vno;
77End;
78/
79
80
81update --可以直接執行
82Declare
83 vno empa.empno%type;
84 rsal empa.sal%type;
85Begin
86 vno := 1236;
87 rsal := 100;
88 update empa set sal = nvl(sal,0) + rsal where empno = vno;
89End;
90/
91
92 --事物控制語言可以直接執行
93Declare
94 vno empa.empno%type;
95 rsal empa.sal%type;
96Begin
97 vno := 1236;
98 rsal := 100;
99 update empa set sal = nvl(sal,0) + rsal where empno = vno;
100 commit;
101End;
102/
103
104 -- 資料安全語言(DCL)不能直接執行
105Begin
106 grant connect to scott;
107End;
108/
關鍵字: 分層查詢 函式 觸發器語法 Oracle物化檢視 跟蹤sql語句
本文詳細介紹從零開始學Oracle—PL/SQL(七)
例子:
題:編寫程式 向DEPT表中插入一條記錄,
從鍵盤輸入資料,如果
資料型別輸入錯誤要有提示
無法插入記錄 也要有提示
只能輸入正數,如果有負數提示
declare
n number;
no dept.deptno%type;
nm dept.dname%type;
lc dept.loc%type;
exp exception; --使用者定義的變數
exp1 exception; --使用者定義的變數
num number:=0; --計數器
pragma exception_init(exp,-1); --預定義語句
--捆綁Oracle內建異常(-1錯誤和異常變數關聯),-1 主鍵衝突
pragma exception_init(exp1,-1476);除零異常
e1 exception; --使用者定義的變數
begin
--輸入值
no := '&編號';
num := num + 1;
if no < 0 then
raise e1; --自定義異常的引發
end if;
nm := '&名稱';
num := num +1;
lc := '&地址';
num := num +1;
n := 10 /0;
insert into dept values (no,nm,lc);
num := num +1;
commit;
exception
--自定義異常
when e1 then
dbms_output.put_line('編號不能為負數');
--資料型別不對
when value_error then
if num =0 then
dbms_output.put_line('編號資料型別不對');
elsif num = 1 then
dbms_output.put_line('名稱資料型別不對');
elsif num =2 then
dbms_output.put_line('地址資料型別不對');
end if;
rollback;
--主鍵衝突
when exp then
--sqlcode全域性變數 異常錯誤號
--sqlerrm全域性變數 異常的文字資訊
--dbms_output.put_line('異常的編號:'||sqlcode);
--dbms_output.put_line('異常的內容:'||sqlerrm);
--dbms_output.put_line('編號已存在') ;
rollback;
--非預定義異常(關聯錯誤號)
when exp1 then
dbms_output.put_line('0做了除數') ;
raise_application_error(-20001,'0做了除數');
--引起一個自定義的錯誤
--預先保留-20001 到 -29999編號
rollback;
--其他的異常
when others then
dbms_output.put_line('異常的編號:'||sqlcode);
dbms_output.put_line('異常的內容:'||sqlerrm);
-- dbms_output.put_line('出現錯誤');
rollback;
end;