一文詳解Oracle存儲(chǔ)過(guò)程
簡(jiǎn)介
Oracle 存儲(chǔ)過(guò)程是 Oracle 數(shù)據(jù)庫(kù)中的一種數(shù)據(jù)處理對(duì)象,它可以在數(shù)據(jù)庫(kù)中定義一組預(yù)定義的 SQL 語(yǔ)句,用于完成特定的數(shù)據(jù)庫(kù)操作。存儲(chǔ)過(guò)程可以被授權(quán)的用戶調(diào)用,并且可以執(zhí)行多個(gè)語(yǔ)句,這些語(yǔ)句可以被視為一個(gè)單獨(dú)的操作,也可以被視為一系列的操作。
使用存儲(chǔ)過(guò)程可以大大提高數(shù)據(jù)庫(kù)的性能和安全性。存儲(chǔ)過(guò)程可以減少網(wǎng)絡(luò)流量和請(qǐng)求,同時(shí)也可以減少與應(yīng)用程序之間的接口調(diào)用,從而提高了數(shù)據(jù)庫(kù)的性能和可靠性。
1、基本語(yǔ)法
1.1 新建測(cè)試窗口
- New Test Window
1.2 程序結(jié)構(gòu)
- 在Java編程中是區(qū)分大小寫(xiě),這里不用區(qū)分大小寫(xiě)。
- DECLARE部分聲明變量或游標(biāo)(結(jié)果集類(lèi)型變量),程序沒(méi)有變量聲明的可以省略或刪除。
- PLSQL可分為三個(gè)部分: 變量聲明部分,執(zhí)行部分,異常處理部分。
-- Created on 2023/5/10 by 肖 declare --聲明變量 游標(biāo) begin -- 執(zhí)行語(yǔ)句 -- 異常處理 end;
1.3打印輸出
- Dbms_Output 為oracle內(nèi)置程序包,類(lèi)似Java中的System.out,而put_line() 是調(diào)用的方法,相當(dāng)于println()方法。
- 需要注意的是: put_line('hello mr.xiao'); 中 一定是 ' ' 號(hào),否則會(huì)報(bào)錯(cuò)的。
begin --打印 hello mr.xiao Dbms_Output.put_line('hello mr.xiao'); end;
執(zhí)行結(jié)果
- 如果你不能打印輸出,需要開(kāi)啟 set serveroutput on 因?yàn)?nbsp;默認(rèn)情況下,輸出選項(xiàng)是關(guān)閉狀態(tài)。
1.4 變量
變量分兩大類(lèi)如:
- 普通數(shù)據(jù)類(lèi)型(char,varchar2, date, number, boolean, long)
- 特殊變量類(lèi)型(引用型變量、記錄型變量)
聲明變量的方式如:
- 變量名 變量類(lèi)型(變量長(zhǎng)度) 例如: v_name varchar2(30);
1.4.1 普通變量
變量賦值的方式有兩種如:
- 直接賦值語(yǔ)句 := 比如: v_name := '你才是臭弟弟'
- 語(yǔ)句賦值,使用select …into … 賦值:(語(yǔ)法 select 值 into 變量)
-- 打印個(gè)人信息,包括: 姓名、薪水、地址 DECLARE -- 姓名 V_NAME VARCHAR2(30) := '你才是臭弟弟'; -- 聲明變量直接賦值 --薪水 V_SAL NUMBER; --地址 V_ADDR VARCHAR2(200); BEGIN --在程序中直接賦值 V_SAL := 1800; --工資每月1800 每天笑哈哈 --語(yǔ)句賦值 SELECT 'CSDN你才是臭弟弟' INTO V_ADDR FROM DUAL; --不會(huì)有人不知道DUAL吧,DUAL 是一個(gè)用于描述 Oracle 數(shù)據(jù)庫(kù)中的虛擬表的關(guān)鍵字 --打印變量 注意 || 是拼接 DBMS_OUTPUT.PUT_LINE('姓名:' || V_NAME || ',薪水:' || V_SAL || ',地址:' ||V_ADDR); END;
執(zhí)行結(jié)果:
1.4.2 引用型變量
- 變量的類(lèi)型和長(zhǎng)度取決于表中字段的類(lèi)型和長(zhǎng)度
- 通過(guò) 表名.列名%TYPE 指定變量的類(lèi)型和長(zhǎng)度,例如: v_name emp.ename%TYPE
-- 查詢emp表中1001號(hào)員工的個(gè)人信息,打印姓名和薪水 DECLARE -- 姓名 V_NAME EMP.ENAME%TYPE; -- 聲明變量直接賦值 --薪水 V_SAL EMP.ESALARY%TYPE; BEGIN --查詢表中的姓名和薪水并賦值給變量 --注意查詢的字段和賦值的變量的順序、個(gè)數(shù)、類(lèi)型要一致 SELECT ENAME, ESALARY INTO V_NAME, V_SAL FROM EMP WHERE EMPLOYEEID = 1001; --打印變量 DBMS_OUTPUT.PUT_LINE('姓名:' || V_NAME || ',薪水:' || V_SAL); END;
執(zhí)行結(jié)果:
推薦大家使用引用型變量區(qū)別:
- 普通型變量: V_NAME VARCHAR2(30); 你怎么知道一定VARCHAR2類(lèi)型,你又怎么知道長(zhǎng)度一定是30呢,假設(shè)V_NAME VARCHAR2(1); 就對(duì)應(yīng)不上SELECT ENAME, ESALARY INTO V_NAME, V_SAL FROM EMP 這條語(yǔ)句中的 ENAME 的長(zhǎng)度了,也就接收不到值了,就會(huì)報(bào)錯(cuò)。如果要使用普通變量前提是 ,了解查詢表中對(duì)應(yīng)字段的 類(lèi)型 及 長(zhǎng)度, 才能基于他們來(lái)確定類(lèi)型長(zhǎng)度 這比較繁瑣。
- 引用型變量: 聲明一個(gè)變量 不再定義類(lèi)型長(zhǎng)度,而是基于接收表字段的類(lèi)型及長(zhǎng)度 來(lái)定義。如:V_NAME EMP.ENAME%TYPE;
總結(jié):
使用普通變量定義方式,需要知道表中列的類(lèi)型,而使用引用類(lèi)型,不需要考慮列的類(lèi)型,使用%TYPE是非常好的編程風(fēng)格,因?yàn)橐眯妥兞扛屿`活。
1.4.3 記錄型變量
- 記錄型變量 接受表中的一整行記錄,相當(dāng)于Java中的一個(gè)對(duì)象
- 語(yǔ)法: 變量名稱(chēng) 表名%ROWTYPE, 例如:v_emp emp%rowtype;
-- 查詢emp表中1001號(hào)員工的個(gè)人信息,打印姓名和薪水 DECLARE -- 記錄型變量接受一行 V_EMP EMP%ROWTYPE; BEGIN --記錄型變量默認(rèn)接受表中的一行數(shù)據(jù),不能指定字段。 SELECT * INTO V_EMP FROM EMP WHERE EMPLOYEEID = 1001; --打印變量,通過(guò)變量名.屬性的方式獲取變量中的值 DBMS_OUTPUT.PUT_LINE('姓名:' || V_EMP.ENAME || ',薪水:' || V_EMP.ESALARY); END;
總結(jié):
- 如果有一張表,有50個(gè)字段,那么你程序如果要使用這50字段話,如果你使用引用型變量一個(gè)個(gè)聲明,會(huì)特別繁瑣,記錄型變量可以方便的解決這個(gè)問(wèn)題。
注意錯(cuò)誤的使用案例如下:
- 記錄型變量只能存儲(chǔ)一個(gè)完整的行數(shù)據(jù)
我把 * 換成 單個(gè)字段執(zhí)行報(bào)錯(cuò),因?yàn)樯厦娴淖兞慷x的是一行,而現(xiàn)在只給一個(gè)是不行的。
- 返回的行太多了,記錄型變量也接收不了
現(xiàn)在這條sql 為什么報(bào)錯(cuò),因?yàn)楝F(xiàn)在是全表查詢 返回的行數(shù)超出了 一個(gè)變量只能接收一行,這就和JAVA 類(lèi)似了,應(yīng)該用集合去裝才可以 ,裝進(jìn)集合在取出來(lái) 是不是就跟JAVA 中循環(huán)取值差不多。
1.5 流程控制
1.5.1 條件分支
- IF條件判斷~語(yǔ)法
BEGIN IF 條件 THEN 執(zhí)行語(yǔ)句 END IF; END;
- IF...ELSE 條件判斷~語(yǔ)法
BEGIN IF 條件 THEN 執(zhí)行語(yǔ)句 ELSE 執(zhí)行語(yǔ)句 END IF; END;
- IF...ELSIF...ELSE條件判斷~語(yǔ)法,注意關(guān)鍵字:ELSIF。
BEGIN IF 條件1 THEN 執(zhí)行1 ELSIF 條件2 THEN 執(zhí)行2 ELSE 執(zhí)行3 END IF; END;
案例:
--判斷emp表中記錄是否超過(guò)20條,10-20之間,或者10條以下 DECLARE --聲明變量接受emp表中的記錄數(shù) V_COUNT NUMBER; BEGIN --查詢emp表中的記錄數(shù)賦值給變量 SELECT COUNT(1) INTO V_COUNT FROM EMP; --判斷打印 IF V_COUNT > 20 THEN DBMS_OUTPUT.PUT_LINE('EMP表中的記錄數(shù)超過(guò)了20條為:' || V_COUNT || '條。'); ELSIF V_COUNT >= 10 THEN DBMS_OUTPUT.PUT_LINE('EMP表中的記錄數(shù)在10~20條之間為:' || V_COUNT || '條。'); ELSE DBMS_OUTPUT.PUT_LINE('EMP表中的記錄數(shù)在10條以下為:' || V_COUNT || '條。'); END IF; END;
執(zhí)行結(jié)果:
1.5.2 循環(huán)
- Loop 語(yǔ)法
BEGIN LOOP EXIT WHEN 退出循環(huán)條件 END LOOP; END;
Loop語(yǔ)法 案例:
--循環(huán)打印 1-5 DECLARE --聲明循環(huán)變量并賦初值 V_NUM NUMBER := 1; BEGIN LOOP EXIT WHEN V_NUM > 5; DBMS_OUTPUT.PUT_LINE(V_NUM); --循環(huán)變量自增 V_NUM := V_NUM + 1; END LOOP; END;
- While 語(yǔ)法
while(判斷循環(huán)的條件) loop 循環(huán)的語(yǔ)句; END loop;
While語(yǔ)法 案例:
DECLARE --聲明循環(huán)變量 V_NUM NUMBER; BEGIN -- 必須給一個(gè)初始值 V_NUM := 1; WHILE(V_NUM < 10) LOOP DBMS_OUTPUT.put_line('值為: ' || V_NUM); V_NUM := V_NUM + 1; END LOOP; END; --此循環(huán)會(huì)先判斷再執(zhí)行語(yǔ)句
- FOR循環(huán) 語(yǔ)法
FOR 變量名 in 變量的初始值..結(jié)束值 lOOP 循環(huán)語(yǔ)句; END loop;
FOR循環(huán)語(yǔ)法 案例:
--for循環(huán)打印 1-10 DECLARE --聲明循環(huán)變量并賦初值 V_NUM NUMBER ; BEGIN --此語(yǔ)句會(huì)自動(dòng)將1到10賦值給V_NUM FOR V_NUM in 1..10 loop DBMS_OUTPUT.put_line('值為: ' || V_NUM); END LOOP; END;
2、游標(biāo)
2.1 游標(biāo)說(shuō)明
- 用于臨時(shí)存儲(chǔ)一個(gè)查詢返回的多行數(shù)據(jù),通過(guò)遍歷游標(biāo),可以逐行訪問(wèn)處理該結(jié)果集的數(shù)據(jù)。
- 游標(biāo)的使用方式:聲明→打開(kāi)→讀取→關(guān)閉 2.2 語(yǔ)法
游標(biāo)聲明:
CURSOR 游標(biāo)名[(參數(shù)列表)] IS 查詢語(yǔ)句;
游標(biāo)的打開(kāi):
OPEN 游標(biāo)名;
游標(biāo)的取值:
FETCH 游標(biāo)名 INTO 變量列表;
游標(biāo)的關(guān)閉:
CLOSE 游標(biāo)名;
注意: 游標(biāo)名自身是可以帶參數(shù)的,如果有參數(shù)、參數(shù)會(huì)帶入到查詢語(yǔ)句中進(jìn)行查詢,游標(biāo)本質(zhì) 就是 一個(gè) is 查詢語(yǔ)句,也就是說(shuō)查詢結(jié)果被放置到游標(biāo)中。
2.3 游標(biāo)屬性
游標(biāo)的屬性
屬性 | 說(shuō)明 |
%FOUND | 變量最后從游標(biāo)中獲取記錄的時(shí)候,在結(jié)果集中找到了記錄。 |
%NOTFOUND | 變量最后從游標(biāo)中獲取記錄的時(shí)候,在結(jié)果集中沒(méi)有找到記錄。 |
%ROWCOUNT | 當(dāng)前時(shí)刻已經(jīng)從游標(biāo)中獲取的記錄數(shù)量。 |
%ISOPEN | 是否打開(kāi)。 |
%ROW | 游標(biāo)指向的行數(shù)。 |
%COLUMN | 游標(biāo)指向的列數(shù)。 |
%ATTEMPTS | 嘗試獲取記錄的次數(shù)。 |
%ERROR | 發(fā)生錯(cuò)誤的次數(shù)。 |
%FETCH_STATUS FETCH | 語(yǔ)句的執(zhí)行狀態(tài),包括成功、失敗和出錯(cuò)標(biāo)志。 |
%SIZE | 當(dāng)前游標(biāo)指向的記錄大小。 |
%LINE_NUMBER | 當(dāng)前行號(hào)。 |
%ERROR_STRING | 錯(cuò)誤信息字符串。 |
%PROCID | 當(dāng)前執(zhí)行的SQL語(yǔ)句的ID |
2.4 無(wú)參數(shù)游標(biāo)
- 使用游標(biāo)查詢emp表中所有員工的姓名和工資,Loop循環(huán)依次打印結(jié)果集。
--使用游標(biāo)查詢emp表中所有員工的姓名和工資,依次打印結(jié)果集。 DECLARE --聲明游標(biāo) CURSOR C_EMP IS SELECT ENAME, ESALARY FROM EMP; --聲明變量用來(lái)接受游標(biāo)中的元素 V_ENAME EMP.ENAME%TYPE; V_SAL EMP.ESALARY%TYPE; BEGIN --打開(kāi)游標(biāo) OPEN C_EMP; --遍歷游標(biāo)中的值 LOOP --通過(guò)FETCH語(yǔ)句獲取游標(biāo)中的值并賦值給變量 FETCH C_EMP INTO V_ENAME, V_SAL; --通過(guò)%NOTFOUND判斷是否有值,有值打印,沒(méi)有則退出循環(huán) EXIT WHEN C_EMP%NOTFOUND; DBMS_OUTPUT.PUT_LINE('姓名:' || V_ENAME || ',薪水:' || V_SAL); END LOOP; --關(guān)閉游標(biāo) CLOSE C_EMP; END;
執(zhí)行結(jié)果:
2.5 帶參數(shù)的游標(biāo)
- 使用游標(biāo)查詢并打印某部門(mén)的員工的姓名和薪資,部門(mén)編號(hào)為運(yùn)行時(shí)手動(dòng)輸入。
--使用游標(biāo)查詢并打印某部門(mén)的員工的姓名和薪資,部門(mén)編號(hào)為運(yùn)行時(shí)手動(dòng)輸入。 DECLARE --聲明游標(biāo)傳遞參數(shù) CURSOR C_EMP(V_EMPLOID EMP.EMPLOYEEID%TYPE) IS SELECT ENAME, ESALARY FROM EMP WHERE EMPLOYEEID = V_EMPLOID; --聲明變量用來(lái)接受游標(biāo)中的元素 V_ENAME EMP.ENAME%TYPE; V_SAL EMP.ESALARY%TYPE; BEGIN --打開(kāi)游標(biāo)并傳遞參數(shù) OPEN C_EMP(1001); --遍歷游標(biāo)中的值 LOOP --通過(guò)FETCH語(yǔ)句獲取游標(biāo)中的值并賦值給變量 FETCH C_EMP INTO V_ENAME, V_SAL; --通過(guò)%NOTFOUND判斷是否有值,有值打印,沒(méi)有則退出循環(huán) EXIT WHEN C_EMP%NOTFOUND; DBMS_OUTPUT.PUT_LINE('姓名:' || V_ENAME || ',薪水:' || V_SAL); END LOOP; --關(guān)閉游標(biāo) CLOSE C_EMP; END;
執(zhí)行結(jié)果:
注意:%NOTFOUND屬性默認(rèn)值為FLASE,所以在循環(huán)中要注意判斷條件的位置.如果先判斷在FETCH會(huì)導(dǎo)致最后一條記錄的值被打印兩次(多循環(huán)一次默認(rèn));
錯(cuò)誤反例演示:
反例執(zhí)行結(jié)果:
原因: %NOTFOUND 默認(rèn)值是 false,false意味著游標(biāo)里面默認(rèn)是有值,到底有值還是沒(méi)值 需要fetch 好之后才知道有沒(méi)有值,%NOTFOUND 默認(rèn)做了一個(gè)有值的假設(shè) , 看下面代碼:
LOOP
--通過(guò)%NOTFOUND判斷是否有值,有值打印,沒(méi)有則退出循環(huán)
EXIT WHEN C_EMP%NOTFOUND;
--通過(guò)FETCH語(yǔ)句獲取游標(biāo)中的值并賦值給變量
FETCH C_EMP
INTO V_ENAME, V_SAL;
DBMS_OUTPUT.PUT_LINE('姓名:' || V_ENAME || ',薪水:' || V_SAL);
END LOOP;
EXIT WHEN C_EMP%NOTFOUND; 判斷有值打印,出去之后 又帶著有值的進(jìn)入到循環(huán)中 EXIT WHEN C_EMP%NOTFOUND; 判斷沒(méi)值打印, 所以這次打印的是上次值的。注意存放的位置。
3、存儲(chǔ)過(guò)程
3.1 概念
- 之前編寫(xiě)的PLSQL程序可以進(jìn)行表的操作、判斷、循環(huán)等邏輯處理的工作,但無(wú)法重復(fù)調(diào)用??梢岳斫鉃榇a編寫(xiě)在了JAVA的main方法中,JAVA可以通過(guò)封裝對(duì)象和方法來(lái)解決復(fù)用問(wèn)題
- PLSQL是將一個(gè)個(gè)PLSQL的業(yè)務(wù)處理過(guò)程存儲(chǔ)起來(lái)進(jìn)行復(fù)用,這些被存儲(chǔ)起來(lái)的PLSQL程序稱(chēng)之為存儲(chǔ)過(guò)程
3.2 語(yǔ)法
參數(shù)的類(lèi)型分為:
- 不帶參數(shù)的。
- 帶輸入?yún)?shù)的。
- 帶輸入輸出參數(shù)(返回值)的。
CREATE OR REPLACE PROCEDURE 過(guò)程名稱(chēng)[(參數(shù)列表)] IS BEGIN END 過(guò)程名稱(chēng);
3.3 無(wú)參存儲(chǔ)
3.3.1 創(chuàng)建存儲(chǔ)
- 第一種方式: New → Program Window → Procedure
- 第二種方式: New → SQL Window
- 創(chuàng)建存儲(chǔ)過(guò)程語(yǔ)法
--通過(guò)調(diào)用存儲(chǔ)過(guò)程打印hello 臭弟弟 CREATE OR REPLACE PROCEDURE P_XIAO IS --聲明變量 BEGIN DBMS_OUTPUT.PUT_LINE('hello 臭弟弟'); END P_XIAO ;
1、is和as都可以用。
2、存儲(chǔ)過(guò)程中沒(méi)有declare關(guān)鍵字,declare用在語(yǔ)句塊中。也就是說(shuō)匿名程序才需要, 存儲(chǔ)過(guò)程沒(méi)有可以直接帶上方--聲明變量。
- 注意點(diǎn)擊△執(zhí)行后 會(huì)進(jìn)行存儲(chǔ) ,Procedures 中會(huì)以P_XIAO 這個(gè)名稱(chēng)進(jìn)行存儲(chǔ)。
- 通過(guò)PLSQL工具查看創(chuàng)建好的存儲(chǔ)過(guò)程
3.3.2 調(diào)用存儲(chǔ)過(guò)程
- 通過(guò)PLSQL程序調(diào)用 New → Text Window
begin --輸入調(diào)用存儲(chǔ)過(guò)程的名稱(chēng) P_XIAO; end;
查看結(jié)果:
3.4 帶輸入?yún)?shù)的存儲(chǔ)過(guò)程 IN
說(shuō)明:
- 帶參數(shù)的存儲(chǔ)過(guò)程跟我們?cè)贘ava中的方法就可以對(duì)應(yīng)上,比如查詢并打印某個(gè)員工姓名薪水 ,在調(diào)用存儲(chǔ)過(guò)程的時(shí)候自己指定傳參, 比如我傳一個(gè)員工編號(hào),基于傳的編號(hào) 將結(jié)果返回。
- 實(shí)現(xiàn)查詢并打印某個(gè)員工(如:編號(hào)1001)的姓名和薪水, 調(diào)用存儲(chǔ)過(guò)程的時(shí)候傳入員工編號(hào),自動(dòng)控制臺(tái)打印。
3.4.1 創(chuàng)建帶參數(shù)存儲(chǔ)過(guò)程
- 第一種方式: 重新編輯存儲(chǔ)過(guò)程 右擊 → Edit(這是基于之前創(chuàng)建的,還可以進(jìn)行編輯)
- 需要注意的是如果有OR REPLACE當(dāng)存儲(chǔ)過(guò)程名字被更改時(shí),如果PLSQL中存在此存儲(chǔ)過(guò)程名稱(chēng)會(huì)被刪除替換創(chuàng)建當(dāng)前的,果不存在則創(chuàng)建一個(gè)新的存儲(chǔ)過(guò)程。
執(zhí)行結(jié)果:
- 如果沒(méi)有OR REPLACE語(yǔ)句 PLSQL也不存相同的名字在則會(huì)新創(chuàng)建。如果存在則會(huì)報(bào)錯(cuò)。
- 第二種方式: New → SQL Window
- 查詢并打印某個(gè)員工(如:編號(hào)1001)的姓名和薪水, 要調(diào)用存儲(chǔ)過(guò)程的時(shí)候傳入員工編號(hào),自動(dòng)控制臺(tái)打印。
- 注意:參數(shù)要與定義的參數(shù)的順序和類(lèi)型一致
--查詢并打印某個(gè)員工(如:編號(hào)1001)的姓名和薪水, 要調(diào)用存儲(chǔ)過(guò)程的時(shí)候傳入員工編號(hào),自動(dòng)控制臺(tái)打印。 CREATE OR REPLACE PROCEDURE P_xiao_jian(IN_EMPLOYEEID IN EMP.EMPLOYEEID%TYPE) as --聲明變量接受查詢結(jié)果 V_ENAME EMP.ENAME%TYPE; V_SAL EMP.ESALARY%TYPE; BEGIN --根據(jù)用戶傳遞的員工號(hào)查詢姓名和薪水 --注意:參數(shù)要與定義的參數(shù)的順序和類(lèi)型一致 如: ENAME INTO V_ENAME SELECT ENAME, ESALARY INTO V_ENAME, V_SAL FROM EMP WHERE EMPLOYEEID = IN_EMPLOYEEID; --打印結(jié)果 DBMS_OUTPUT.PUT_LINE('姓名:' || V_ENAME || ',薪水:' || V_SAL); END P_xiao_jian;
3.4.2 調(diào)用帶參數(shù)存儲(chǔ)過(guò)程
- New → Text window 直接賦值
-- Created on 2023/5/13 by 肖 declare -- Local variables here i integer; begin -- Test statements here P_XIAO_JIAN(1001);--直接賦值 做一個(gè)值的傳遞 end;
- 也可以 聲明變量 賦值
-- Created on 2023/5/13 by 肖 declare -- Local variables here V_PARAM number :=1001; --聲明變量 賦值 begin -- Test statements here P_XIAO_JIAN(V_PARAM); end;
查看執(zhí)行結(jié)果:
3.5 帶輸入輸出參數(shù)的存儲(chǔ)過(guò)程 OUT
說(shuō)明:
- 帶輸入輸出的這種存儲(chǔ)過(guò)程通常是給第三方程序調(diào)用的,就比如Java或其他編程語(yǔ)言,也就是說(shuō)把這個(gè)存儲(chǔ)過(guò)程的 計(jì)算結(jié)果進(jìn)行返回不是在數(shù)據(jù)庫(kù)打印打印就完事了
- 舉例說(shuō)明比如輸入員工編號(hào)查詢某個(gè)員工信息,要求將薪水作為返回值輸出,給調(diào)用的程序使用。這個(gè)調(diào)用的程序可以是PLSQ自身程序,也可以是第三方比如Java 程序。
3.5.1 創(chuàng)建帶輸入輸出參數(shù)的存儲(chǔ)過(guò)程
- 參數(shù)傳遞方式分三類(lèi): IN,OUT,IN OUT
- IN 表示輸入?yún)?shù)
- OUT 表示輸出參數(shù)
- IN OUT 即可作輸入?yún)?shù),也可作輸出參數(shù)。
--輸入員工號(hào)查詢某個(gè)員工(如:編號(hào)1001)信息,要求將薪水作為返回值輸出,給調(diào)用的程序使用。 CREATE OR REPLACE PROCEDURE P_XIAO_JIAN(IN_EMPLOYEEID IN EMP.EMPLOYEEID%TYPE,OUT_ESALARY OUT EMP.ESALARY%TYPE) as BEGIN --查詢 ESALARY into 給 OUT_ESALARY 輸出變量 SELECT ESALARY INTO OUT_ESALARY FROM EMP WHERE EMPLOYEEID = IN_EMPLOYEEID; END P_XIAO_JIAN;
3.5.2 調(diào)用帶輸入輸出參數(shù)存儲(chǔ)過(guò)程
DECLARE --聲明一個(gè)變量接受存儲(chǔ)過(guò)程的輸出參數(shù) V_ESALARY EMP.ESALARY%TYPE; BEGIN P_XIAO_JIAN(1001, V_ESALARY); --注意參數(shù)的順序 DBMS_OUTPUT.PUT_LINE('工資:'||V_ESALARY); END;
執(zhí)行結(jié)果:
3.6 帶輸入輸出參數(shù)的存儲(chǔ)過(guò)程 IN OUT
- IN OUT 即可作輸入?yún)?shù),也可作輸出參數(shù)。
3.6.1 創(chuàng)建帶輸入輸出參數(shù)的存儲(chǔ)過(guò)程
--輸入員工號(hào)查詢某個(gè)員工(如:編號(hào)1001)信息,要求將薪水作為返回值輸出,給調(diào)用的程序使用。 CREATE OR REPLACE PROCEDURE P_xiao_jian(IN_EMPLOYEEID IN EMP.EMPLOYEEID%TYPE,OUT_ESALARY OUT EMP.ESALARY%TYPE,IN_OUT_PARAM in out number) as BEGIN --查詢 ESALARY into 給 OUT_ESALARY 輸出變量 SELECT ESALARY INTO OUT_ESALARY FROM EMP WHERE EMPLOYEEID = IN_EMPLOYEEID; --打印被傳入的值 dbms_output.put_line('我是被傳入的值'||IN_OUT_PARAM); --IN_OUT_PARAM賦值默認(rèn)值為10 IN_OUT_PARAM:=10; END P_xiao_jian;
3.6.2 調(diào)用帶輸入輸出參數(shù)存儲(chǔ)過(guò)程
-- Created on 2023/5/16 by 肖 declare -- Local variables here V_ESALARY EMP.ESALARY%TYPE; V_IN_OUT_PARAM number:=6;--傳入的值 begin -- Test statements here P_xiao_jian(1001,V_ESALARY,V_IN_OUT_PARAM); DBMS_OUTPUT.PUT_LINE('薪水:'||V_ESALARY||'原始默認(rèn)值: '||V_IN_OUT_PARAM); end;
執(zhí)行結(jié)果:
以上就是一文詳解Oracle存儲(chǔ)過(guò)程的詳細(xì)內(nèi)容,更多關(guān)于Oracle存儲(chǔ)過(guò)程的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Oracle管道函數(shù)pipelined?function的用法小結(jié)
這篇文章主要介紹了Oracle管道函數(shù)pipelined?function的用法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07Oracle聯(lián)機(jī)日志文件與歸檔文件詳細(xì)介紹
這篇文章主要介紹了Oracle聯(lián)機(jī)日志文件與歸檔文件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-11-11在Mac OS上安裝Oracle數(shù)據(jù)庫(kù)的基本方法
這篇文章主要介紹了在Mac OS上安裝Oracle數(shù)據(jù)庫(kù)的基本方法,Oracle是甲骨文公司的一款收費(fèi)數(shù)據(jù)庫(kù)軟件,需要的朋友可以參考下2015-12-12Oracle通過(guò)遞歸查詢父子兄弟節(jié)點(diǎn)方法示例
這篇文章主要給大家介紹了關(guān)于Oracle如何通過(guò)遞歸查詢父子兄弟節(jié)點(diǎn)的相關(guān)資料,遞歸查詢對(duì)各位程序員來(lái)說(shuō)應(yīng)該都不陌生,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01Oracle解鎖表、包、用戶、殺會(huì)話、停job的方法實(shí)現(xiàn)
本文主要介紹了Oracle解鎖表、包、用戶、殺會(huì)話、停job的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-12-12Oracle跨庫(kù)訪問(wèn)DBLINK使用以及實(shí)際應(yīng)用
這篇文章主要給大家介紹了關(guān)于Oracle跨庫(kù)訪問(wèn)DBLINK使用以及實(shí)際應(yīng)用的相關(guān)資料,DBLink的作用是在局域網(wǎng)內(nèi),通過(guò)一臺(tái)服務(wù)器上面的數(shù)據(jù)庫(kù)訪問(wèn)另外一臺(tái)服務(wù)器上面數(shù)據(jù)庫(kù)的功能,需要的朋友可以參考下2024-01-01oracle復(fù)制表結(jié)構(gòu)和復(fù)制表數(shù)據(jù)語(yǔ)句分享
這篇文章主要介紹了oracle復(fù)制表結(jié)構(gòu)和復(fù)制表數(shù)據(jù)的語(yǔ)句,大家直接使用就可以了2014-03-03ORACLE?ORA-01653:?unable?to?extend?table?的錯(cuò)誤處理方案(oracl
這篇文章主要介紹了ORACLE?ORA-01653:?unable?to?extend?table?的錯(cuò)誤處理方案,本文通過(guò)具體步驟給大家分享解決方案,需要的朋友可以參考下2022-08-08