ORACLE中%TYPE和%ROWTYPE的使用
1、%TYPE
為了使一個新定義的變數與另一個已經定義了的變數(通常是表的某一列)的資料型別保持一致,Oracle提供了%Type
的定義方式,當被參照的那個變數的資料型別發生改變時,那麼這個新定義的變數的資料型別也會隨之發生改變,這種定義方式類似與其他程式語言中的”var
“,其型別不由自己決定。而是由與之關聯的物件決定。這樣就不用修改Sql
語句了,當不能確切的知道那個變數的型別是,就採用這種方法來定義變數的資料型別。
DECLARE
V_ORG_NAME SF_ORG.ORG_NAME%TYPE; --與ORG_NAME型別相同
V_PARENT_ID SF_ORG.PARENT_ID%TYPE;--與PARENT_ID型別相同
BEGIN
SELECT ORG_NAME,PARENT_ID INTO V_ORG_NAME,V_PARENT_ID
FROM SF_ORG SO
WHERE SO.ORG_ID=&ORG_ID;
DBMS_OUTPUT.PUT_LINE('部門名稱:' || V_ORG_NAME);
DBMS_OUTPUT.PUT_LINE('上級部門編碼:' || TO_CHAR(V_PARENT_ID));
END;
2、%RowType
如果一個表有較多的列,使用%ROWTYPE
來定義一個表示表中一行記錄的變數,比分別使用%TYPE
來定義表示表中各個列的變數要簡潔得多,並且不容易遺漏、出錯。這樣會增加程式的可維護性。
為了使一個變數的資料型別與一個表中記錄的各個列的資料型別相對應、一致,Oracle
提供%ROWTYPE
定義方式。當表的某些列的資料型別改變了之後,這個新定義的變數的資料型別會自動跟隨其改變,容易保持一致,也不用修改PL/SQL
程式了。當不能確切地知道被參照的那個表的結構及其資料型別時,就只能採用這種方法定義變數的資料型別。
一行記錄可以儲存從一個表或遊標中查詢到的整個資料行的各列資料。一行記錄的各個列與表中一行的各個列有相同的名稱和資料型別。
DECLARE
V_SF_ORG_REC SF_ORG%ROWTYPE; --與SF_ORG表中的各個列相同
BEGIN
SELECT * INTO V_SF_ORG_REC
FROM SF_ORG SO
WHERE SO.ORG_ID=&ORG_ID;
DBMS_OUTPUT.PUT_LINE('部門ID:' || TO_CHAR(V_SF_ORG_REC.ORG_ID));
DBMS_OUTPUT.PUT_LINE('部門名稱:' || V_SF_ORG_REC.ORG_NAME);
DBMS_OUTPUT.PUT_LINE('上級部門編碼:' || TO_CHAR(V_SF_ORG_REC.PARENT_ID));
END;
注:上面的程式碼在Sql plus
中執行
%TYPE
和 %ROWTYPE
的使用
%TYPE
用在變數的宣告裡,用於取得表中的欄位型別;
%ROWTYPE
用於宣告基於某個表的行型別;
示例:
%ROWTYPE
使用
DECLARE
CURSOR pdct_cur
IS SELECT * FROM PRODUCTINFO;
cur_prodcrd productinfo%ROWTYPE;
BEGIN
OPEN pdct_cur;
FETCH pdct_cur INTO cur_prodrcd;
DBMS_OUTPUT_PUTLINE(cur_prodrcd.productid || '-' || cur_prodrcd.productname);
CLOSE pdct_cur;
END;
%TYPE
使用
DECLARE
cur_productid varchar(10);
cur_prodctname productinfo.productname%TYPE;
CURSOR pdct_cur
IS SELECT productid,productname FROM PRODUCTINFO;
BEGIN
OPEN pdct_cur;
FETCH pdct_cur INTO cur_productid ,cur_productname;
DBMS_OUTPUT_PUTLINE(productid || '-' ||productname);
CLOSE pdct_cur;
END;
簡述%TYPE
和%ROWTYPE
的用法
基礎概念:
%TYPE
概念:
為了使一個變數的資料型別與另一個已經定義了的變數(尤其是表的某一列)的資料型別相一致,Oracle
提供了%TYPE
定義方式。當被參照的那個變數的資料型別改變了之後,這個新定義的變數的資料型別會自動跟隨其改變,容易保持一致,也不用修改PL/SQL
程式了。當不能確切地知道被參照的那個變數的資料型別時,就只能採用這種方法定義變數的資料型別。
使用%TYPE
特性的優點在於:
- 所引用的資料庫列的資料型別可以不必知道。
- 所引用的資料庫列的資料型別可以實時改變。
%ROWTYPE
概念:
如果一個表有較多的列,使用%ROWTYPE
來定義一個表示表中一行記錄的變數,比分別使用%TYPE
來定義表示表中各個列的變數要簡潔得多,並且不容易遺漏、出錯。這樣會增加程式的可維護性。
為了使一個變數的資料型別與一個表中記錄的各個列的資料型別相對應、一致,Oracle提供%ROWTYPE
定義方式。當表的某些列的資料型別改變了之後,這個新定義的變數的資料型別會自動跟隨其改變,容易保持一致,也不用修改PL/SQL
程式了。當不能確切地知道被參照的那個表的結構及其資料型別時,就只能採用這種方法定義變數的資料型別。
一行記錄可以儲存從一個表或遊標中查詢到的整個資料行的各列資料。一行記錄的各個列與表中一行的各個列有相同的名稱和資料型別。
使用%ROWTYPE
特性的優點在於:
- 所引用的資料庫中列的個數和資料型別可以不必知道。
- 所引用的資料庫中列的個數和資料型別可以實時改變。
簡單例項
--學生結構表
CREATE TABLE STUDENT
(
ID INT NOT NULL, --學生主鍵ID
NAME VARCHAR2(50),--學生名稱
SEX INT --學生性別 0='男' 1='女'
);
--學生資訊
INSERT INTO STUDENT(ID, NAME, sex) VALUES(1, 'mike',0);
INSERT INTO STUDENT(ID, NAME, sex) VALUES(2, 'vancy',1);
--%TYPE例項1,簡單寫法
DECLARE
V_NAME STUDENT.NAME%TYPE; --與NAME型別相同
V_SEX STUDENT.SEX%TYPE; --與SEX型別相同
BEGIN
SELECT t.name,t.sex INTO V_NAME,V_SEX
FROM STUDENT t
WHERE t.id = &ID;
DBMS_OUTPUT.put_line('學生姓名:' || V_NAME);
DBMS_OUTPUT.put_line('學生性別:' || V_SEX);
END;
--%TYPE例項2,結合type自定義型別使用
DECLARE
--定義一個記錄型別
TYPE STUINFO_RECORD IS RECORD(
V_NAME STUDENT.NAME%TYPE, --與NAME型別相同
V_SEX STUDENT.SEX%TYPE --與SEX型別相同
);
--宣告自定義記錄型別變數
V_STUINFO_RECORD STUINFO_RECORD;
BEGIN
SELECT t.name,t.sex INTO V_STUINFO_RECORD
FROM STUDENT t
WHERE t.id = &ID;
DBMS_OUTPUT.put_line('學生姓名:' || V_STUINFO_RECORD.V_NAME);
DBMS_OUTPUT.put_line('學生性別:' || V_STUINFO_RECORD.V_SEX);
END;
--%ROWTYPE例項
DECLARE
V_STUDENT STUDENT%ROWTYPE; --與STUDENT表中的各個列相同
BEGIN
SELECT * INTO V_STUDENT
FROM STUDENT t
WHERE t.id=&ID;
DBMS_OUTPUT.PUT_LINE('學生ID:' || V_STUDENT.ID);
DBMS_OUTPUT.put_line('學生姓名:' || V_STUDENT.NAME);
DBMS_OUTPUT.put_line('學生性別:' || V_STUDENT.SEX);
END;
Oracle中 %ROWTYPE
:
%ROWTYPE
:表示該型別為行資料型別,儲存的時候為一行資料,一行有很多列,相當於表中的一行資料,也可以的遊標中的一行資料。
用到%ROWTYPE
作用是:當查詢整行的時候(SELECT * FROM EMP;
),那麼效率比每一個欄位對應快。
例如:
v_info emp%ROWTYPE; //該型別為emp表中的一行資料型別
v_cinfo c_emp%ROWTYPE //該型別為遊標c_emp中的一行資料型別
下面是一個例子:
Oracle程式碼
declare
r_emp emp%ROWTYPE; --該型別為emp表中一行的型別
cursor c_emp is SELECT * FROM emp ;
BEGIN
OPEN c_emp;
LOOP
FETCH c_emp into r_emp; --遊標中查詢出來的一行into進定義的變數r_emp中
EXIT WHEN c_emp%NOTFOUND;
dbms_output.put_line('員工姓名:' || r_emp.ename);
END LOOP;
CLOSE c_emp;
END;
相關文章
- Oracle遊標遍歷%rowtype中的記錄Oracle
- oracle enqueue typeOracleENQ
- Django中content_type的使用Django
- Go 中 type var string 和 type var = string 的區別Go
- ts中的type 和 interface 區別
- Linux中Type命令如何使用Linux
- TypeScript中,interface和type使用上有什麼區別?TypeScript
- python中isinstance()和type()有什麼區別?如何使用?Python
- 【區分】Typescript 中 interface 和 typeTypeScript
- Go 泛型語法又出 “么蛾子”:引入 type set 概念和移除 type list 中的 type 關鍵字Go泛型
- API 請求中的 VND 和 PRS 的意思(Media Type)API
- Oracle中job的使用詳解Oracle
- Oracle中Decode()函式的使用Oracle函式
- oracle中的CURRVAL和NEXTVAL用法Oracle
- Oracle中的for update 和 for update nowaitOracleAI
- [譯] Story 中 Type Mode 在 iOS 和 Android 上的實現iOSAndroid
- Typescript 中的 interface 和 type 到底有什麼區別TypeScript
- SAP MM Movement Type 503的使用
- input type="file"使用
- python的type和isinstance的區別Python
- Oracle中Date和Timestamp的區別Oracle
- oracle中distinct和group by的區別Oracle
- Oracle中exists和in的效能差異Oracle
- TypeScript 裡 interface 和 type 的區別TypeScript
- <button>和<input type=“button“> 的區別
- MySQL query_cache_type的DEMAND引數介紹和使用舉例MySql
- Go Type 使用場景Go
- oracle匯入TYPE物件報錯ORA-02304Oracle物件
- Java中的Type型別詳解Java型別
- TypeScript中,type、interface、class的區別TypeScript
- 談談 mysql和oracle的使用感受 -- 差異MySqlOracle
- cors允許的方法和contype-typeCORS
- input的type值型別和描述-HTML型別HTML
- Jquery使用[Input type="checkbox&jQuery
- Oracle案例03——RMAN-06091: no channel allocated for maintenance (of an appropriate type)OracleAINaNAPP
- 在oracle中監視索引的使用情況Oracle索引
- 在Hibernate中關於Oracle sequence的使用KHOracle
- 非空校驗在oracle和mysql中的用法OracleMySql