本節介紹PL SQL的基本內容 本節所舉示例數據來源oracle用戶scott下的emp表和dept表,數據如下: 一、plsql簡介: 1、概念:procedural language,過程化sql語言,是面向過程的語言,在普通sql的基礎上增加了編程語言的特點。PL/SQL的基本單元是塊。 2、 ...
本節介紹PL SQL的基本內容
本節所舉示例數據來源oracle用戶scott下的emp表和dept表,數據如下:
一、plsql簡介:
1、概念:procedural language,過程化sql語言,是面向過程的語言,在普通sql的基礎上增加了編程語言的特點。PL/SQL的基本單元是塊。
2、塊的介紹:
(1)基本結構:
DECLARE
(聲明部分)
BEGIN
(執行部分)
EXCEPTION
(異常處理部分)
END(結束標記)
紅色部分為必須部分,不可缺少
3、塊的分類:
(1)匿名塊:只會執行一次,被動態構造。
(2)子程式:存儲在資料庫中的存儲過程、函數、包等,完成一定功能,可以在其他程式上調用他們。
(3)當資料庫發生操作時,會觸發事件自動執行相應的程式。
(註:存儲過程、觸發器會在後面的博客中詳細說明)
二、標識符:
1、概念:不能超過30個字元,第一個字元必須為字母,不能用減號“-”,並且不區分大小寫。
2、變數的命名:為提高代碼可讀性,建議遵從以下規則:
(1)程式變數:v_variablename
(2)程式常量:v_constantname
(3)游標變數:cursorname_cursor
(4)異常標識:e_exceptionname
(5)記錄類型:recordname_record
Example:查詢雇員編號為7788的員工的工資雇員日期以及工資漲500後的結果。
DECLARE v_name VARCHAR2(20); v_sal NUMBER(7,2); v_hiredate DATE; c_addsal NUMBER(7,2):=500; v_newsal NUMBER(7,2); BEGIN SELECT ename,sal,hiredate INTO v_name,v_sal,v_hiredate FROM emp WHERE empno=7788; v_newsal := v_sal + c_addsal; DBMS_OUTPUT.PUT_LINE(v_name||'的工資為'||v_sal||'雇員日期為'||v_hiredate||'工資漲後為'||v_newsal); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('沒有員工數據'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLERRM); END;
上面是一個簡單的匿名塊,只用來執行一次,DBMS_OUTPUT.PUTLINE()用來做列印輸出,NO_DATA_FOUND是沒有查找到數據,SQLERRM錯誤信息。
三、記錄型變數和引用型變數:
1、引用型變數:
指數據類型和已經定義或資料庫中某一列的數據類型相同:
Example:v_name emp.ename%TYPE;這裡定義的變數v_name和emp表中的ename數據類型相同。
2、記錄型變數:
返回一個記錄類型,和資料庫表的數據類型一致。
Example:emp_record emp%rowtype;emp_record和資料庫表emp的數據類型相同,所以可以emp_record.ename
下麵各舉一個實例:
Example1:列印輸出7788的員工工資
DECLARE v_name emp.ename%TYPE; v_sal emp.sal%TYPE; BEGIN SELECT ename,sal INTO v_name,v_sal FROM emp WHERE empno=7788; DBMS_OUTPUT.PUT_LINE(v_name||'的工資是'||v_sal); END;
Example2:列印輸出7788的員工工資,使用記錄型變數
DECLARE emp_record emp%ROWTYPE; BEGIN SELECT * INTO emp_record FROM emp WHERE empno=7788; DBMS_OUTPUT.PUT_LINE(emp_record.ename||'的工資是'||emp_record.sal); END;
四、流程式控制制語句:
1、概念:分為3類
(1)條件控制語句:IF語句,CASE語句
(2)迴圈語句:LOOP語句
(3)順序語句:GOTO語句、NULL語句
Example1:根據輸入的值判斷等級並輸出
DECLARE v_level CHAR(1):='&LEVEL'; BEGIN IF v_level='A' THEN DBMS_OUTPUT.PUT_LINE('優秀'); ELSIF v_level='B' THEN DBMS_OUTPUT.PUT_LINE('良好'); ELSIF v_level='C' THEN DBMS_OUTPUT.PUT_LINE('一般'); ELSE DBMS_OUTPUT.PUT_LINE('輸入有誤'); END IF; END;
這裡用到了&這個符號,用來給變數進行賦值,會彈出第二個圖所示的視窗讓user賦值,最後給出結果,
其中用到的ELSIF 和ELSE可根據情況不要,註意這裡ELSIF 不是ELSEIF.
Example2:根據輸入的值判斷等級並輸出
DECLARE v_level CHAR(1):='&LEVEL'; BEGIN CASE v_level WHEN 'A' THEN DBMS_OUTPUT.PUT_LINE('優秀'); WHEN 'B' THEN DBMS_OUTPUT.PUT_LINE('良好'); WHEN 'C' THEN DBMS_OUTPUT.PUT_LINE('一般'); ELSE DBMS_OUTPUT.PUT_LINE('輸入有誤'); END CASE; END;
這裡用了CASE語句,他可以和IF語句相互轉換,喜歡用哪個看個人愛好。
Example3:列印輸出1,2,3,4,5
DECLARE v_num INT:=1; BEGIN LOOP DBMS_OUTPUT.PUT_LINE(v_num); EXIT WHEN v_num=5; v_num :=v_num+1; END LOOP; END;
這裡用了loop的基本迴圈。註意一定要有退出迴圈的條件,不然就會無限迴圈變為死迴圈。這裡用到了EXIT WHEN語句,是有條件的退出迴圈,
還有一個EXIT用來直接退出迴圈不加條件,另外在oracle 11g中有一個新特性,CONTINUE和CONTINUE WHEN ,其中CONTINUE用於跳過當
前迴圈,CONTINUE WEHN 用於有條件的跳過當前迴圈,實例如下:
Example3.2:列印輸出1,2,3,5
DECLARE v_num INT:=0; BEGIN WHILE v_num<5 LOOP v_num :=v_num+1; CONTINUE WHEN v_num=4; DBMS_OUTPUT.PUT_LINE(v_num); END LOOP; END;
這裡可以看到當數值為4是跳出了這輪迴圈並沒有輸出4.
Example4:列印輸出1,2,3,4,5
DECLARE v_num INT:=1; BEGIN WHILE v_num<=5 LOOP DBMS_OUTPUT.PUT_LINE(v_num); v_num :=v_num+1; END LOOP; END;
這裡用了while迴圈,和上個例子相比,只是將退出迴圈的條件從EXIT WHEN 改為了WHILE,沒有特別大的不同,用法看個人喜好。
Example5:倒序列印5,4,3,2,1
BEGIN FOR i IN REVERSE 1..5 LOOP DBMS_OUTPUT.PUT_LINE(i); END LOOP; END;
這裡用了For迴圈用來控制迴圈次數,也是起到一個退出迴圈的條件,但是更加精確次數,其中的REVERSE起的是倒序的作用,也可以去掉變為正序。
Example6:根據輸入的值判斷等級並輸出,如果輸入D則什麼都不做
DECLARE
v_level CHAR(1):='&LEVEL';
BEGIN
CASE v_level
WHEN 'D' THEN
GOTO the_next;
WHEN 'A' THEN
DBMS_OUTPUT.PUT_LINE('優秀');
WHEN 'B' THEN
DBMS_OUTPUT.PUT_LINE('良好');
WHEN 'C' THEN
DBMS_OUTPUT.PUT_LINE('一般');
END CASE;
<<the_next>>
null;
END;
這裡用到了GOTO,無條件跳轉到同一個程式的標簽,但不建議在任何編程語言中使用它,它會使程式難以跟蹤流程,難以維護。
同時用到了null語句,顧名思義,不做任何事情,其意義所在,是某些語句變得有意義,提高語句的可讀性和完整性。
五、嵌套迴圈
1、概念:指在一個迴圈中嵌套另一個迴圈的語句,用於標記嵌套迴圈的叫標號,使用<<label_name>>表示。
Example:列印輸出1x1到5x5的乘法口訣吧
BEGIN <<outter>> FOR i IN 1..5 LOOP <<inner>> FOR j IN 1..5 LOOP CONTINUE WHEN j>i; DBMS_OUTPUT.PUT_LINE(i||'*'||j||'='||i*j); END LOOP inner; END LOOP outter; END;
用了2層嵌套迴圈,CONTINUE WHEN 做跳出當前迴圈的條件,<<inner>><<outter>>分別用於結束內層迴圈和外層迴圈。
至此,plsql的基本內容完畢,其中還有些存儲過程和觸發器會在後面分節做精細說明。
2018-08-15 15:26:17