oracle學習之路(四),oracle學習之路
LOB類型
ORACLE提供了LOB (Large OBject)類型,用於儲存大的資料對象的類型。ORACLE目前主要支援BFILE, BLOB, CLOB 及 NCLOB 類型。
NCLOB
儲存大的NCHAR字元資料類型。每個變數儲存大字元對象的位置,該位置指到大字元資料塊。大字元對象的大小<=4GB。
CLOB(Book)
儲存大的字元資料類型。每個變數儲存大字元對象的位置,該位置指到大字元資料塊。大字元對象的大小<=4GB。
BLOB(Photo)
儲存大的位元據類型。變數儲存大的二進位對象的位置。大二進位對象的大小<=4GB。
BFILE (Movie)
存放大的位元據對象,這些資料檔案不放在資料庫裡,而是放在作業系統的某個目錄裡,資料庫的表裡只存放檔案的目錄。
BIND 變數
綁定變數是在主機環境中定義的變數。在PL/SQL 程式中可以使用綁定變數作為他們將要使用的其它變數。為了在PL/SQL 環境中聲明綁定變數,使用命令VARIABLE。例如:
VARIABLE return_code NUMBERVARIABLE return_msg VARCHAR2(20)
可以通過SQL*Plus命令中的PRINT 顯示綁定變數的值。例如:
PRINT return_codePRINT return_msg
PL/SQL 表(TABLE)
定義記錄表(或索引表)資料類型。它與記錄類型相似,但它是對記錄類型的擴充。它可以處理多行記錄,類似於進階中的二維數組,使得可以在PL/SQL中模仿資料庫中的表。
定義記錄表類型的文法如下:
TYPE table_name IS TABLE OF element_type [NOT NULL]INDEX BY [BINARY_INTEGER | PLS_INTEGER | VARRAY2]
EXISTS(n)如果集合的第n個成員存在,則返回true
COUNT返回已經分配了儲存空間即賦值了的成員數量
FIRST:返回成員的最低下標值
LAST:返回成員的最高下標值
PRIOR(n)返回下標為n的成員的前一個成員的下標。如果沒有則返回NULL
NEXT(N)返回下標為n的成員的後一個成員的下標。如果沒有則返回NULL
TRIM:刪除末尾一個成員
TRIM(n) :刪除末尾n個成員
DELETE:刪除所有成員
DELETE(n) :刪除第n個成員
DELETE(m, n) :刪除從n到m的成員
EXTEND:添加一個null成員
EXTEND(n):添加n個null成員
EXTEND(n,i):添加n個成員,其值與第i個成員相同
LIMIT返回在varray類型變數中出現的最高下標值
- 第一個例子
聲明一個表類型,一個數字進行迴圈,第一個迴圈通過四次迴圈,往表類型數組中插入4條記錄,第二個迴圈通過迴圈整個表數組,輸出我們所需要的資料,
DECLARE TYPE dept_table_type IS TABLE OF dept%ROWTYPE INDEX BY BINARY_INTEGER; my_dname_table dept_table_type; v_count number(2) :=4;BEGIN FOR int IN 1 .. v_count LOOP SELECT * INTO my_dname_table(int) FROM dept WHERE deptno=int*10; END LOOP; FOR int IN my_dname_table.FIRST .. my_dname_table.LAST LOOP DBMS_OUTPUT.PUT_LINE('Department number: '||my_dname_table(int).loc); DBMS_OUTPUT.PUT_LINE('Department name: '|| my_dname_table(int).dname); END LOOP;END;
declare --定義記錄表資料類型 TYPE reg_table_type IS TABLE OF varchar2(25) INDEX BY BINARY_INTEGER; --聲明記錄表資料類型的變數 v_reg_table reg_table_type; i int :=1;begin v_reg_table(1):='李岩昊1'; v_reg_table(2):='李岩昊2'; v_reg_table(3):='李岩昊3'; v_reg_table(4):='李岩昊4'; v_reg_table(5):='李岩昊5'; FOR INT IN i .. v_reg_table.LAST LOOP DBMS_OUTPUT.put_line('我第'||i||'個名字'||v_reg_table(i)); i:=i+1; END LOOP;end;
declare --定義記錄表資料類型 TYPE employee_table_type IS TABLE OF t_employee%ROWTYPE INDEX BY BINARY_INTEGER; --聲明記錄表資料類型的變數 my_employee_table employee_table_type; i int :=1;begin SELECT fnumber,fname,fage,fsalary INTO my_employee_table(1).fnumber,my_employee_table(1).fname,my_employee_table(1).fage,my_employee_table(1).fsalary FROM t_employee WHERE t_employee.fnumber='DEV002'; SELECT fnumber,fname,fage,fsalary INTO my_employee_table(2).fnumber, my_employee_table(2).fname, my_employee_table(2).fage, my_employee_table(2).fsalary FROM t_employee WHERE t_employee.fnumber='SALES001'; FOR int IN i .. 2 LOOP Dbms_Output.put_line('僱員 DEV002:'||my_employee_table(i).fname); i:=i+1; END LOOP;end;