oracle 儲存過程 變數的宣告和賦值的3種方式
阿新 • • 發佈:2021-10-22
oracle 儲存過程 變數的宣告和賦值的3種方式
Created by Marydon on 2018-08-31 19:05
1.宣告變數的3種方式
按照資料型別的宣告方式進行區分
方式一:直接宣告資料型別
格式:變數名 資料型別(大小)
1 2 |
V_START_DATE VARCHAR2(19);
v_num number;
|
說明:
設定為字串型別時,需要指定大小,否則報錯;
變數的宣告必須在"begin"關鍵字之前進行。
1 2 3 |
--錯誤用法
BEGIN
v_sql varchar2(100) := 'SELECT ORGSEQ FROM BASE_ORG_INFO where orgcode=to_char(410621101233)' ;
|
方式二:使用%TYPE宣告
格式:變數名 表名.欄位名%TYPE
含義:該變數的資料型別與指定表的指定欄位的資料型別一致
1 |
V_ORGSEQ BASE_ORG_INFO.ORGSEQ%TYPE;
|
方式三:使用%ROWTYPE宣告
格式:變數名 表名%ROWTYPE
含義:該變數的資料型別與指定表的指定行記錄(所有欄位)的資料型別一致
1 2 |
--VIRTUAL_CARD表整行資料
V_ROW_VIRTUAL_CARD VIRTUAL_CARD%ROWTYPE;
|
小結:
在儲存過程中,宣告變數時,不需要使用關鍵字"DECLARE";
變數不區分大小寫;
變數在使用前必須宣告。
2.變數賦值的3種方式
方式一:直接賦值,使用":="
使用條件:適用於宣告變數的前2種方式。
1 |
V_ORGID := '110' ;
|
說明:
變數後面跟不能直接是sql語句,sql不會執行,可以參考方式三。
1 2 3 4 |
--錯誤用法
V_ORGSEQ := SELECT ORGSEQ INTO V_ORGSEQ FROM BASE_ORG_INFO;
--正確用法
V_ORGSEQ := 'SELECT ORGSEQ INTO V_ORGSEQ FROM BASE_ORG_INFO' ;
|
變數的宣告和賦值可以一塊進行。
1 2 3 4 5 |
--正確用法
v_sql varchar2(100) := 'SELECT ORGSEQ FROM BASE_ORG_INFO where orgcode=to_char(410621101233)' ;
BEGIN
/* 具體業務 */
END ;
|
方式二:select 表字段 into 變數 from 表
變形一:查詢指定表的一個指定欄位
使用條件:適用於宣告變數的前2種方式可以使用
1 2 3 4 |
--根據醫療機構ID查詢對應的父機構的機構序列
SELECT ORGSEQ INTO V_ORGSEQ FROM BASE_ORG_INFO
WHERE ORGID =
( SELECT PARENTORGID FROM BASE_ORG_INFO WHERE ORGID = V_ORGID);
|
變形二:查詢指定表的所有欄位
使用條件:只適用於宣告變數的第3種方式
1 2 |
--將id=5120的VIRTUAL_CARD表資料賦值給變數V_ROW_VIRTUAL_CARD
SELECT * INTO V_ROW_VIRTUAL_CARD FROM VIRTUAL_CARD T where t.id = 5120;
|
說明:
查詢結果只能返回一條記錄;
查詢的表字段必須是該表的所有欄位。
錯誤舉例:
1 2 3 4 |
--錯誤舉例一:查詢的是所有表記錄
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 變數
1 2 3 4 5 6 7 8 9 10 |
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.變數的呼叫
一般來說,變數只有這3種使用場景:賦值、邏輯判斷、算術運算;
說明:不能用作查詢列
1 2 |
--錯誤呼叫
select V_ORGSEQ from dual;
|
使用%ROWTYPE宣告的變數如何呼叫?
利用"變數名.表字段"的方式可以取到該表中指定行(返回行)的指定列(任意列)所代表的資料。
1 2 3 4 |
--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);
|