ORACLE中%TYPE和%ROWTYPE的使用

風靈使發表於2018-08-28

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;  

相關文章