Oracle?存儲過程詳細介紹使用實踐
Oracle 存儲過程詳解
存儲過程實踐
1:無入?yún)⒊鰠⒋鎯^程
CREATE OR REPLACE PROCEDURE your_stored_procedure
AS
BEGIN
-- 在這里編寫存儲過程的邏輯
-- 示例:輸出一條消息
DBMS_OUTPUT.PUT_LINE('Hello, this is your stored procedure.');
-- 示例:查詢數(shù)據(jù)并處理
FOR rec IN (SELECT * FROM your_table) LOOP
-- 處理每一行數(shù)據(jù)
-- 可以使用 rec.column_name 來訪問具體字段的值
-- 示例:輸出每一行的 ID 和 Name 字段值
DBMS_OUTPUT.PUT_LINE('ID: ' || rec.id || ', Name: ' || rec.name);
END LOOP;
END;
/在上述示例中,存儲過程 your_stored_procedure 沒有輸入?yún)?shù),也沒有輸出參數(shù)。您可以在存儲過程的邏輯部分編寫您需要的操作,例如查詢數(shù)據(jù)并進行處理,輸出消息等。
請根據(jù)您的實際需求修改示例代碼,并將適當?shù)倪壿嫹旁诖鎯^程中。執(zhí)行該存儲過程時,可以使用 EXEC your_stored_procedure; 或者 CALL your_stored_procedure; 來調(diào)用它。在執(zhí)行過程中,存儲過程中的邏輯將被執(zhí)行,并將結(jié)果輸出到 DBMS_OUTPUT,您可以通過適當?shù)姆绞讲榭摧敵鼋Y(jié)果。
2:有入?yún)o出參存儲過程
CREATE OR REPLACE PROCEDURE your_stored_procedure(p_input_param IN VARCHAR2)
AS
BEGIN
-- 在這里編寫存儲過程的邏輯,使用輸入?yún)?shù) p_input_param
-- 示例:輸出接收到的輸入?yún)?shù)
DBMS_OUTPUT.PUT_LINE('Received input parameter: ' || p_input_param);
-- 示例:根據(jù)輸入?yún)?shù)查詢數(shù)據(jù)并處理
FOR rec IN (SELECT * FROM your_table WHERE column_name = p_input_param) LOOP
-- 處理每一行數(shù)據(jù)
-- 可以使用 rec.column_name 來訪問具體字段的值
-- 示例:輸出每一行的 ID 和 Name 字段值
DBMS_OUTPUT.PUT_LINE('ID: ' || rec.id || ', Name: ' || rec.name);
END LOOP;
END;
/在上述示例中,存儲過程 your_stored_procedure 接受一個輸入?yún)?shù) p_input_param,您可以在存儲過程的邏輯部分使用這個參數(shù)進行操作,例如根據(jù)參數(shù)查詢數(shù)據(jù)并進行處理。
請根據(jù)您的實際需求修改示例代碼,并將適當?shù)倪壿嫹旁诖鎯^程中。執(zhí)行該存儲過程時,可以使用 EXEC your_stored_procedure(‘your_input_value’); 或者 CALL your_stored_procedure(‘your_input_value’); 來調(diào)用它。在執(zhí)行過程中,存儲過程中的邏輯將被執(zhí)行,并將結(jié)果輸出到 DBMS_OUTPUT,您可以通過適當?shù)姆绞讲榭摧敵鼋Y(jié)果。
3:有入?yún)⒑统鰠⒋鎯^程
CREATE OR REPLACE PROCEDURE your_stored_procedure(p_input_param IN VARCHAR2, p_output_param OUT NUMBER) AS BEGIN -- 在這里編寫存儲過程的邏輯,使用輸入?yún)?shù) p_input_param -- 示例:根據(jù)輸入?yún)?shù)查詢數(shù)據(jù)并處理 SELECT COUNT(*) INTO p_output_param FROM your_table WHERE column_name = p_input_param; END; /
在上述示例中,存儲過程 your_stored_procedure 接受一個輸入?yún)?shù) p_input_param 和一個輸出參數(shù) p_output_param。您可以在存儲過程的邏輯部分使用輸入?yún)?shù)進行操作,并將結(jié)果存儲到輸出參數(shù)中。
請根據(jù)您的實際需求修改示例代碼,并將適當?shù)倪壿嫹旁诖鎯^程中。執(zhí)行該存儲過程時,可以使用以下代碼調(diào)用它:
DECLARE
v_output_param NUMBER;
BEGIN
your_stored_procedure('your_input_value', v_output_param);
-- 在這里可以使用 v_output_param 的值進行進一步的處理
DBMS_OUTPUT.PUT_LINE('Output parameter: ' || v_output_param);
END;
/在執(zhí)行過程中,存儲過程中的邏輯將被執(zhí)行,并將結(jié)果存儲到輸出參數(shù) p_output_param 中。在示例中,輸出參數(shù)的值被存儲到 v_output_param 變量中,您可以根據(jù)需要進行進一步的處理。
4:存儲過程中更新表數(shù)據(jù)
CREATE OR REPLACE PROCEDURE your_stored_procedure(p_input_param IN VARCHAR2) AS BEGIN -- 在這里編寫存儲過程的邏輯,使用輸入?yún)?shù) p_input_param -- 示例:更新表中的數(shù)據(jù) UPDATE your_table SET column_name = p_input_param WHERE <條件>; -- 示例:提交事務 COMMIT; END; /
在上述示例中,存儲過程 your_stored_procedure 接受一個輸入?yún)?shù) p_input_param,您可以在存儲過程的邏輯部分使用該參數(shù)進行更新表數(shù)據(jù)的操作。根據(jù)實際情況,您可以修改 UPDATE 語句中的表名、字段名和更新條件。
請根據(jù)您的實際需求修改示例代碼,并將適當?shù)倪壿嫹旁诖鎯^程中。執(zhí)行該存儲過程時,可以使用以下代碼調(diào)用它:
BEGIN
your_stored_procedure('your_input_value');
-- 執(zhí)行其他操作
END;
/在執(zhí)行過程中,存儲過程中的邏輯將被執(zhí)行,并根據(jù)傳入的輸入?yún)?shù)更新表中的數(shù)據(jù)。示例中的 COMMIT 語句用于提交事務,您可以根據(jù)需要添加或刪除該語句。
5:存儲過程中刪除某些數(shù)據(jù)
CREATE OR REPLACE PROCEDURE your_stored_procedure(p_input_param IN VARCHAR2) AS BEGIN -- 在這里編寫存儲過程的邏輯,使用輸入?yún)?shù) p_input_param -- 示例:刪除表中的數(shù)據(jù) DELETE FROM your_table WHERE column_name = p_input_param; -- 示例:提交事務 COMMIT; END; /
在上述示例中,存儲過程 your_stored_procedure 接受一個輸入?yún)?shù) p_input_param,您可以在存儲過程的邏輯部分使用該參數(shù)進行刪除表數(shù)據(jù)的操作。根據(jù)實際情況,您可以修改 DELETE 語句中的表名、字段名和刪除條件。
BEGIN
your_stored_procedure('your_input_value');
-- 執(zhí)行其他操作
END;
/6:存儲過程中執(zhí)行新增操作
CREATE OR REPLACE PROCEDURE your_stored_procedure(p_input_param1 IN VARCHAR2, p_input_param2 IN NUMBER) AS BEGIN -- 在這里編寫存儲過程的邏輯,使用輸入?yún)?shù) p_input_param1 和 p_input_param2 -- 示例:插入數(shù)據(jù)到表中 INSERT INTO your_table (column1, column2) VALUES (p_input_param1, p_input_param2); -- 示例:提交事務 COMMIT; END; /
在上述示例中,存儲過程 your_stored_procedure 接受兩個輸入?yún)?shù) p_input_param1 和 p_input_param2,您可以在存儲過程的邏輯部分使用這些參數(shù)進行插入數(shù)據(jù)到表的操作。根據(jù)實際情況,您可以修改 INSERT INTO 語句中的表名和列名,并根據(jù)參數(shù)進行值的插入
BEGIN
your_stored_procedure('value1', 123);
-- 執(zhí)行其他操作
END;
/在執(zhí)行過程中,存儲過程中的邏輯將被執(zhí)行,并根據(jù)傳入的輸入?yún)?shù)將數(shù)據(jù)插入到表中。示例中的 COMMIT 語句用于提交事務,您可以根據(jù)需要添加或刪除該語句。
7:存儲過程查詢姓名
CREATE OR REPLACE PROCEDURE your_stored_procedure(p_input_param IN VARCHAR2)
AS
v_data your_table%ROWTYPE;
BEGIN
-- 在這里編寫存儲過程的邏輯,使用輸入?yún)?shù) p_input_param
-- 示例:查詢表中的數(shù)據(jù)
SELECT *
INTO v_data
FROM your_table
WHERE column_name = p_input_param;
-- 示例:在輸出結(jié)果中展示查詢到的數(shù)據(jù)
DBMS_OUTPUT.PUT_LINE('Column1: ' || v_data.column1);
DBMS_OUTPUT.PUT_LINE('Column2: ' || v_data.column2);
-- 添加其他列的輸出
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('No data found for the input parameter.');
END;
/在上述示例中,存儲過程 your_stored_procedure 接受一個輸入?yún)?shù) p_input_param,并使用該參數(shù)查詢表中的數(shù)據(jù)。查詢結(jié)果存儲在變量 v_data 中,您可以根據(jù)表的結(jié)構(gòu)修改變量的類型和名稱。然后,您可以根據(jù)需要使用 DBMS_OUTPUT.PUT_LINE 將查詢結(jié)果輸出。
BEGIN
your_stored_procedure('your_input_value');
-- 執(zhí)行其他操作
END;
/在執(zhí)行過程中,存儲過程中的邏輯將被執(zhí)行,并根據(jù)傳入的輸入?yún)?shù)查詢表中的數(shù)據(jù)。如果找到匹配的數(shù)據(jù),則會將查詢結(jié)果打印出來。如果未找到匹配的數(shù)據(jù),則會輸出相應的消息。
8:存儲過程查詢符合條件的數(shù)據(jù)集
CREATE OR REPLACE PROCEDURE your_stored_procedure(p_input_param IN VARCHAR2)
AS
CURSOR cur_data IS
SELECT *
FROM your_table
WHERE column_name = p_input_param;
v_data your_table%ROWTYPE;
BEGIN
-- 在這里編寫存儲過程的邏輯,使用輸入?yún)?shù) p_input_param
-- 示例:循環(huán)遍歷查詢結(jié)果集
FOR rec_data IN cur_data LOOP
-- 存儲每一行的數(shù)據(jù)到變量 v_data
v_data := rec_data;
-- 示例:在輸出結(jié)果中展示每一行的數(shù)據(jù)
DBMS_OUTPUT.PUT_LINE('Column1: ' || v_data.column1);
DBMS_OUTPUT.PUT_LINE('Column2: ' || v_data.column2);
-- 添加其他列的輸出
END LOOP;
-- 示例:如果沒有查詢到數(shù)據(jù),則輸出相應的消息
IF cur_data%NOTFOUND THEN
DBMS_OUTPUT.PUT_LINE('No data found for the input parameter.');
END IF;
END;
/在上述示例中,存儲過程 your_stored_procedure 接受一個輸入?yún)?shù) p_input_param,并使用該參數(shù)查詢符合條件的數(shù)據(jù)集。查詢結(jié)果使用游標 cur_data 來獲取,然后通過循環(huán)遍歷每一行數(shù)據(jù)并存儲在變量 v_data 中,最后根據(jù)需要使用 DBMS_OUTPUT.PUT_LINE 將查詢結(jié)果輸出。
BEGIN
your_stored_procedure('your_input_value');
-- 執(zhí)行其他操作
END;
/在執(zhí)行過程中,存儲過程中的邏輯將被執(zhí)行,并根據(jù)傳入的輸入?yún)?shù)查詢符合條件的數(shù)據(jù)集。如果找到匹配的數(shù)據(jù),則會將每一行的查詢結(jié)果打印出來。如果未找到匹配的數(shù)據(jù),則會輸出相應的消息。
9:存儲過程查詢符合條件的數(shù)據(jù)集并返回
下面是一個示例的 PL/SQL 存儲過程,它接受一個輸入?yún)?shù),并使用該參數(shù)查詢符合條件的數(shù)據(jù)集,并將結(jié)果作為游標返回:
CREATE OR REPLACE PROCEDURE your_stored_procedure(p_input_param IN VARCHAR2, p_result OUT SYS_REFCURSOR)
AS
BEGIN
-- 在這里編寫存儲過程的邏輯,使用輸入?yún)?shù) p_input_param
-- 示例:查詢符合條件的數(shù)據(jù)集并將結(jié)果存儲在游標 p_result 中
OPEN p_result FOR
SELECT *
FROM your_table
WHERE column_name = p_input_param;
END;
/在上述示例中,存儲過程 your_stored_procedure 接受一個輸入?yún)?shù) p_input_param,并使用該參數(shù)查詢符合條件的數(shù)據(jù)集。查詢結(jié)果將存儲在游標 p_result 中,并作為輸出參數(shù)返回。
DECLARE
v_cursor SYS_REFCURSOR;
BEGIN
your_stored_procedure('your_input_value', v_cursor);
-- 執(zhí)行其他操作,如處理返回的游標數(shù)據(jù)集
END;
/在執(zhí)行過程中,存儲過程中的邏輯將被執(zhí)行,并根據(jù)傳入的輸入?yún)?shù)查詢符合條件的數(shù)據(jù)集。查詢結(jié)果將存儲在游標 v_cursor 中,您可以根據(jù)需要在存儲過程外部處理返回的游標數(shù)據(jù)集
10:復雜一點的存儲過程,傳入就診id和檔案id 查詢數(shù)據(jù)集
CREATE OR REPLACE PROCEDURE SP_MZ_GET_JZFYMX(P_JIUZHENID VARCHAR2,--入?yún)⒕驮\id
P_ID VARCHAR2,--入?yún)n案id
P_ERRMSG OUT VARCHAR2,--出參提示信息
p_cursor OUT SYS_REFCURSOR--出參,游標
) IS
--涉及到動態(tài)表名,所以表名需要拼接
PRI_KH VARCHAR2(3000); --
PRI_SSTSQL VARCHAR2(3000); --sql
PRI_NIAN1 INT;--年份1
PRI_NIAN2 INT;--年份2
PRI_NUM INT :=0;--次數(shù)
BEGIN
--參數(shù)判斷
IF TRIM(P_ID) IS NULL THEN
P_ERRMSG :='檔案ID不能為空!';
return;
END IF;
IF TRIM(P_JIUZHENID) IS NULL THEN
P_ERRMSG :='就診ID不能為空!';
return;
END IF;
--判斷是否建檔
SELECT COUNT(T_DANGANID) INTO PRI_KH FROM T_DANGAN WHERE T_DANGANID = P_ID;
IF TRIM(PRI_KH) = '0' THEN
P_ERRMSG := '傳入的檔案ID對應的檔案不存在!';
return;
END IF;
PRI_NIAN2 := TRUNC(TO_NUMBER(EXTRACT(YEAR FROM SYSDATE)));--把當前年份存入數(shù)據(jù)中
PRI_NIAN1 := PRI_NIAN2 - 2;--把前兩年年份存儲數(shù)據(jù)中
IF PRI_NIAN1 <= PRI_NIAN2 THEN
-- 從起始數(shù)字開始遞增循環(huán)輸出
FOR i IN PRI_NIAN1..PRI_NIAN2 LOOP
-- 在這里對每個整數(shù)進行操作或展示
if PRI_NUM > 0 then --第二次拼接sql需要 union all
PRI_SSTSQL := PRI_SSTSQL || ' union all ' || 'select decode(b.mingcheng,'''',c.mingcheng,b.mingcheng) xmmc,a.guige xmgg,a.danwei xmdw,a.danjia xmdj,a.shuliang xmsl,a.danjia fyje,a.jiesuanshijian fyrq
from T_shouju' || i || ' d, T_feiyong' || i || ' a,T_biaozhun b,T_yaopin c where d.jiesuanshijian = a.jiesuanshijian and d.T_danganid = a.T_danganid and
a.jisuanjibianma = b.jisuanjibianma(+) and a.jisuanjibianma = c.jisuanjibianma(+) and d.T_shoujuid = ' || '''' || P_JIUZHENID || '''' || ' and d.T_danganid = ' || '''' || P_ID || '''' || ' ';
else --第一次拼接sql 不需要拼接union all
PRI_SSTSQL := 'select decode(b.mingcheng,'''',c.mingcheng,b.mingcheng) xmmc,a.guige xmgg,a.danwei xmdw,a.danjia xmdj,a.shuliang xmsl,a.danjia fyje,a.jiesuanshijian fyrq
from T_shouju' || i || ' d, T_feiyong' || i || ' a,T_feiyongbiaozhun b,T_yaopin c where d.jiesuanshijian = a.jiesuanshijian and d.T_danganid = a.T_danganid and
a.jisuanjibianma = b.jisuanjibianma(+) and a.jisuanjibianma = c.jisuanjibianma(+) and d.T_shoujuid = ' || '''' || P_JIUZHENID || '''' || ' and d.T_danganid = ' || '''' || P_ID || '''' || ' ';
end if;--結(jié)束if判斷
PRI_NUM := PRI_NUM + 1;--每次循環(huán)次數(shù)+1
END LOOP;--結(jié)束循環(huán)
end if;--結(jié)束if判斷
//拼接不需要 動態(tài)表名的查詢語句
PRI_SSTSQL := PRI_SSTSQL || ' union all ' || 'select decode(b.mingcheng,'''',c.mingcheng,b.mingcheng) xmmc,a.guige xmgg,a.danwei xmdw,a.danjia xmdj,a.shuliang xmsl,a.danjia fyje,a.shoufeishijian fyrq
from T_feiyong a,T_feiyongbiaozhun b,T_yaopin c where a.jisuanjibianma = b.jisuanjibianma(+) and a.jisuanjibianma = c.jisuanjibianma(+) and a.rizhiid = ' || '''' || P_JIUZHENID || '''' || ' and a.T_danganid = ' || '''' || P_ID || '''' || ' ';
--P_ERRMSG := PRI_SSTSQL;
OPEN p_cursor FOR PRI_SSTSQL ;--打開游標并賦值
EXCEPTION WHEN OTHERS THEN
--回滾SQL
-- ROLLBACK;
P_ERRMSG := '執(zhí)行錯誤!' || CHR(13) || '錯誤代碼:' || SQLCODE || CHR(13) || '錯誤信息:' || SQLERRM;
END SP_MZ_GET_JZFYMX;如何調(diào)整存儲過程看下邊
DECLARE
-- 聲明游標變量
P_JIUZHENID VARCHAR2(1000) := '86d26a1a-a448-464c-95dd-acc85ec6906e';
P_ID VARCHAR2(1000) := 'da7dbe52-793a-4120-beb3-c2075cc74a53';
P_ERRMSG VARCHAR2(2000);
your_cursor SYS_REFCURSOR;
-- 聲明結(jié)果變量
your_variable1 VARCHAR2(50);
your_variable2 VARCHAR2(50);
your_variable3 VARCHAR2(50);
your_variable4 VARCHAR2(50);
your_variable5 VARCHAR2(50);
your_variable6 VARCHAR2(50);
your_variable7 VARCHAR2(50);
BEGIN
-- 調(diào)用存儲過程并傳入游標參數(shù)
SP_MZ_GET_JZFYMX(P_JIUZHENID,P_ID,P_ERRMSG,your_cursor);
-- 循環(huán)獲取游標結(jié)果并展示
LOOP
FETCH your_cursor INTO your_variable1, your_variable2, your_variable3,your_variable4,your_variable5,your_variable6,your_variable7;
EXIT WHEN your_cursor%NOTFOUND;
-- 在這里對每行數(shù)據(jù)進行展示或其他操作
DBMS_OUTPUT.PUT_LINE(your_variable1 || ', ' || your_variable2 || ', ' || your_variable3|| ', ' || your_variable4|| ', ' || your_variable5|| ', ' || your_variable6|| ', ' || your_variable7);
END LOOP;
-- 關(guān)閉游標
CLOSE your_cursor;
END;
/到此這篇關(guān)于Oracle 存儲過程詳細介紹及如何使用的文章就介紹到這了,更多相關(guān)Oracle 存儲過程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用sqlplus命令行工具為oracle創(chuàng)建用戶和表空間
這篇文章主要介紹了使用sqlplus為oracle創(chuàng)建用戶和表空間的方法,本文介紹的是使用Oracle 9i所帶的命令行工具:SQLPLUS,需要的朋友可以參考下2017-11-11
淺析常用數(shù)據(jù)庫的自增字段創(chuàng)建方法匯總
本篇文章是對常用數(shù)據(jù)庫的自增字段創(chuàng)建方法進行了全面的匯總介紹,需要的朋友參考下2013-07-07
Oracle和MySQL的數(shù)據(jù)導入為何差別這么大
這篇文章主要介紹了Oracle和MySQL的數(shù)據(jù)導入有哪些區(qū)別,幫助大家更好的理解和學習,感興趣的朋友可以了解下2020-08-08
oracle數(shù)據(jù)匹配merge into的實例詳解
這篇文章主要介紹了oracle數(shù)據(jù)匹配merge into的實例詳解的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-10-10

