1、輸出信息設置
1.設置sql前綴
a.當前會話
SET SQLPROMPT "_USER@ _CONNECT_IDENTIFIER>"
b.永久設置
$ORACLE_HOME/sqlplus/admin/glogin.sql 文件中增長 SET SQLPROMPT "_USER@ _CONNECT_IDENTIFIER>"
2.經常使用set命令
set timing on --設置顯示「已用時間:XXXX」
set serveroutput on size 10000 --設置容許顯示輸出相似dbms_output
set feedback on --設置顯示「已選擇XX行」
set pagesize 10 --設置每一頁的行數
set time on --設置顯示當前時間(sql前綴上加時間)
set linesize 4000 --輸出一行字符個數,缺省爲80
set termout off; --必須寫在.sql文件中進行。--顯示腳本中的命令的執行結果,缺省爲on
set echo off --顯示start啓動的腳本中的每一個sql命令,缺省爲on
3.程序中使用替代變量
¶meter 編譯到該變量則讓輸入一次值,數值時直接加&,字符串放入引號內;
&¶meter 第一個用,後邊都用&則只用輸入一次值;
4.oracle的語句
DML:數據操縱語句
DDL: 對象定義語句
DCL:數據控制語句,權限授予和回收
2、程序加密,獲取源腳本
1.加密
Wrap命令行工具,能夠在命令行中實現源代碼文件的加密;
wrap iname=p_wrap_test_nc.sql oname=p_res_nc.plb
Dbms_ddl包,其中包括的方法也能夠實如今PL/SQL中進行代碼的加密;
DBMS_DDL.WRAP(VC_SQL)
DBMS_DDL.CREATE_WRAPPED(VC_SQL)
2.獲取定義腳本
exec dbms_output.put_line(dbms_metadata.get_ddl('PROCEDURE','P_WRAP_TEST_NC')); --全部對象的定義
SELECT LINE, TEXT FROM USER_SOURCE WHERE NAME = 'P_WRAP_TEST_NC'; --用戶本身定義的程序對象
3、PL/SQL定義
1.PL/SQL實現本地編譯,在服務器上使用底層語言,執行效率高,SQL引擎和PL/SQL引擎協同配合執行PL/SQL程序單元,並
將執行結果返給客戶端。集中發送SQL語句,一次編譯屢次使用,對用戶共享;不受操做系統限制,只要運行oracle便可
支持面向對象OOP,支持WEB應用程序。
2.PL/SQL程序定義
塊頭區: Program_Type[ procedure,function,package] program_name (parameter_name in/out parameter_type,….)
[Return datatype];
AS/IS
聲明區:var_name type specs;
declare能夠在任意位置聲明變量
變量輔助說明:Specs:Not null,default value,:=value,
常量定義:Var_name constant datatype :=value;
BEGIN
執行區:至少包含一條執行語句,甚至能夠是null,但不能爲空
EXCEPTION
異常區:when… then….
END;
注:
變量聲明區不能分開給變量賦值,能夠定義時賦初值;
不容許給輸入參數從新賦值;
輸入參數不能定義長度,變量聲明必須定義長度;
3.數據類型
a.char(n):定長字符數據,最大2000個字節,默認爲1,指定長度後會用空格填充;
b.varchar2(n):n必須得有,4000字節,變長字符型;
c.number(m,n):m有效數字位數,n處理位number(3,-3) 4567.258 5000
d.long:存2G數據,該類型字段不能用於表達式,where,order by,group by等特定字句中
e.boolean:不能用於建立表的字段描述,可用於存儲過程;
f.PLS_integer:帶符號的整數數據類型,比number計算快,硬件存儲
simple_integer: 非空約束,聲明時要賦初值,中間賦值也不能爲空
g.date:定長的日期值
timestamp:精確到小數點後6位的
h.anchored:%type類型, var_var1 表.字段%type;定義
i.可使用自定義數據類型來約束變量值的範圍
j.遊標變量類型v_cur_col cur_one%rowtype;
4.PL/SQL程序塊調試錯誤信息
show error
4、PL/SQL流程控制
1.IF語句:是一種條件判斷語句,首先執行一個條件判斷,根據條件的結果走不一樣的程序流程,過程化控制。
a.IF…THEN:一旦條件知足,順序執行1到n語句,條件不知足,則跳到END IF以後。
IF 條件1 THEN
執行語句1
…….
執行語句n
END IF;
b.IF…THEN….ELSE:else用來對不知足條件的狀況下進行友好處理。條件知足執行THEN後的語句,完成後調至END IF,
條件不知足,則執行ELSE後的語句,完了到END IF。
IF 條件1 THEN
執行語句1;
執行語句n;
ELSE
執行語句1;
執行語句2;
END IF;
c.ELSIF:存在複雜的多個互斥的條件使用,依次判斷條件是否知足,知足執行該條件下的語句,而後跳到END IF;
通常條件按順序進行。
IF 條件1 THEN
執行語句1;
ELSIF 條件2 THEN
執行語句2;
….
ELSIF 條件n THEN
執行語句n;
ELSE
執行語句;
END IF;
d.嵌套IF:在其餘語句塊中使用條件控制語句塊。
二、CASE語句:條件判斷語句,經過選擇器來判斷條件是否知足
a.簡單CASE語句:帶選擇器
CASE 選擇器
WHEN 選擇器值1 THEN 執行語句1;
WHEN 選擇器值2 THEN 執行語句2;
…..
WHEN 選擇器值n THEN 執行語句n;
ELSE 執行語句
END CASE; --case必需要寫
b.搜索式CASE語句:沒有選擇器,直接CASE WHEN 條件 THEN
CASE
WHEN 條件1 THEN 執行語句1;
WHEN 條件2 THEN 執行語句2;
…..
WHEN 條件n THEN 執行語句n;
ELSE 執行語句;
END CASE;
三、循環控制語句:在必定的週期執行一樣的事情,週期爲循環的次數。
a.簡單循環:loop 須要一個條件來中止循環,用exit 來退出循環。用IF條件判斷或者使用exit when退出循環
loop
執行語句;
IF 條件1 then
exit;--[ exit when 條件2 ]
end if
end loop;
b.while循環:能夠用條件設置提早推出循環,條件不知足直接退到循環外下一條執行
while 循環條件 loop
執行語句1;
執行語句2;
…..
執行語句n;
end loop;
c.for循環
範圍for循環:i做爲循環變量,in指定範圍,1爲進步,包涵邊界值
for i in 1..n loop
執行語句;
end loop;程序員
5、異常
運行過程當中的錯誤爲異常,是一種PL/SQL標識符,當運行的PL/SQL塊出現錯誤或警告,則會觸發異常處理。爲了提升
程序的健壯性,能夠在PL/SQL塊中引入異常處理部分,進行捕捉異常,並根據異常出現的狀況進行相應的處理。異常做用
範圍僅限當前語句塊,內部可使用外部的,外部不能使用內部的
1.異常分類
系統異常、自定義異常,其中系統異常又分爲:預約義異常和非預約義異常。
a.預約義異常,ORACLE定義了他們的錯誤編號和異常名字
NO_DATA_FOUND SELECT ... INTO ... 時,沒有找到數據
TOO_MANY_ROWS SELECT ... INTO ... 時,查詢的結果是多值
b.非預約義異常,ORACLE爲它定義了錯誤編號,但沒有定義異常名字。咱們使用的時候,先聲名一個異常名,
經過僞過程PRAGMA EXCEPTION_INIT,將異常名與錯誤號關聯起來。
c.自定義異常,程序員從咱們業務角度出發,制定的一些規則和限制。
2.異常處理
PL/SQL中,異常處理按個步驟進行:
定義異常
拋出異常
捕獲及處理異常
a.定義異常
exception_name EXCEPTION;
b.拋出異常
RAISE exception_name
c.捕獲及處理異常
EXCEPTION
WHEN e_name1 [OR e_name2 ... ] THEN
statements;
WHEN e_name3 [OR e_name4 ... ] THEN
statements;
......
WHEN OTHERS THEN
statements;
3.異常使用
a.預約義異常
DECLARE
V_ENAME EMP.ENAME%TYPE;
BEGIN
SELECT ENAME INTO V_ENAME FROM EMP WHERE DEPTNO = &DNO;
EXCEPTION
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('Too many rows are returned');
END;
b.非預約義異常
非預約義異常使用的基本過程
定義一個異常名
將異常名與異常編號相關聯
在異常處理部分捕捉並處理異常
DECLARE
E_DEPTID EXCEPTION;
PRAGMA EXCEPTION_INIT(E_DEPTID, -2292);
BEGIN
DELETE FROM DEPT WHERE DEPTNO = 10;
EXCEPTION
WHEN E_DEPTID THEN
DBMS_OUTPUT.PUT_LINE('at sub table have record!');
END;
c.自定義異常
自定義異常與Oracle錯誤沒有任何關係,有開發人員爲特定狀況所定義的例外
定義異常(在declare部分進行定義)
顯示觸發異常(在執行BEGIN部分觸發異常,使用RAISE語句)
引用異常(在EXCEPTION部分捕捉並處理異常)
DECLARE
E_INTEGRITY EXCEPTION;
PRAGMA EXCEPTION_INIT(E_INTEGRITY, -2291);
E_NO_EMPLOYEE EXCEPTION;
BEGIN
UPDATE EMP SET DEPTNO = &DNO WHERE EMPNO = &ENO;
IF SQL%NOTFOUND THEN
RAISE E_NO_EMPLOYEE;
END IF;
EXCEPTION
WHEN E_INTEGRITY THEN
DBMS_OUTPUT.PUT_LINE('The dept is not exists');
WHEN E_NO_EMPLOYEE THEN
DBMS_OUTPUT.PUT_LINE('The employee is not exists');
END;
d.使用異常函數處理異常
函數SQLCODE用於取得Oracle錯誤號
函數SQLERRM用於取得與錯誤號對應的相關錯誤消息*/
undef v_sal
declare
v_ename emp.ename%type;
begin
select ename into v_ename from emp
where sal=&&v_sal;
dbms_output.put_line('Employee Name:'||v_ename);
exception
when no_data_found then
dbms_output.put_line('The employee is not exists for salary '||&v_sal);
when others then
dbms_output.put_line('Error No:'||SQLCODE);
dbms_output.put_line(SQLERRM);
end;
RAISE_APPLICATION_ERROR:將應用程序專有的錯誤從服務器端轉達到客戶端
RAISE_APPLICATION_ERROR(error_number,message[,{true | false}]);
error_number:用於定義錯誤號,且錯誤號從-20000 到-20999 之間,以免與ORACLE 的任何錯誤代碼發生衝突
message:用於指定錯誤消息,且消息長度不能超過k,超出部分將被截取
CREATE OR REPLACE PROCEDURE RAISE_COMM(V_NO EMP.EMPNO%TYPE,
V_COMM OUT EMP.COMM%TYPE) AS
BEGIN
SELECT COMM INTO V_COMM FROM EMP WHERE EMPNO = V_NO;
IF V_COMM IS NULL THEN
RAISE_APPLICATION_ERROR(-20001, 'It is no comm for this employee');
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('The employee is not exist');
END;
4.異常處理
當發生異常後,程序將在錯誤處中止,並轉到該語句塊的末尾搜索是否有異常處理,有則處理,無或者異常不匹
配,則跳出當前可執行語句塊,到外層語句塊末尾找異常處理,不然交給操做系統處理。sql
動態,靜態sql
服務器