您的位置:首頁技術文章
文章詳情頁

Oracle?存儲過程詳細介紹使用實踐

瀏覽:2日期:2023-09-15 20:49:58
目錄Oracle 存儲過程詳解存儲過程實踐1:無入參出參存儲過程2:有入參無出參存儲過程3:有入參和出參存儲過程4:存儲過程中更新表數據5:存儲過程中刪除某些數據6:存儲過程中執行新增操作7:存儲過程查詢姓名8:存儲過程查詢符合條件的數據集9:存儲過程查詢符合條件的數據集并返回10:復雜一點的存儲過程,傳入就診id和檔案id 查詢數據集Oracle 存儲過程詳解存儲過程實踐1:無入參出參存儲過程CREATE OR REPLACE PROCEDURE your_stored_procedureASBEGIN -- 在這里編寫存儲過程的邏輯 -- 示例:輸出一條消息 DBMS_OUTPUT.PUT_LINE('Hello, this is your stored procedure.'); -- 示例:查詢數據并處理 FOR rec IN (SELECT * FROM your_table) LOOP -- 處理每一行數據 -- 可以使用 rec.column_name 來訪問具體字段的值 -- 示例:輸出每一行的 ID 和 Name 字段值 DBMS_OUTPUT.PUT_LINE('ID: ' || rec.id || ', Name: ' || rec.name); END LOOP;END;/

在上述示例中,存儲過程 your_stored_procedure 沒有輸入參數,也沒有輸出參數。您可以在存儲過程的邏輯部分編寫您需要的操作,例如查詢數據并進行處理,輸出消息等。

請根據您的實際需求修改示例代碼,并將適當的邏輯放在存儲過程中。執行該存儲過程時,可以使用 EXEC your_stored_procedure; 或者 CALL your_stored_procedure; 來調用它。在執行過程中,存儲過程中的邏輯將被執行,并將結果輸出到 DBMS_OUTPUT,您可以通過適當的方式查看輸出結果。

2:有入參無出參存儲過程CREATE OR REPLACE PROCEDURE your_stored_procedure(p_input_param IN VARCHAR2)ASBEGIN -- 在這里編寫存儲過程的邏輯,使用輸入參數 p_input_param -- 示例:輸出接收到的輸入參數 DBMS_OUTPUT.PUT_LINE('Received input parameter: ' || p_input_param); -- 示例:根據輸入參數查詢數據并處理 FOR rec IN (SELECT * FROM your_table WHERE column_name = p_input_param) LOOP -- 處理每一行數據 -- 可以使用 rec.column_name 來訪問具體字段的值 -- 示例:輸出每一行的 ID 和 Name 字段值 DBMS_OUTPUT.PUT_LINE('ID: ' || rec.id || ', Name: ' || rec.name); END LOOP;END;/

在上述示例中,存儲過程 your_stored_procedure 接受一個輸入參數 p_input_param,您可以在存儲過程的邏輯部分使用這個參數進行操作,例如根據參數查詢數據并進行處理。

請根據您的實際需求修改示例代碼,并將適當的邏輯放在存儲過程中。執行該存儲過程時,可以使用 EXEC your_stored_procedure(‘your_input_value’); 或者 CALL your_stored_procedure(‘your_input_value’); 來調用它。在執行過程中,存儲過程中的邏輯將被執行,并將結果輸出到 DBMS_OUTPUT,您可以通過適當的方式查看輸出結果。

3:有入參和出參存儲過程CREATE OR REPLACE PROCEDURE your_stored_procedure(p_input_param IN VARCHAR2, p_output_param OUT NUMBER)ASBEGIN -- 在這里編寫存儲過程的邏輯,使用輸入參數 p_input_param -- 示例:根據輸入參數查詢數據并處理 SELECT COUNT(*) INTO p_output_param FROM your_table WHERE column_name = p_input_param;END;/

在上述示例中,存儲過程 your_stored_procedure 接受一個輸入參數 p_input_param 和一個輸出參數 p_output_param。您可以在存儲過程的邏輯部分使用輸入參數進行操作,并將結果存儲到輸出參數中。

請根據您的實際需求修改示例代碼,并將適當的邏輯放在存儲過程中。執行該存儲過程時,可以使用以下代碼調用它:

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;/

在執行過程中,存儲過程中的邏輯將被執行,并將結果存儲到輸出參數 p_output_param 中。在示例中,輸出參數的值被存儲到 v_output_param 變量中,您可以根據需要進行進一步的處理。

4:存儲過程中更新表數據CREATE OR REPLACE PROCEDURE your_stored_procedure(p_input_param IN VARCHAR2)ASBEGIN -- 在這里編寫存儲過程的邏輯,使用輸入參數 p_input_param -- 示例:更新表中的數據 UPDATE your_table SET column_name = p_input_param WHERE <條件>; -- 示例:提交事務 COMMIT;END;/

在上述示例中,存儲過程 your_stored_procedure 接受一個輸入參數 p_input_param,您可以在存儲過程的邏輯部分使用該參數進行更新表數據的操作。根據實際情況,您可以修改 UPDATE 語句中的表名、字段名和更新條件。

請根據您的實際需求修改示例代碼,并將適當的邏輯放在存儲過程中。執行該存儲過程時,可以使用以下代碼調用它:

BEGIN your_stored_procedure('your_input_value'); -- 執行其他操作END;/

在執行過程中,存儲過程中的邏輯將被執行,并根據傳入的輸入參數更新表中的數據。示例中的 COMMIT 語句用于提交事務,您可以根據需要添加或刪除該語句。

5:存儲過程中刪除某些數據CREATE OR REPLACE PROCEDURE your_stored_procedure(p_input_param IN VARCHAR2)ASBEGIN -- 在這里編寫存儲過程的邏輯,使用輸入參數 p_input_param -- 示例:刪除表中的數據 DELETE FROM your_table WHERE column_name = p_input_param; -- 示例:提交事務 COMMIT;END;/

在上述示例中,存儲過程 your_stored_procedure 接受一個輸入參數 p_input_param,您可以在存儲過程的邏輯部分使用該參數進行刪除表數據的操作。根據實際情況,您可以修改 DELETE 語句中的表名、字段名和刪除條件。

BEGIN your_stored_procedure('your_input_value'); -- 執行其他操作END;/6:存儲過程中執行新增操作CREATE OR REPLACE PROCEDURE your_stored_procedure(p_input_param1 IN VARCHAR2, p_input_param2 IN NUMBER)ASBEGIN -- 在這里編寫存儲過程的邏輯,使用輸入參數 p_input_param1 和 p_input_param2 -- 示例:插入數據到表中 INSERT INTO your_table (column1, column2) VALUES (p_input_param1, p_input_param2); -- 示例:提交事務 COMMIT;END;/

在上述示例中,存儲過程 your_stored_procedure 接受兩個輸入參數 p_input_param1 和 p_input_param2,您可以在存儲過程的邏輯部分使用這些參數進行插入數據到表的操作。根據實際情況,您可以修改 INSERT INTO 語句中的表名和列名,并根據參數進行值的插入

BEGIN your_stored_procedure('value1', 123); -- 執行其他操作END;/

在執行過程中,存儲過程中的邏輯將被執行,并根據傳入的輸入參數將數據插入到表中。示例中的 COMMIT 語句用于提交事務,您可以根據需要添加或刪除該語句。

7:存儲過程查詢姓名CREATE OR REPLACE PROCEDURE your_stored_procedure(p_input_param IN VARCHAR2)AS v_data your_table%ROWTYPE;BEGIN -- 在這里編寫存儲過程的邏輯,使用輸入參數 p_input_param -- 示例:查詢表中的數據 SELECT * INTO v_data FROM your_table WHERE column_name = p_input_param; -- 示例:在輸出結果中展示查詢到的數據 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 接受一個輸入參數 p_input_param,并使用該參數查詢表中的數據。查詢結果存儲在變量 v_data 中,您可以根據表的結構修改變量的類型和名稱。然后,您可以根據需要使用 DBMS_OUTPUT.PUT_LINE 將查詢結果輸出。

BEGIN your_stored_procedure('your_input_value'); -- 執行其他操作END;/

在執行過程中,存儲過程中的邏輯將被執行,并根據傳入的輸入參數查詢表中的數據。如果找到匹配的數據,則會將查詢結果打印出來。如果未找到匹配的數據,則會輸出相應的消息。

8:存儲過程查詢符合條件的數據集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 -- 在這里編寫存儲過程的邏輯,使用輸入參數 p_input_param -- 示例:循環遍歷查詢結果集 FOR rec_data IN cur_data LOOP -- 存儲每一行的數據到變量 v_data v_data := rec_data; -- 示例:在輸出結果中展示每一行的數據 DBMS_OUTPUT.PUT_LINE('Column1: ' || v_data.column1); DBMS_OUTPUT.PUT_LINE('Column2: ' || v_data.column2); -- 添加其他列的輸出 END LOOP; -- 示例:如果沒有查詢到數據,則輸出相應的消息 IF cur_data%NOTFOUND THEN DBMS_OUTPUT.PUT_LINE('No data found for the input parameter.'); END IF;END;/

在上述示例中,存儲過程 your_stored_procedure 接受一個輸入參數 p_input_param,并使用該參數查詢符合條件的數據集。查詢結果使用游標 cur_data 來獲取,然后通過循環遍歷每一行數據并存儲在變量 v_data 中,最后根據需要使用 DBMS_OUTPUT.PUT_LINE 將查詢結果輸出。

BEGIN your_stored_procedure('your_input_value'); -- 執行其他操作END;/

在執行過程中,存儲過程中的邏輯將被執行,并根據傳入的輸入參數查詢符合條件的數據集。如果找到匹配的數據,則會將每一行的查詢結果打印出來。如果未找到匹配的數據,則會輸出相應的消息。

9:存儲過程查詢符合條件的數據集并返回

下面是一個示例的 PL/SQL 存儲過程,它接受一個輸入參數,并使用該參數查詢符合條件的數據集,并將結果作為游標返回:

CREATE OR REPLACE PROCEDURE your_stored_procedure(p_input_param IN VARCHAR2, p_result OUT SYS_REFCURSOR)ASBEGIN -- 在這里編寫存儲過程的邏輯,使用輸入參數 p_input_param -- 示例:查詢符合條件的數據集并將結果存儲在游標 p_result 中 OPEN p_result FOR SELECT * FROM your_table WHERE column_name = p_input_param;END;/

在上述示例中,存儲過程 your_stored_procedure 接受一個輸入參數 p_input_param,并使用該參數查詢符合條件的數據集。查詢結果將存儲在游標 p_result 中,并作為輸出參數返回。

DECLARE v_cursor SYS_REFCURSOR;BEGIN your_stored_procedure('your_input_value', v_cursor); -- 執行其他操作,如處理返回的游標數據集END;/

在執行過程中,存儲過程中的邏輯將被執行,并根據傳入的輸入參數查詢符合條件的數據集。查詢結果將存儲在游標 v_cursor 中,您可以根據需要在存儲過程外部處理返回的游標數據集

10:復雜一點的存儲過程,傳入就診id和檔案id 查詢數據集CREATE OR REPLACE PROCEDURE SP_MZ_GET_JZFYMX(P_JIUZHENID VARCHAR2,--入參就診id P_ID VARCHAR2,--入參檔案id P_ERRMSG OUT VARCHAR2,--出參提示信息 p_cursor OUT SYS_REFCURSOR--出參,游標 ) IS --涉及到動態表名,所以表名需要拼接 PRI_KH VARCHAR2(3000); -- PRI_SSTSQL VARCHAR2(3000); --sql PRI_NIAN1 INT;--年份1 PRI_NIAN2 INT;--年份2 PRI_NUM INT :=0;--次數 BEGIN --參數判斷 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)));--把當前年份存入數據中PRI_NIAN1 := PRI_NIAN2 - 2;--把前兩年年份存儲數據中IF PRI_NIAN1 <= PRI_NIAN2 THEN -- 從起始數字開始遞增循環輸出 FOR i IN PRI_NIAN1..PRI_NIAN2 LOOP -- 在這里對每個整數進行操作或展示 if PRI_NUM > 0 then --第二次拼接sql需要 union allPRI_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 allPRI_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;--結束if判斷 PRI_NUM := PRI_NUM + 1;--每次循環次數+1 END LOOP;--結束循環end if;--結束if判斷//拼接不需要 動態表名的查詢語句 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 := '執行錯誤!' || CHR(13) || '錯誤代碼:' || SQLCODE || CHR(13) || '錯誤信息:' || SQLERRM; END SP_MZ_GET_JZFYMX;

如何調整存儲過程看下邊

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; -- 聲明結果變量 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 -- 調用存儲過程并傳入游標參數SP_MZ_GET_JZFYMX(P_JIUZHENID,P_ID,P_ERRMSG,your_cursor); -- 循環獲取游標結果并展示 LOOP FETCH your_cursor INTO your_variable1, your_variable2, your_variable3,your_variable4,your_variable5,your_variable6,your_variable7; EXIT WHEN your_cursor%NOTFOUND; -- 在這里對每行數據進行展示或其他操作 DBMS_OUTPUT.PUT_LINE(your_variable1 || ', ' || your_variable2 || ', ' || your_variable3|| ', ' || your_variable4|| ', ' || your_variable5|| ', ' || your_variable6|| ', ' || your_variable7); END LOOP; -- 關閉游標 CLOSE your_cursor;END;/

到此這篇關于Oracle 存儲過程詳細介紹及如何使用的文章就介紹到這了,更多相關Oracle 存儲過程內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Oracle 數據庫
国产综合久久一区二区三区