PLSQL的兩個屬性類型%type 和%rowtype

1.%type

定義一個變量,其數據類型與已經定義的某個數據變量的類型相同,或者與數據庫表的某個列的數據類型相同,這時可以使用%TYPE。
說白了就是將查詢到的某個列的結果要賦給 一個變量這會就用到了 %TYPE

例:

---查詢員工號爲7369的補助
declare
empcom emp.comm%type ;  --聲明一個empcom變量 
begin
   select comm into empcom from emp where empno=7369 ;---將查到的comm類型的結果值放到 empcom變量裏 
   dbms_output.put_line('員工補助是'||empcom) ;--- ||是連接字符用到
end ;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

declare 聲明部分定義了一個empcom 變量它的類型是 emp的comm屬性,意味着 後邊的程序將列值取出賦值給empcom 變量。
select comm into empcom from emp where empno=7369 ;
select … into… 表示將 查詢結果 賦給 empcom 。

2.%rowtype

PL/SQL 提供%ROWTYPE操作符, 返回一個記錄類型, 其數據類型和數據庫表的數據結構相一致。
使用%ROWTYPE特性的優點在於:
所引用的數據庫中列的個數和數據類型可以不必知道;
所引用的數據庫中列的個數和數據類型可以實時改變。
取出一個列的記錄可以存到使用rowtype 定義的變量裏。

---查詢king員工的所有信息。 %rowtype 使用
declare
empmsg emp%rowtype ; -- 定義一個empmsg變量 存一行的數據
begin
  select * into empmsg from emp where ename ='KING' ;
 dbms_output.put_line(empmsg.ename||':'||empmsg.sal) ; ---輸出
end ; 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

以下內容轉載自https://blog.csdn.net/wuya814070935/article/details/73835630

%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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章