在定義變數時處理可以使用oracle規定的資料型別外,還可以使用%type和%rowtype來定義變數.
%type型別的變數是專門為儲存在資料列中檢索到的值而建立的.對於使用%type建立的變數,其資料型別由系統根據檢索的資料列的資料型別決定.
%rowtype型別的變數,它可以一次儲存從資料庫檢索的一行資料。
當你不知道表中的資料型別是什麼時候?那你就考慮%type來解決此問題。
%type
sql> declare
2 empno emp.empno%type;
//宣告的時候一定要加上表的中列
3 ename emp.ename%type;
4 job emp.job%type;
5 begin
6 select empno,ename,job into empno,ename,job from emp where empno='7369';
7 dbms_output.put_line(empno||'/'||ename||'/'||job);
8 end;
9 /
7369/smith/clerk
emp.empno%type;
解析:首先它到emp表中去查詢empno列 %type返回其資料的資料型別。
%type的好處:
1、 可移植性高(當我們對錶的資料型別發生改變時,使用者不必考慮定義變數型別)
2、 使用者不必檢視資料型別就可以定義變數能夠儲存檢索的資料。
%rowtype
sql> declare
2 row_data emp%rowtype;
3 begin
4 select * into row_data from emp where empno='7369';
5 dbms_output.put_line(row_data.empno||'/'||row_data.ename||'/'||row_data.job);
6 end;
7 /
注意:如果定義了%rowtype型別的變數,該變數的結構與定義表的結構完全相同,查詢時必須使用*或者列舉全部的字段資訊。
復合變數
復合變數可以將不同的資料型別的多個值儲存在乙個單元中.由於復合資料型別可以有使用者根據需要定義其結構,所以復合資料型別也稱為自定義資料型別。
pl/sql提供了兩種型別的復合資料型別:
1、 記錄型別
在記錄型別中可以儲存多個標量值,與資料庫中的行相似
2、 記錄表型別
允許使用者在程式**中使用」表
」,以便儲存多個行的資料。它只在程式執行期間有效。類似於程式**中集合|陣列。
記錄型別:
必須使用type語句定義記錄型別的語法宣告如下:
type record_name is record( f
ield_name data_type[not null, :=default value]
……… );
與%rowtype不同之處是
1、%rowtype查詢的是全部資料
2、記錄型別必須使用type語法格式宣告
//案例
sql> declare
2 type empinfo is record(
//宣告乙個記錄型別
3 empno number(4),
4 ename varchar2(10),
5 job varchar2(9)
6 );
7 8 emp_data empinfo;
//宣告乙個記錄型別的變數
9 begin
10 select empno,ename,job into emp_data from emp where empno=7369;
//查詢的結果賦值給定義的變數
11 dbms_output.put_line(emp_data.empno||'/'||emp_data.ename||'/'||emp_data.job);
12 end;
13 /
記錄表型別
它可以處理多個記錄或多個行記錄。
1、 為什麼使用記錄表型別呢?
因為我們查詢的資料的往往需要返回多行記錄,所以需要記錄表型別。
2、 定義記錄表型別
type table_name is table of data_type[not null] i
ndex by binary_integer;//主鍵的索引
declare
type table_emp is table of emp%rowtype //建立乙個表 此表的型別與emp表的型別一致
index by binary_integer;
type table_text is table of varchar2(20) //建立乙個表 此表具有乙個varchar2列的簡單表
index by binary_integer;
empt table_emp; //宣告記錄表型別的變數
tabtext table_text;
begin
案例:sql> declare
2 type table_emp is table of emp%rowtype
3 index by binary_integer;
4 empt table_emp;
5 begin
6 empt(1).ename:='wangyi';
7 dbms_output.put_line(empt(1).ename);
8 end;
9 /
//返回總記錄
sql> declare
2 type table_emp is table of emp%rowtype
3 index by binary_integer;
4 empt table_emp;
5 begin
6 dbms_output.put_line(empt.count);
7 end;
8 /
0//沒有記錄
//刪除的操作
表名.delete(記錄數);
//檢索記錄變數 f
irst:獲取第乙個的索引 n
ext:下乙個的索引 但是必須有引數 l
ast:最後乙個的索引
sql> declare
2 type table_emp is table of emp%rowtype
3 index by binary_integer;
4 empt table_emp;
5 i number(2):=1;
6 begin
7 while i<10
8 loop
9 empt(i).ename:='wangyi';
10 i:=i+1;
11 end loop;
12
13 dbms_output.put_line(empt.count);
14
15 empt.delete(2);
16
17 dbms_output.put_line(empt.count);
18
19 dbms_output.put_line(empt.first);
20 dbms_output.put_line(empt.next(2));
21 dbms_output.put_line(empt.last);
22 end;
23 /
ORACLE中 TYPE和 ROWTYPE的使用
為了使乙個變數的資料型別與另乙個已經定義了的變數 尤其是表的某一列 的資料型別相一致,oracle 提供了 type 定義方式。當被參照的那個變數的資料型別改變了之後,這個新定義的變數的資料型別會自動跟隨其改變,容易保持一致,也不用修改 pl sql 程式了。當不能確切地知道被參照的那個變數的資料型...
ORACLE中 TYPE和 ROWTYPE的使用
為了使乙個變數的資料型別與另乙個已經定義了的變數 尤其是表的某一列 的資料型別相一致,oracle 提供了 type 定義方式。當被參照的那個變數的資料型別改變了之後,這個新定義的變數的資料型別會自動跟隨其改變,容易保持一致,也不用修改 pl sql 程式了。當不能確切地知道被參照的那個變數的資料型...
ORACLE中 TYPE和 ROWTYPE的使用
1 type 為了使乙個新定義的變數與另乙個已經定義了的變數 通常是表的某一列 的資料型別保持一致,oracle提供了 type的定義方式,當被參照的那個變數的資料型別發生改變時,那麼這個新定義的變數的資料型別也會隨之發生改變,這種定義方式類似與其他程式語言中的 var 其型別不由自己決定。而是由與...