ORACLE存儲過程中%TYPE和%ROWTYPE的區別


ORACLE存儲過程中%TYPE和%ROWTYPE的區別

在存儲過程中%TYPE和%ROWTYPE常用來在PL/SQL中定義變量

因為

t_emp emp%rowtype
;這個語句的意思是 定義一個變量t_emp使其與EMP表具有一樣的數據類型. 也就是說EMP表有哪里數據類型的字段,那么這個t_EMP變量也就能夠存儲什么類型的數據,而且大小范圍也是一樣的.(如VARCHAR2(20))

(一)使用%TYPE

PL/SQL中的變量用來存儲在數據庫表中的數據,所以變量和表中的列應該有相同的類型,例如按如下方式聲明一個變量:

DECLARE  v_code varchar2(20)

但是如果v_code這一列的定義發生了變化,例如長度發生了變化,那么導致所有使用該列的PL/SQL代碼全部都要修改

但是如果使用%TYPE屬性而不是將變量類型硬性編碼,代碼如下:

DECLARE  v_code oms_outbound.code%TYPE

通過使用%TYPE,變量v_code將和表oms_outbound的列code類型相同(可以理解為將二者綁定起來)

(二)使用%ROWTYPE

在PL/SQL中講一個記錄聲明為具有相同類型的數據庫行時,使用%ROWTYPE
代碼如下:

DECLARE  v_code oms_outbound%ROWTYPE

定義了一個記錄,該記錄中的字段與oms_outbound表中的列相對應

存儲過程代碼如下:

/** 重新同步簽收狀態*/
PROCEDURE SP_PUSH_SIGN_LOG IS
  v_order VARCHAR2(50);
  v_way_bill_code VARCHAR2(50);
  v_log VARCHAR2(2000);
  CURSOR c IS    /**聲明游標,表示多行記錄,每一行結構與查詢結果一致 */
  SELECT ts.order_no FROM tmp_sign_order ts;
  c_row c%ROWTYPE; /**使用rowtype */
  BEGIN
    FOR c_row IN c
      LOOP
        SELECT t.way_bill_code INTO v_way_bill_code FROM tms_order t WHERE t.code = c_row.order_no;
        v_log := '{"sign":0,"desc":"","msg":"","orderCode":"'||c_row.order_no||'","expressCode":"'||v_way_bill_code||'"}';
        INSERT INTO bis_sync_error_data_pool(id,req_buss_type,params,retry_times,creator_id,creator,created_time,last_operator_id,last_operator,last_operated_time,related_code)VALUES
        (seq_bis_sync_error_data_pool.nextval,'SYNC_ORDER_SIGNED',v_log,0,'1','zhoujie',SYSDATE,'1','zhoujie',SYSDATE,'zhoujie');
       END LOOP;
    --SELECT FROM tms_order t WHERE t.
 

    END SP_PUSH_SIGN_LOG;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM