Oracle 10g讀書筆記
1、使用Oracle 10.2自帶的SQL Plus工具
連接數據庫:
Conn 用戶名/密碼@數據庫標識例如orcl
2、創建一個函數
create or replace function getname(empid varchar2)
return varchar2
is
xm varchar2(20);
begin
select ename into xm from emp where empno=empid;
return xm;
end;
/
執行函數方法之一:
Select getname(‘7900’) from dual ;
執行函數方法之二:
Var no varchar2(20) ;
Exec :no :=getname(‘7900’) ;
Print no ;
函數的另外一個示例:
CREATE OR REPLACE FUNCTION annual_income(name VARCAR2)
RETURN NUMBER IS
Annual_salary NUMBER(7,2);
BEGIN
Select sal*12+nvl(comm,0) INTO annual_salary FROM emp WHERE LOWER(ename)=LOWER(name);
RETURN annual_salary;
END;
/
執行方法:
Var income NUMBER ;
CALL annual_incom(‘scott’) into :income;
Print income;
3、存儲過程
create or replace procedure for_loop1(
v_num1 in number,
v_num2 in number)
is
i number(3);
begin
if v_num1<=v_num2 then
i:=v_num1;
for i in v_num1..v_num2 loop
dbms_output.put_line(i);
end loop;
else
i:=v_num2;
for i in v_num2..v_num1 loop
dbms_output.put_line(i);
end loop;
end if;
end;
/
使用execute 方法執行存儲過程,如:
Exec 存儲過程名(參數1,參數2……..)
存儲過程另外一個示例:
Create or replace procedure update_sal(name VARCHAR2,newsal NUMBER)
IS
BEGIN
Update emp set sal=newsal where lower(ename)=lower(name);
END;
/
執行存儲過程:
方法一:exec update_sal(‘scott’,5000);
方法二:call update_sal(‘scott’,5000);
4、匿名塊的使用
declare
cursor emp_cursor is select ename,sal from emp for update;
emp_record emp_cursor%rowtype;
begin
open emp_cursor;
loop
fetch emp_cursor into emp_record;
exit when emp_cursor%notfound;
if (emp_record.sal<2000) then
update emp set sal=sal*1.2 where current of emp_cursor;
end if;
end loop;
end;
匿名塊在輸入/後執行。
注意:使用匿名塊時,要交互式執行,則需要先運行set serveroutput on語句
另外一個:
declare
name varchar2(20);
begin
select ename into name from emp where empno=&no;
dbms_output.put_line('查找到得雇員是:'||name);
EXCEPTION
when no_data_found then
dbms_output.put_line('該雇員不存在!');
end;
5、PLSQL Developer是一個獨立的開發工具,不是Oracle的產品。
6、包:在包中聲明包含的函數和存儲過程名稱及參數、返回值;在包體中實現包中函數、存儲過程代碼。
在引用包中的存儲過程或函數時,需要用包名進行限定引用。
7、類型變量的使用
declare
name emp.ename%type;
begin
select ename into name from emp where empno='7654';
dbms_output.put_line(name);
end;
/
8、record變量相當於一個結構
declare
type emp_record is record
(
name emp.ename%type,
salary emp.sal%type
);
rs emp_record;
begin
select ename,sal into rs from emp where empno=&no;
dbms_output.put_line('雇員姓名:'||rs.name);
dbms_output.put_line('雇員薪水:'||rs.salary);
end;
/
特別注意,在結構中的每一個變量定義之後,是逗號而非分號;最後一個變量之後沒有標點符號。
9、使用動態游標
DECLARE
TYPE c IS REF CURSOR;
empcur c;
vname emp.ename%TYPE;
vsalary emp.sal%TYPE;
BEGIN
OPEN empcur FOR
SELECT ename,sal from emp WHERE empno='7654';
LOOP
FETCH empcur into vname,vsalary;
EXIT WHEN empcur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('姓名:'||vname||' 薪水:'||vsalary);
END LOOP;
CLOSE empcur;
END;
/
此動態游標的關鍵之處在於:在聲明部分聲明這是一個引用游標,用戶定義一個引用游標,在引用游標打開的時候,才定義SELECT語句。
特別注意:此為動態游標,與靜態游標不同之處在於:靜態游標在定義游標時同時指明SELECT語句;動態游標在打開游標時才指明SELECT語句。
靜態游標示例:
DECLARE
CURSOR emp_cursor IS select ename,sal from emp for update;
emp_record emp_cursor%ROWTYPE;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO emp_record;
EXIT WHEN emp_cursor%NOTFOUND;
IF (emp_record.sal<2000) THEN
update emp set sal=sal*1.2 where CURRENT OF emp_cursor;
END IF;
END LOOP;
END;
10、大批量數據存儲LOB(large object)
Lob變量分為內部lob變量和外部lob變量。
內部lob變量又分為clob\blob\nclob,數據存儲於數據庫中,並支持事務操作。
Clob\nclob主要用於支持大字符串存儲;
Blob主要用於支持大二進制的數據存儲;
BFILE主要支持外部文件存儲,如電影文件等,BFILE字段主要存儲指向外部文件的指針。
11、在oracle 10g 中,日期時間的表述,必須用單引號引起來。
12、NVL函數的使用
使用nvl函數,主要是處理表字段中的null值
語法:nvl(exp1,exp2)
說明:如果exp1是空,則返回exp2
如果exp1不為空,則返回exp1
示例:select ename,nvl(sal,0) from emp;
13、NVL2函數的使用
使用nvl2函數,主要處理表中字段的null值
語法:nvl2(exp1,exp2,exp3)
說明:如果字段exp1為非空,則返回exp2的值,否則返回exp3的值
示例:select ename,nvl2(sal,333,444) from emp;
14、在oracle中,表間連接的左外連接和右外連接時,可以使用(+),而不是微軟sql server 的*號。
例如:左外連接:
select dept.dname,emp.ename,emp.job from emp,dept where emp.deptno(+)=dept.deptno;
右外連接:
select dept.dname,emp.ename,emp.job from emp,dept where emp.deptno=dept.deptno(+);
但是最好使用:left inner join或right inner jion關鍵字
15、子查詢中的成對比較
例如:
Select ename,sal,comm,deptno from emp
Where (sal,nvl(comm,-1)) in (select sal,nvl(comm,-1) from emp where deptno=30);
在成對比較中,必須是sal和nvl(comm,-1)的值,即:兩個值都相同時才算符合條件。
16、創建表時使用子查詢
create table test(deptname,name,job) as
select dept.dname,emp.ename,emp.job from emp,dept where emp.deptno=dept.deptno;
17、日期時間函數
在oracle中,日期時間函數的處理方式和MS SQL SERVER 中的大不相同,要特別注意。
在oracle中:
日期時間函數主要用於表達date 、timestamp數據類型的數據。Oracle用7位來表達日期時間數據,包含:世紀、年、月、日、時、分、秒,且默認日期格式為:DD-MON-YY。
Ø Add_months(d,n):返回指定日期之前或之後指定月份的日期,n為正表示在指定日期之後,n為負表示在指定日期之前的日期。
declare
v_date date;
begin
v_date:=add_months(sysdate,-2);
dbms_output.put_line(to_char(v_date));
end;
/
Ø Current_date 用於返回當前會話時區的日期值
alter session set time_zone ='+8:0';
alter session set nls_date_format='YYYY-MM-DD';
select sysdate from dual;
select current_date from dual;
select current_timestamp from dual;
上述語句用於更改時區和設置日期時間格式。
Ø select dbtimezone from dual;
返回數據庫所在的時區
Ø Extract函數用於返回日期中指定的部分
select extract(year from sysdate) from dual;
select extract(month from sysdate) from dual;
select extract(day from sysdate) from dual;
Ø last_day(d),用於返回日期所在月份的最後一天的日期值
select last_day(sysdate) from dual;
Ø month_between(d1,d2),返回給定的兩個日期相差的月份數量。
select months_between(sysdate,'2009-12-31') from dual;
日期的天數相同時,返回整數。
Ø 返回當前對話的時區
select sessiontimezone from dual;
返回當前系統日期
Select sysdate from dual;
Ø 返回單點日期時間及時區
select systimestamp from dual;
18、轉換函數
Ø 將一種數據類型轉換為另外一種數據類型:Cast(expr as type_name)
declare
v_cdate varchar2(20);
begin
v_cdate:=cast(sysdate as varchar2);
dbms_output.put_line(v_cdate);
end;
/
Ø 將日期時間值轉換為字符串to_char()
Select to_char(sysdate,'YYYY-mm-dd') from dual;
Ø 將符合日期時間格式的字符串轉換為日期時間值to_date()
select to_date('01-12-2009','DD-MM-YYYY') from dual;
Ø user 用於返回當前數據庫用戶名稱
select user from dual;
19、使用類型變量插入數據
declare
v_deptno dept.deptno%type;
v_dname dept.dname%type;
begin
v_deptno:=&no;
v_dname:='&deptname';
insert into dept(deptno,dname) values(v_deptno,v_dname);
end;
/
上述方法直接使用表中已經定義了的變量類型,沒有使用簡單的數據類型,此方法較好。看下例,在變量聲明時賦值,且用子查詢插入數值:
declare
v_deptno dept.deptno%type:=&no;
begin
insert into employee
select * from emp where deptno=v_deptno;
end;
/
20、使用子查詢更新數據
declare
v_ename emp.ename%type:='&name';
begin
update emp set (sal,comm)=(select sal,comm from emp where ename=v_ename)
where job=(select job from emp where ename=v_ename);
end;
/
使用子查詢更新數據。
21、使用游標
使用顯示游標,有四個游標屬性:SQL%FOUND、SQL%NOTFOUND、SQL%ROWCOUNT、SQL%ISOPEN
SQL%ISOPEN屬性確定游標是否已經打開;
SQL%FOUND、SQL%NOTFOUND屬性用於判斷SQL語句是否執行成功,執行成功返回TRUE屬性,否則返回FALSE屬性;
SQL%ROWCOUNT屬性用於返回游標執行影響的數據行數。
例:
declare
v_deptno dept.deptno%type:=&no;
begin
update emp set sal=sal*1.1 where deptno=v_deptno;
if sql%found then
dbms_output.put_line('語句執行成功!');
else
dbms_output.put_line('該部門不存在雇員!');
end if;
end;
/
又例:
declare
v_deptno dept.deptno%type:=&no;
begin
update emp set sal=sal*1.1 where deptno=v_deptno;
dbms_output.put_line('update語句修改了'||SQL%ROWCOUNT||'行數據!');
end;
/
22、在匿名塊中使用事務
declare
v_sal emp.sal%type:=&sal;
v_ename emp.ename%type:='&name';
begin
update emp set sal=v_sal where ename=v_ename;
commit;
exception
when others then rollback;
end;
/
注意:沒有事務開始語句,直接就使用事務了。
23、使用CASE語句
第一種使用方式:CASE 語句使用單值進行比較
declare
v_deptno emp.deptno%type;
begin
v_deptno:=&no;
case v_deptno
when 10 then
update emp set comm=10 where deptno=v_deptno;
when 20 then
update emp set comm=20 where deptno=v_deptno;
when 30 then
update emp set comm=30 where deptno=v_deptno;
else
dbms_output.put_line('該部門編號不存在!');
end case;
end;
/
第二種使用方式:CASE 語句使用表達式進行比較
declare
v_sal emp.sal%type;
v_ename emp.ename%type;
begin
select ename,sal into v_ename,v_sal from emp where empno=&no;
case
when v_sal<1000 then
update emp set comm=100 where ename=v_ename;
when v_sal<2000 then
update emp set comm=80 where ename=v_ename;
when v_sal<6000 then
update emp set comm=60 where ename=v_ename;
end case;
end;
/
24、loop循環
declare
i int:=1;
begin
loop
insert into t values(i);
exit when i=10;
i := i+1;
end loop;
end;
/
While循環
declare
i int:=11;
begin
while i<=100 loop
insert into t values(i);
i := i+1;
end loop;
end;
/
For 循環,注意:for循環的循環變量不需要顯示定義,只需要使用即可,系統自動會定義,且自動遞加。
begin
for i in 111..120 loop
insert into t values(i);
end loop;
end;
/
24、在使用顯示游標,明確四個系統變量
使用顯示游標,有四個游標屬性:SQL%FOUND、SQL%NOTFOUND、SQL%ROWCOUNT、SQL%ISOPEN
SQL%ISOPEN屬性確定游標是否已經打開;
SQL%FOUND、SQL%NOTFOUND屬性用於判斷SQL語句是否執行成功,執行成功返回TRUE屬性,否則返回FALSE屬性;
SQL%ROWCOUNT屬性用於返回游標執行影響的數據行數。
declare
cursor emp_cursor is
select ename,sal from emp where deptno=10;
v_ename emp.ename%type;
v_sal emp.sal%type;
begin
open emp_cursor;
loop
fetch emp_cursor into v_ename,v_sal;
exit when emp_cursor%notfound;
dbms_output.put_line('姓名:'||v_ename||' 薪水:'||v_sal);
end loop;
close emp_cursor;
end;
/
使用游標記錄型變量
declare
cursor emp_cursor is (select ename,sal from emp);
emp_record emp_cursor%rowtype; //記錄類型的變量
begin
open emp_cursor;
loop
fetch emp_cursor into emp_record;
exit when emp_cursor%notfound;
dbms_output.put_line('雇員姓名:'||emp_record.ename||' 雇員工資:'||emp_record.sal);
end loop;
close emp_cursor;
end;
25、參數游標
所謂參數游標,即為帶參數的游標。可以反復根據不同參數使用。
declare
cursor emp_cursor(no number) is (select ename from emp where deptno=no);
v_ename emp.ename%type;
begin
open emp_cursor(10);
loop
fetch emp_cursor into v_ename;
exit when emp_cursor%notfound;
dbms_output.put_line('姓名是:'||v_ename);
end loop;
close emp_cursor;
end;
/
其中:no就是游標參數,每次可以帶不同的參數。
26、使用游標更新數據、刪除數據
使用顯示游標,可以更新或刪除游標當前所在數據行的數據。注意:使用游標更改數據或刪除數據時,在游標定義語句上需要加上for update 關鍵字。
語法:
Cursor cursor_name(paramterName datatype)
Is
Select_statement
FOR UPDATE [OF COLUMN_REFERENCES][NOWAIT]
此for update 語句用於在要操作的數據上加更改鎖。Of 子句用於在同時操作多張表時在哪張表上加鎖。
為了更新或刪除當前游標指定行的數據,必須在update或delete語句中使用where current of 子句。
示例:
declare
cursor emp_cursor is select ename,sal from emp for update;
v_ename emp.ename%type;
v_oldsal emp.sal%type;
begin
open emp_cursor;
loop
fetch emp_cursor into v_ename,v_oldsal;
exit when emp_cursor%notfound;
if v_oldsal <2000 then
update emp set sal=sal+500 where current of emp_cursor;
end if ;
end loop;
end;
刪除數據:
declare
cursor emp_cursor is select ename,sal,deptno from emp for update;
v_ename emp.ename%type;
v_oldsal emp.sal%type;
v_deptno emp.deptno%type;
begin
open emp_cursor;
loop
fetch emp_cursor into v_ename,v_oldsal,v_deptno;
exit when emp_cursor%notfound;
if v_deptno=30 then
delete from emp where current of emp_cursor;
end if ;
end loop;
end;
27、游標for 循環
游標for 循環是使用游標的簡單方式,單使用游標for 循環時,oracle會主動打開游標,使用完畢後,會主動關閉游標。
語法:
FOR record_name IN cursor_name LOOP
Statement;
END LOOP;
注意:record_name 是oracle隱含的記錄變量名。
示例:
declare
cursor emp_cursor is select ename from emp;
begin
for rs in emp_cursor loop
dbms_output.put_line('第'||emp_cursor%rowcount||'條記錄!雇員姓名是:'||rs.ename);
end loop;
end;
28、例外(異常)
Oracle的例外分為三種:1、預定義列外 2、非預定義例外 3、自定義例外
例外使用:exception來捕捉
declare
v_ename emp.ename%type;
begin
select ename into v_ename from emp where deptno=&no;
dbms_output.put_line('姓名是:'||v_ename);
exception
when no_data_found then
dbms_output.put_line('沒有檢索到數據!');
end;
29、創建存儲過程
Ø
創建一個無參數的存儲過程
CREATE OR REPLACE PROCEDURE UP_TEST AS
BEGIN
dbms_output.put_line('這是一個測試用的存儲過程!'||sysdate);
END UP_TEST;
執行存儲過程:
Set serveroutput on;
Exec up_test; 或 call up_test();
Ø
創建一個帶輸入參數的存儲過程
CREATE OR REPLACE PROCEDURE UP_ADDEMPLOYEE
(
ENO IN NUMBER
, NAME IN VARCHAR2
, SAL IN NUMBER
, JOB IN VARCHAR2 DEFAULT '秘書'
, DNO IN NUMBER
) AS
e_integrity exception;
pragma exception_init(e_integrity,-2291);
BEGIN
insert into emp(empno,ename,sal,job,deptno) values(eno,name,sal,job,dno);
exception
WHEN dup_val_on_index then
raise_application_error(-20000,'雇員編號不能重復!');
when e_integrity then
raise_application_error(-20001,'部門編號不存在!');
END UP_ADDEMPLOYEE;
/
執行存儲過程
exec up_addemployee(8888,'康師傅',3000,'經理',10);
當再次運行此存儲過程時,發生錯誤。或部門編號與部門表中編號不存在時,發生錯誤。
Ø
創建一個帶輸出參數的存儲過程
CREATE OR REPLACE PROCEDURE UP_QUERY_EMPLOYEE
(
ENO IN NUMBER ,
NAME OUT VARCHAR2 ,
SALARY OUT NUMBER
) AS
BEGIN
select ename,sal into name,salary from emp where empno=eno;
exception
when no_data_found then
raise_application_error(-20000,'沒有查找到數據!');
END UP_QUERY_EMPLOYEE;
執行存儲過程(PLSQL Developer中):
SQL>var aname varchar2(10);
SQL> var asal number;
SQL> exec UP_QUERY_EMPLOYEE(7788,:aname,:asal);
SQL>
上述存儲過程執行時采用的都是按位置進行參數傳遞,如果按照參數傳遞變量,則示例如下:
SQL>exec up_addemployee ( empno =>8888, ename=>'康師傅', sal=>3000, job=>'經理',deptno=>10);
30、創建一個函數
CREATE OR REPLACE FUNCTION UF_GETUSER
RETURN VARCHAR2
AS
v_user varchar2(100);
BEGIN
select username into v_user from user_users;
RETURN v_user;
END UF_GETUSER;
執行函數:
select uf_getuser() from dual;
函數的帶輸入參數、帶輸出參數、帶輸入輸出參數,都與存儲過程的方式一樣的。
31、查看用戶對象系統表
select object_name,object_type from user_objects;
注意:user_objects即為用戶創建對象的管理表格。
32、包
包是邏輯相關的存儲過程、函數等的組合體。包分包規范和包體,包規范中規定包含的有邏輯關系的存儲過程和函數;包體中實現包規范中規定的存儲過程和函數。
建立包時:先建立包規范,再建立包體及包體中的存儲過程和函數實現。
Ø 建立包規范
包規范實際上是包與應用程序之間的接口,包括:常量、變量、游標、過程和函數。這些變量、常量、游標不但可以在包內使用,也可以在過程和函數內使用。
create or replace package emp_pg
is
g_deptno
number:=30;
procedure add_employee(eno
number,
name varchar2,salary
number,dno
number default g_deptno);
procedure fire_employee(eno
number);
function get_sal(eno
number)
return number;
end emp_pg;
Ø 建立包體
建立包體就是創建包規范中定義的存儲過程和函數
create or replace package body emp_pg
is
/*校驗部門編號是否在范圍之內*/
function validate_deptno(v_deptno
number)
return boolean is
v_temp
int;
begin
select 1
into v_temp
from dept
where deptno = v_deptno;
return true;
exception
when no_data_found
then
return false;
end;
/*增加一個雇員*/
procedure add_employee(eno
number,
name varchar2,
salary
number,
dno
number default g_deptno)
is
begin
if validate_deptno(dno)
then
insert into emp
(empno, ename, sal, deptno)
values
(eno,
name, salary, dno);
else
raise_application_error(-20010, '不存在該部門!');
end if;
exception
when dup_val_on_index
then
raise_application_error(-20011, '已有同名的人!');
end;
/*開除一個雇員*/
procedure fire_employee(eno
number)
is
begin
delete from emp
where empno = eno;
if SQL%
notfound then
raise_application_error(-20012, '該雇員不存在!');
end if;
end;
function get_sal(eno
number)
return number is
v_sal emp.sal%
type;
begin
select sal
into v_sal
from emp
where empno = eno;
return v_sal;
exception
when no_data_found
then
raise_application_error(-20012, '該雇員不存在!');
end;
end emp_pg;
執行包中的過程或函數的方法:
exec emp_pg.add_employee(9901,'YY',4500,10);
exec emp_pg.g_deptno:=30;
exec emp_pg.fire_employee(9901);
執行包中的函數的方法:
SQL> var s number;
SQL> exec :s:=emp_pg.get_sal(7788);
包中的函數或存儲過程可以進行重載(overload),只需要在包體的is關鍵詞前加overload關鍵詞即可。重載即函數或過程名稱相同,參數類型不同的函數或存儲過程。
包構造過程,在包體的最後,在begin…end塊間,主要用來初始化包的全局變量。
33、Oracle 10g不但允許在DML語句上定義觸發器,還允許在事件上定義觸發器(如:啟動例程、關閉例程、登錄或斷開會話)
34、觸發器類型分為:前觸發(BEFORE)、後觸發(AFTER)
35、觸發器級別上分:表級觸發器和行級觸發器
36、觸發器觸發過程中條件謂詞
u INSERTING當觸發事件是insert操作時,此條件謂詞為true,否則為false;
u UPDATING當觸發事件是update操作時,此條件謂詞為true,否則為false;
u DELETING當觸發事件是delete操作時,此條件謂詞為true,否則為false;
create or replace trigger tr_sec
before insert or update or delete on emp
for each row
begin
if (to_char(
sysdate, 'DY', 'nls_date_language=AMERICAN')
in ('SAT', 'SUN'))
then
case
when inserting
then
raise_application_error(-20001, '不能再周末新增雇員信息!');
when updating
then
raise_application_error(-20002, '不能再周末更改雇員信息!');
when deleting
then
raise_application_error(-20003, '不能再周末解雇雇員!');
end case;
end if;
end tr_sec;
37、行級觸發器(old new指示代詞的使用)
當進行行觸發時,默認情況下,:old修飾符引用舊的一行數據,:new修飾符引用新的一行數據。如插入的數據不能小於原來的數據,否則就觸發一個信息提示。
create or replace trigger tri_emp
before update of sal on emp
for each row
begin
if :new.sal < :old.sal then
raise_application_error(-20001,'工資只升不降!');
end if ;
end tri_emp;
38、特定情況下的觸發語句
當使用行觸發器時,使用when子句指定特定情況下行觸發器。
CREATE OR REPLACE TRIGGER TRI_WHEN
AFTER UPDATE OF sal ON EMP
FOR EACH ROW
WHEN (old.job='saleman')
declare
v_temp integer;
BEGIN
select count(*) into v_temp from emp_t where name=:old.ename;
if v_temp=0 then
insert into emp_t values(:old.ename,:old.sal,:new.sal,sysdate);
else
update emp_t set oldsal=:old.sal,newsal=:new.sal,time=sysdate where name=:old.ename;
end if;
END;
注意:當使用update語句時,只有job=’saleman’的記錄能夠被更新。
39、LOB類型(large blob)
Lob類型包括內部lob和外部lob兩種。內部lob又分為clob,blob和nclob三種類型,數據存儲在數據庫中,且支持事務操作。外部lob只有bfile數據類型,支持os文件類型,且不支持事務操作。
Clob和nclob支持大量字符串存儲,blob支持大量二進制文件操作。
Dbms_lob是oracle提供的,專門用於操作lob類型數據的PL/SQL包,該包定義了一些常量、函數和過程,可以直接使用。
(1)、常量
File_readonly CONSTANT BINARY_INTEGER:=0;
Lob_readonly CONSTANT BINARY_INTEGER:=0;
Lob_readwrite CONSTANT BINARY_INTEGER:=1;
Lobmaxsize CONSTANT INTEGER:=4294967295;
Call CONSTANT PLS_INTEGER :=12;
Session CONSTANT PLS_INTEGER :=10;
(2)、過程append,將數據添加到內部lob數據的尾部。
declare
dest_lob clob;
src_lob clob;
begin
src_lob:='你好';
dest_lob:='中國!';
dbms_lob.append(dest_lob,src_lob);
dbms_output.put_line(dest_lob);
end;
(3)、過程close
Dbms_lob.close(dest_lob);
(4)、函數compare
(5)、過程copy
(6)、過程erase
40、oracle的系統包簡介
dbms_output包等很多實用程序包
*