Oracle PL/SQL (3) - 記錄類型(TYPE 類型名稱 IS RECORD)

對于Oracle數(shù)據(jù)類型,主要使用的是VARCHAR2、NUMBER、DATE等類型,但是這些基本數(shù)據(jù)類型,如果在進(jìn)行一些實(shí)際操作的時(shí)候就會(huì)比較麻煩。
獲取一個(gè)雇員的完整信息:

例如下面這個(gè)例子,各個(gè)數(shù)據(jù)類型均被單獨(dú)定義.

declare
      v_claimno         emb.claim.claimno%TYPE;
      v_accidentno      emb.claim.acc_no%TYPE;
      v_totalamount     emb.claim.estimate_amount%TYPE;
      v_assigndate      emb.claim.assigndate%TYPE;
begin
      v_claimno:='541';
      select t.acc_no,t.estimate_amount,t.assigndate into v_accidentno, v_totalamount, v_assigndate from claim t where t.claimno=v_claimno;
      DBMS_OUTPUT.put_line('事故號:'||v_accidentno||'   定損總金額:'||NVL(v_totalamount,2)||'  任務(wù)分配時(shí)間:'||TO_CHAR(v_assigndate,'yyyy-mm-dd'));
  EXCEPTION
     WHEN others THEN
        RAISE_APPLICATION_ERROR(-20007,'此定損單不存在!');
end;
/

輸出結(jié)果:
事故號:9040622410008F03AD
定損總金額:1862.46
任務(wù)分配時(shí)間:2020-03-30

1、定義記錄類型語法

TYPE 類型名稱 IS RECORD (
成員名稱        數(shù)據(jù)類型 [[NOT NULL] [:= 默認(rèn)值] 表達(dá)式] ,
...
成員名稱        數(shù)據(jù)類型 [[NOT NULL] [:= 默認(rèn)值] 表達(dá)式]
) ;
1、使用記錄類型接收查詢返回結(jié)果
declare
   v_claimno              emb.claim.claimno%TYPE;
   TYPE claim_type IS RECORD(
      v_accidentno      emb.claim.acc_no%TYPE,
      v_totalamount     emb.claim.estimate_amount%TYPE,
      v_assigndate      emb.claim.assigndate%TYPE         
   );
   v_claim claim_type;
begin
    v_claimno:='541';
      select t.acc_no,t.estimate_amount,t.assigndate into v_claim from claim t where t.claimno=v_claimno;
      DBMS_OUTPUT.put_line('事故號:'||v_claim.v_accidentno||'   定損總金額:'||NVL(v_claim.v_totalamount,2)||'  任務(wù)分配時(shí)間:'||TO_CHAR(v_claim.v_assigndate,'yyyy-mm-dd'));
  EXCEPTION
     WHEN others THEN
        RAISE_APPLICATION_ERROR(-20007,'此定損單不存在!');
end;
/

輸出結(jié)果:
事故號:9040622410008F03AD
定損總金額:1862.46
任務(wù)分配時(shí)間:2020-03-30

2、自定義記錄類型數(shù)據(jù),聲明變量,并為屬性賦值.
declare
   TYPE claim_type IS RECORD(
      v_accidentno      emb.claim.acc_no%TYPE :='90406224',-- 定義默認(rèn)值
      v_version     emb.claim.version%TYPE,
      v_validflag      emb.claim.valid%TYPE 
   );
   v_claim claim_type;
begin
      v_claim.v_version:='E01';-- 為記錄類型成員賦值
      v_claim.v_validflag:='1';-- 為記錄類型成員賦值

      DBMS_OUTPUT.put_line('事故號:'||v_claim.v_accidentno||'   版本號:'||v_claim.v_version||'  有效標(biāo)識(shí):'||v_claim.v_validflag);
  EXCEPTION
     WHEN others THEN
        RAISE_APPLICATION_ERROR(-20007,'此定損單不存在!');
end;
/

輸出結(jié)果:事故號:90406224 版本號:E01 有效標(biāo)識(shí):1

3、定義嵌套的記錄類型
declare
   v_claimno              emb.claim.claimno%TYPE;
   TYPE claim_type IS RECORD(
      v_accidentno      emb.claim.acc_no%TYPE,
      v_totalamount     emb.claim.estimate_amount%TYPE,
      v_assigndate      emb.claim.assigndate%TYPE         
   );
   
   TYPE config_type is RECORD (
     v_paintflag             emb.config.paintconfig%TYPE:=0,
     v_repairflag            emb.config.repairconfig%TYPE :=1,
     v_discountflag      emb.config.discountflag%TYPE:=2,
     v_claim  claim_type
   );
   
   
    v_config_type  config_type ;
begin
    v_claimno:='541';
      select t.acc_no,t.estimate_amount,t.assigndate into v_config_type.v_claim from claim t where t.claimno=v_claimno;
      DBMS_OUTPUT.put_line('事故號:'||v_config_type.v_claim.v_accidentno||'   定損總金額:'||NVL(v_config_type.v_claim.v_totalamount,2)
      ||'  任務(wù)分配時(shí)間:'||TO_CHAR(v_config_type.v_claim.v_assigndate,'yyyy-mm-dd')||'  噴漆標(biāo)識(shí)'||v_config_type.v_paintflag||'  維修標(biāo)識(shí)'
      ||v_config_type.v_repairflag||'  折扣標(biāo)識(shí)'||v_config_type.v_discountflag);
  EXCEPTION
     WHEN others THEN
        RAISE_APPLICATION_ERROR(-20007,'此定損單不存在!');
end;
/

輸出結(jié)果:
事故號:9040622410008F03AD 定損總金額:1862.46 任務(wù)分配時(shí)間:2020-03-30 噴漆標(biāo)識(shí)0 維修標(biāo)識(shí)1 折扣標(biāo)識(shí)2

4、插入記錄,利用記錄類型保存數(shù)據(jù)
DECLARE
    TYPE config_type is RECORD (
     v_paintflag             emb.config.paintconfig%TYPE:=0,
     v_repairflag            emb.config.repairconfig%TYPE :=1,
     v_discountflag      emb.config.discountflag%TYPE:=2,
     v_claim  claim_type
   );
    v_config_type  config_type ;
BEGIN
  v_config_type.v_paintflag := 0 ;
  v_config_type.repairconfig := 1 ;
  v_config_type.discountflag := 2 ;
INSERT INTO config VALUES v_config_type ;     -- 直接插入記錄類型的數(shù)據(jù)
END ;
/
5、不需要插入全表數(shù)據(jù),插入指定欄位的數(shù)據(jù)
DECLARE
    TYPE config_type is RECORD (
     v_paintflag             emb.config.paintconfig%TYPE,
     v_repairflag            emb.config.repairconfig%TYPE,
     v_discountflag          emb.config.discountflag%TYPE,
     v_claim  claim_type
   );
    v_config_type  config_type ;
BEGIN
  v_config_type.v_paintflag := 0 ;
  v_config_type.repairconfig := 1 ;
  v_config_type.discountflag := 2 ;
INSERT INTO config(paintconfig,repairconfig,discountflag) VALUES (v_config_type.v_paintflag,v_config_type.v_repairflag,v_config_type.v_discountflag) ;     -- 直接插入記錄類型的數(shù)據(jù)
END ;
/
6、修改數(shù)據(jù),利用記錄類型保存數(shù)據(jù)
DECLARE
    v_claimno              emb.claim.claimno%TYPE:='541';
    TYPE config_type is RECORD (
     v_paintflag             emb.config.paintconfig%TYPE,
     v_repairflag            emb.config.repairconfig%TYPE,
     v_discountflag      emb.config.discountflag%TYPE,
     v_claim  claim_type
   );
    v_config_type  config_type ;
BEGIN
  v_config_type.v_paintflag := 1 ;
  v_config_type.repairconfig := 0 ;
  v_config_type.discountflag := 1 ;
UPDATE  config SET ROW=v_config_type WHERE  claimno=v_claimno;      
END ;
/
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容