Oracle數據庫數據編程SQL<3.5 PL/SQL 存儲過程(Procedure)>

存儲過程(Stored Procedure)是 Oracle 數據庫中一組預編譯的 PL/SQL 語句集合,存儲在數據庫中并可通過名稱調用執行。它們是企業級數據庫應用開發的核心組件。

目錄

一、存儲過程基礎

1. 存儲過程特點

2. 創建基本語法 

3. 存儲過程優點

4. 簡單示例

二、沒有參數的存儲過程

1. 簡單示例

三、有參數的存儲過程

 1. 參數模式

2. 有輸入值 IN

3. 有輸出值 OUT

4. 有輸入輸出值IN OUT

(1)編譯:

(2)調用?編輯

(3)宏&輸入名稱?編輯

(4)查看輸出結果

四、存儲過程的調用總結

五、存儲過程中的DML操作

1. 基本DML示例

2. 使用RETURNING子句

六、異常處理

1. 預定義異常

2. 自定義異常

七、游標處理

1. 顯式游標

2. REF游標(動態游標)

八、高級特性

1. 自治事務

2. 批量處理(FORALL)

3. 條件編譯

九、存儲過程管理

1. 查看存儲過程

右鍵查看

2. 重新編譯

右鍵重新編譯

右鍵編輯--執行

3. 權限控制

4. 刪除存儲過程

十、最佳實踐

十一、存儲過程和函數的區別


一、存儲過程基礎

1. 存儲過程特點

  • 預編譯執行:提高性能,減少解析開銷

  • 模塊化設計:促進代碼重用和維護

  • 增強安全性:通過權限控制保護數據

  • 減少網絡流量:客戶端只需調用過程名而非發送多句SQL

  • 事務控制:可在過程中管理完整事務

2. 創建基本語法 

CREATE [OR REPLACE] PROCEDURE procedure_name[(parameter1 [IN|OUT|IN OUT] datatype [DEFAULT|:= value],parameter2 [IN|OUT|IN OUT] datatype [DEFAULT|:= value],...)]
[IS|AS][declaration_section]
BEGINexecutable_section
[EXCEPTIONexception_section]
END [procedure_name];
/create {or replace} procedure pro_name(v1 in/out/in out 類型)
as/is
{聲明變量}
begin
要執行的語句;
end;
/(1)創建 creat or replace procedure
(2)聲明變量
(3)開始 begin
(4)DML操作
(5)異常處理 exception
(6)結束 end

3. 存儲過程優點

(1)存儲過程只在創建時進行編譯,以后每次執行都不需要重新編譯,而一般的SQL語句每執行一次就編譯一次,所以使用存儲過程可以提高數據庫的執行速度。

(2)當對數據庫進行復雜操作時(比如對多個表進行查詢、修改操作),可以將此復雜的事務處理結合一起使用這些操作。如果用SQL需要多次連接數據庫,如果用存儲過程,只需要連接一次數據庫。

(3)存儲過程可以重復使用,可以減少數據庫開發人員的工作量。

4. 簡單示例

CREATE OR REPLACE PROCEDURE update_employee_salary(       --創建--存過主題結構
---------------------------------------------------------------------------------p_emp_id IN employees.employee_id%TYPE,p_percent IN NUMBER DEFAULT 10
) ASv_old_salary employees.salary%TYPE;                   --聲明變量--存過主題結構
---------------------------------------------------------------------------------
BEGIN                                                     --開始--存過主題結構
----------------------------------------------------------------------------------- 獲取當前薪資SELECT salary INTO v_old_salaryFROM employeesWHERE employee_id = p_emp_id;-- 更新薪資UPDATE employeesSET salary = salary * (1 + p_percent/100)WHERE employee_id = p_emp_id;-- 輸出結果DBMS_OUTPUT.PUT_LINE('員工ID ' || p_emp_id || ' 薪資從 ' || v_old_salary || ' 調整為 ' || (v_old_salary * (1 + p_percent/100)));COMMIT;                                               --DML操作--存過主題結構
---------------------------------------------------------------------------------
EXCEPTIONWHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE('錯誤: 未找到員工ID ' || p_emp_id);ROLLBACK;WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('錯誤: ' || SQLERRM);ROLLBACK;                                         --異常處理--存過主題結構
---------------------------------------------------------------------------------
END update_employee_salary;                               --結束--存過主題結構
---------------------------------------------------------------------------------
/

二、沒有參數的存儲過程

1. 簡單示例

--編寫一個存儲過程,將emp表中和編號7788相同部門的員工信息插入到
--emp3中,將工作為CLERK的工資加300后插入到emp4中。
-- 創建
create or replace procedure pro2 as   --創建--存過主題結構
begin                                 --開始--存過主題結構
--------------------------------------------------------------------DML操作insert into emp3select *from empwhere deptno = (select deptno from emp where empno = 7788);--DML操作insert into emp4select e.empno,e.ename,e.job,e.mgr,e.hiredate,e.sal + 300,e.comm,e.deptnofrom emp ewhere job = 'CLERK';
------------------------------------------------------------------
end;                                   --結束--存過主題結構
/
-- 調用:
call pro2();
-- 查詢、驗證
select * from emp3;
select * from emp4;

三、有參數的存儲過程

 1. 參數模式

模式描述示例
IN只讀參數(默認)p_id IN NUMBER
OUT只寫參數,返回給調用者p_result OUT VARCHAR2
IN OUT可讀寫參數p_counter IN OUT NUMBER

2. 有輸入值 IN

--輸入員工編號,輸出姓名和薪資。
-- 創建
create or replace procedure pro1(v_empno number) asv_name varchar2(20);v_sal  emp.sal%type;
beginselect ename, sal into v_name, v_sal from emp where empno = v_empno;dbms_output.put_line(v_name || v_sal);
end;
-- 調用:
call pro1(7788);【調用方法】
在sql窗口  call pro_name(參數); --sql窗口括號不能省
在命令窗口 exec pro_name(參數);/*===============================================================================*/
【練習1】
--創建一張emp3數據同emp
--更改emp3的sal列的長度為number(20,2)
--編寫一個存儲過程
--輸入一個數字和一個部門編號
--要求數字是0-9的整數(如果不是,拋出異常,并打印'請輸入0-9的整數')
--當部門人數小于該數字,將該部門的員工信息插入到emp1--顯示插入了多少行
--當部門人數大于該數字,將該部門的員工姓名,編號刪除--并顯示刪除了多少人
--當部門人數等于該數字,不該部門的全部員工工資變成原工資的二次方--并顯示增加了多少人的工資
-- 準備:
CREAT TABLE EMP3 AS SELECT * FORM EMP;
ALTER TABLE EMP3 MODIFY SAL NUMBER(20,2);
-- 創建:
CREATE OR REPLACE PROCEDURE PRO_3(V1 NUMBER,V_DEPTNO NUMBER) AS
ERR EXCEPTION;
V3 NUMBER;
BEGINIF v1 NOT IN (0,1,2,3,4,5,6,7,8,9)THENRAISE ERR;END IF;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/74598.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/74598.shtml
英文地址,請注明出處:http://en.pswp.cn/web/74598.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

手撕AVL樹

引入:為何要有AVL樹,二次搜索樹有什么不足? 二叉搜索樹有其自身的缺陷,假如往樹中插入的元素有序或者接近有序,二叉搜索樹就會退化成單支樹,時間復雜度會退化成O(N),因此產生了AVL樹&#xff0c…

《 C語言中的變長數組:靈活而強大的特性》

🚀個人主頁:BabyZZの秘密日記 📖收入專欄:C語言 🌍文章目入 一、變長數組的定義二、變長數組的優勢三、變長數組的使用示例示例1:動態輸入數組大小示例2:變長數組在函數中的應用 四、變長數組的…

【微服務】基礎概念

1.什么是微服務 微服務其實就是一種架構風格,他提倡我們在開發的時候,一個應用應該是一組小型服務而組成的,每一個服務都運行在自己的進程中,每一個小服務都通過HTTP的方式進行互通。他更加強調服務的徹底拆分。他并不是僅局限于…

Linux make與makefile 項目自動化構建工具

本文章將對make與makefile進行一些基礎的講解。 假設我們要建造一座房子,建造過程涉及很多步驟,比如打地基、砌墻、安裝門窗、粉刷墻壁等。每個步驟都有先后順序,并且有些步驟可能依賴于其他步驟的完成。比如,你必須先打好地基才…

如何判斷多個點組成的3維面不是平的,如果不是平的,如何拆分成多個平面

判斷和拆分三維非平面為多個平面 要判斷多個三維點組成的面是否為平面,以及如何將非平面拆分為多個平面,可以按照以下步驟進行: 判斷是否為平面 平面方程法: 選擇三個不共線的點計算平面方程:Ax By Cz D 0檢查其…

多layout 布局適配

安卓多布局文件適配方案操作流程 以下為通過多套布局文件適配不同屏幕尺寸/密度的詳細步驟,結合主流適配策略及最佳實踐總結: 一、?創建多套布局資源目錄? ?按屏幕尺寸劃分? 在 res 目錄下創建以下文件夾(根據設備特性自動匹配&#xff…

Java 大視界 -- Java 大數據在智能農業無人機植保作業路徑規劃與藥效評估中的應用(165)

💖親愛的朋友們,熱烈歡迎來到 青云交的博客!能與諸位在此相逢,我倍感榮幸。在這飛速更迭的時代,我們都渴望一方心靈凈土,而 我的博客 正是這樣溫暖的所在。這里為你呈上趣味與實用兼具的知識,也…

美關稅加征下,Odoo免費開源ERP如何助企業破局?

近期,美國特朗普政府推行的關稅政策對全球供應鏈和進出口企業造成巨大沖擊,尤其是依賴中美貿易的企業面臨成本激增、利潤壓縮和合規風險。在此背景下,如何通過數字化轉型優化管理效率、降低運營成本成為企業生存的關鍵。本文以免費開源ERP系統…

go游戲后端開發25:紅中麻將規則介紹

一、游戲基礎規則介紹 在開發紅中麻將游戲之前,我們需要先了解其基礎規則。紅中麻將的牌面由 a、b、c、d 四種花色組成,其中 a、b、c 分別代表萬、條、筒,每種花色都有 1 - 9 的九種牌,每種牌各有四張,總計 36 張 4 …

Unity:平滑輸入(Input.GetAxis)

目錄 1.為什么需要Input.GetAxis? 2. Input.GetAxis的基本功能 3. Input.GetAxis的工作原理 4. 常用參數和設置 5. 代碼示例:用GetAxis控制角色移動 6. 與Input.GetAxisRaw的區別 7.如何優化GetAxis? 1.為什么需要Input.GetAxis&…

OpenCV:計算機視覺的強大開源庫

文章目錄 引言一、什么是OpenCV?1.OpenCV的核心特點 二、OpenCV的主要功能模塊1. 核心功能(Core Functionality)2. 圖像處理(Image Processing)3. 特征檢測與描述(Features2D)4. 目標檢測&#…

AI浪潮下的IT職業轉型:醫藥流通行業傳統IT顧問的深度思考

AI浪潮下的IT職業轉型:醫藥流通行業傳統IT顧問的深度思考 一、AI重構IT行業的技術邏輯與實踐路徑 1.1 醫藥流通領域的智能辦公革命 在醫藥批發企業的日常運營中,傳統IT工具正經歷顛覆性變革。以訂單處理系統為例,某醫藥集團引入AI智能客服…

Qt進階開發:QFileSystemModel的使用

文章目錄 一、QFileSystemModel的基本介紹二、QFileSystemModel的基本使用2.1 在 QTreeView 中使用2.2 在 QListView 中使用2.3 在 QTableView 中使用 三、QFileSystemModel的常用API3.1 設置根目錄3.2 過濾文件3.2.1 僅顯示文件3.2.2 只顯示特定后綴的文件3.2.3 只顯示目錄 四…

KAPC的前世今生--(下)下RPCRT4!NMP_SyncSendRecv函數分析

第一部分:nt!KiDeliverApc函數調用nt!IopCompleteRequest函數后準備返回 1: kd> kv # ChildEBP RetAddr Args to Child 00 ba3eec18 80a3c83b 896e4e40 ba3eec64 ba3eec58 nt!IopCompleteRequest0x3a3 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv…

深入理解C++引用:從基礎到現代編程實踐

一、引用的本質與基本特性 1.1 引用定義 引用是為現有變量創建的別名,通過&符號聲明。其核心特點: 必須初始化且不能重新綁定 與被引用變量共享內存地址 無獨立存儲空間(編譯器實現) 類型必須嚴格匹配 int value 42; in…

嵌入式Linux開發環境搭建,三種方式:虛擬機、物理機、WSL

目錄 總結寫前面一、Linux虛擬機1 安裝VMware、ubuntu18.042 換源3 改中文4 中文輸入法5 永不息屏6 設置 root 密碼7 安裝 terminator8 安裝 htop(升級版top)9 安裝 Vim10 靜態IP-虛擬機ubuntu11 安裝 ssh12 安裝 MobaXterm (SSH)…

軟件工程面試題(二十七)

1、j a v a 對象初始化順序 1.類的初始化(initialization class & interface) 2.對象的創建(creation of new class instances) 順序:應為類的加載肯定是第一步的,所以類的初始化在前。大體的初始化順序是: 類初始化 -> 子類構造函數 -> 父類構造函數 -&g…

《AI大模型開發筆記》MCP快速入門實戰(一)

目錄 1. MCP入門介紹 2. Function calling技術回顧 3. 大模型Agent開發技術體系回顧 二、 MCP客戶端Client開發流程 1. uv工具入門使用指南 1.1 uv入門介紹 1.2 uv安裝流程 1.3 uv的基本用法介紹 2.MCP極簡客戶端搭建流程 2.1 創建 MCP 客戶端項目 2.2 創建MCP客戶端…

Java中的正則表達式Lambda表達式

正則表達式&&Lambda表達式 正則表達式和Lambda表達式是Java編程中兩個非常實用的特性。正則表達式用于字符串匹配與處理,而Lambda表達式則讓函數式編程在Java中變得更加簡潔。本文將介紹它們的基本用法,并結合示例代碼幫助理解。同時要注意&…

Talend API Tester

背景 工作中有時會需要調測http接口,postman無疑是最常用最流行的工具,但是有一個致命問題,必須要登錄,而工作經常是私網環境,導致使用非常不方便。因此想找一個Windows系統上的輕量級、無需登錄即可使用的http測試工…