按照數據類型的聲明方式進行區分html
方式一:直接聲明數據類型sql
格式:變量名 數據類型(大小)oracle
V_START_DATE VARCHAR2(19); v_num number;
說明:spa
設置爲字符串類型時,須要指定大小,不然報錯;code
變量的聲明必須在"begin"關鍵字以前進行。htm
--錯誤用法 BEGIN v_sql varchar2(100) := 'SELECT ORGSEQ FROM BASE_ORG_INFO where orgcode=to_char(410621101233)';
方式二:使用%TYPE聲明blog
格式:變量名 表名.字段名%TYPE字符串
含義:該變量的數據類型與指定表的指定字段的數據類型一致get
V_ORGSEQ BASE_ORG_INFO.ORGSEQ%TYPE;
方式三:使用%ROWTYPE聲明class
格式:變量名 表名%ROWTYPE
含義:該變量的數據類型與指定表的指定行記錄(全部字段)的數據類型一致
--VIRTUAL_CARD表整行數據 V_ROW_VIRTUAL_CARD VIRTUAL_CARD%ROWTYPE;
小結:
在存儲過程當中,聲明變量時,不須要使用關鍵字"DECLARE";
變量不區分大小寫;
變量在使用前必須聲明。
方式一:直接賦值,使用":="
使用條件:適用於聲明變量的前2種方式。
V_ORGID := '110';
說明:
變量後面跟不能直接是sql語句,sql不會執行,能夠參考方式三。
--錯誤用法 V_ORGSEQ := SELECT ORGSEQ INTO V_ORGSEQ FROM BASE_ORG_INFO; --正確用法 V_ORGSEQ := 'SELECT ORGSEQ INTO V_ORGSEQ FROM BASE_ORG_INFO';
變量的聲明和賦值能夠一塊進行。
--正確用法 v_sql varchar2(100) := 'SELECT ORGSEQ FROM BASE_ORG_INFO where orgcode=to_char(410621101233)'; BEGIN /* 具體業務 */ END;
方式二:select 表字段 into 變量 from 表
變形一:查詢指定表的一個指定字段
使用條件:適用於聲明變量的前2種方式能夠使用
--根據醫療機構ID查詢對應的父機構的機構序列 SELECT ORGSEQ INTO V_ORGSEQ FROM BASE_ORG_INFO WHERE ORGID = (SELECT PARENTORGID FROM BASE_ORG_INFO WHERE ORGID = V_ORGID);
變形二:查詢指定表的全部字段
使用條件:只適用於聲明變量的第3種方式
--將id=5120的VIRTUAL_CARD表數據賦值給變量V_ROW_VIRTUAL_CARD SELECT * INTO V_ROW_VIRTUAL_CARD FROM VIRTUAL_CARD T where t.id = 5120;
說明:
查詢結果只能返回一條記錄;
查詢的表字段必須是該表的全部字段。
錯誤舉例:
--錯誤舉例一:查詢的是全部表記錄 SELECT * INTO V_ROW_VIRTUAL_CARD FROM VIRTUAL_CARD T; --錯誤舉例二:查詢的是該表的多個字段 SELECT t.id,t.name INTO V_ROW_VIRTUAL_CARD FROM VIRTUAL_CARD T;
方式三:execute immediate sql語句字符串 into 變量
declare/* 存儲過程,不須要聲明 */ v_sql varchar2(100); V_ORGSEQ varchar2(100); begin v_sql := 'SELECT ORGSEQ FROM BASE_ORG_INFO where orgcode=to_char(410621101233)'; --V_ORGSEQ賦值 execute immediate v_sql INTO V_ORGSEQ; --打印結果 DBMS_OUTPUT.put_line(V_ORGSEQ); END;
通常來講,變量只有這3種使用場景:賦值、邏輯判斷、算術運算;
說明:不能用做查詢列
--錯誤調用 select V_ORGSEQ from dual;
使用%ROWTYPE聲明的變量如何調用?
利用"變量名.表字段"的方式能夠取到該表中指定行(返回行)的指定列(任意列)所表明的數據。
--V_ROW_VIRTUAL_CARD賦值 SELECT * INTO V_ROW_VIRTUAL_CARD FROM VIRTUAL_CARD T where t.id = 5120; --調用 DBMS_OUTPUT.put_line(V_ROW_VIRTUAL_CARD.ID);