Oracle — PL-SQL

介紹

? ? ?Oracle PL/SQL是專為Oracle數據庫設計的過程化編程語言,深度融合SQL語句與結構化編程邏輯,旨在高效處理復雜數據操作與業務規則。其核心特征為“塊結構”,程序由聲明、執行、異常處理三部分組成,支持模塊化開發,顯著提升代碼復用性和可維護性。PL/SQL通過預編譯機制將代碼塊整體發送至數據庫執行,大幅減少網絡交互頻次,尤其擅長批量數據處理,可借助FORALL、BULK COLLECT等特性優化事務性能。開發者可創建存儲過程、函數、觸發器及程序包,將業務邏輯封裝于數據庫層,實現數據計算下沉,保障事務一致性與安全性。異常處理框架支持自定義錯誤捕獲與響應,增強程序健壯性。游標機制提供靈活的數據逐行處理能力,動態SQL則支持運行時語句構造,適應復雜邏輯場景。隨著版本迭代,PL/SQL持續集成JSON解析、面向對象編程等現代特性,并與Java、Python等語言深度互通,鞏固其在企業級應用開發中的地位,成為Oracle生態中處理高并發事務、構建金融級系統的關鍵技術棧。


PL/SQL 塊結構

Oracle PL/SQL 塊是程序基本單元,包含聲明(DECLARE)、執行(BEGIN-END)、異常處理(EXCEPTION)三部分,支持變量定義、邏輯控制及錯誤處理,用于封裝數據庫操作和業務邏輯。匿名塊可直接執行,存儲過程等具名塊可重復調用。

PL/SQL采用塊結構,分為:

  1. 聲明部分(DECLARE):定義變量、游標、異常等(可選)。
  2. 執行部分(BEGIN ... END):包含主要邏輯代碼。
  3. 異常處理(EXCEPTION):處理運行時錯誤(可選)。
DECLAREv_name VARCHAR2(50) := 'Alice';
BEGINDBMS_OUTPUT.PUT_LINE('Hello, ' || v_name);
EXCEPTIONWHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('Error occurred');
END;

變量與數據類型

Oracle PL/SQL變量用于存儲數據,需聲明數據類型,包括標量(如NUMBER、VARCHAR2)、復合(記錄、集合)、引用及LOB類型,支持%TYPE繼承字段類型,確保數據一致性與靈活性。

  • 標量類型:NUMBER, VARCHAR2, DATE, BOOLEAN等。
  • 復合類型:
    • 記錄(RECORD):結構體類型。
TYPE t_emp IS RECORD (id NUMBER, name VARCHAR2(100));
  • 集合:包括關聯數組(INDEX BY)、嵌套表(TABLE)、可變數組(VARRAY)。
  • 引用類型:%TYPE(字段類型)和%ROWTYPE(整行類型)。
? v_emp_id employees.employee_id%TYPE; -- 引用表字段類型v_emp employees%ROWTYPE; -- 引用整行結構

流程控制

Oracle PL/SQL流程控制通過條件語句(IF/CASE)、循環(FOR/WHILE/LOOP)及順序控制(GOTO/NULL)管理代碼執行邏輯,實現靈活業務處理與邏輯分支。

條件語句:

? IF condition THEN ... ELSIF ... ELSE ... END IF;CASE WHEN ... THEN ... ELSE ... END CASE;

循環:

  1. 基本循環:LOOP ... EXIT WHEN ... END LOOP;
  2. WHILE循環:WHILE condition LOOP ... END LOOP;
  3. FOR循環:FOR i IN 1..10 LOOP ... END LOOP;

游標(Cursors)

Oracle PL/SQL游標用于逐行處理查詢結果集,分顯式(手動聲明、打開、提取、關閉)和隱式(自動管理)兩種,支持循環遍歷數據,實現多行記錄的精確操作與復雜業務邏輯處理。

  • 顯式游標:
DECLARECURSOR c_emp IS SELECT * FROM employees;v_emp employees%ROWTYPE;BEGINOPEN c_emp;LOOPFETCH c_emp INTO v_emp;EXIT WHEN c_emp%NOTFOUND;-- 處理數據END LOOP;CLOSE c_emp;END;
  • 隱式游標:自動處理SELECT INTO或DML語句。
  • FOR循環游標:
? FOR emp_rec IN (SELECT * FROM employees) LOOPDBMS_OUTPUT.PUT_LINE(emp_rec.name);END LOOP;

異常處理

  1. 預定義異常:如NO_DATA_FOUND, TOO_MANY_ROWS。
  2. 自定義異常:
? DECLAREe_custom EXCEPTION;PRAGMA EXCEPTION_INIT(e_custom, -20001);BEGINRAISE e_custom;EXCEPTIONWHEN e_custom THENDBMS_OUTPUT.PUT_LINE('自定義錯誤');END;

存儲過程與函數

Oracle PL/SQL存儲過程(PROCEDURE)封裝數據庫操作,無返回值;函數(FUNCTION)返回計算結果,可在SQL中調用。兩者均支持參數傳遞,提升代碼復用性、模塊化及執行效率。

  • 存儲過程:
? CREATE OR REPLACE PROCEDURE proc_name (p_param IN NUMBER) ISBEGIN-- 邏輯代碼END;
  • 函數(必須返回一個值):
CREATE OR REPLACE FUNCTION func_name RETURN NUMBER ISBEGINRETURN 100;END;
  • 參數模式:IN(輸入,默認)、OUT(輸出)、IN OUT(雙向)。

動態SQL

  • EXECUTE IMMEDIATE:
? EXECUTE IMMEDIATE 'UPDATE employees SET salary = :1 WHERE id = :2' USING 5000, 101;
  • DBMS_SQL包:處理復雜動態SQL。

事務控制

  1. 顯式提交:COMMIT;
  2. 回滾:ROLLBACK;或回滾到保存點:ROLLBACK TO sp1;
  3. 保存點:SAVEPOINT sp1;

集合類型

  • 關聯數組:
? TYPE t_dict IS TABLE OF VARCHAR2(20) INDEX BY PLS_INTEGER;
  • 嵌套表:
TYPE t_list IS TABLE OF NUMBER;
  • 可變數組(VARRAY):固定大小的數組。

觸發器(Triggers)

  1. 行級觸發器(FOR EACH ROW)可訪問:NEW和:OLD。
  2. 事件:BEFORE/AFTER INSERT/UPDATE/DELETE。
CREATE TRIGGER trg_audit
BEFORE UPDATE ON employees
FOR EACH ROW
BEGININSERT INTO audit_table VALUES (:OLD.salary, :NEW.salary);
END;

注意事項

  1. 異常處理中避免過度使用WHEN OTHERS,應捕獲具體異常。
  2. 顯式游標使用后需及時關閉。
  3. 動態SQL需防范SQL注入,優先使用綁定變量(USING子句)。
  4. 事務控制需謹慎,存儲過程內通常不自動提交,由調用者決定。

總結

? ? ?Oracle PL/SQL是Oracle數據庫專用的過程化編程語言,深度融合SQL的數據處理能力與結構化編程特性。它以塊(BLOCK)為基本單元,每個塊由聲明部分(DECLARE)、執行部分(BEGIN-END)和異常處理(EXCEPTION)構成,支持模塊化開發,提升代碼可讀性與復用性。PL/SQL通過變量、條件分支(IF/CASE)、循環(LOOP/WHILE/FOR)等語法實現復雜邏輯控制,并允許開發者創建存儲過程、函數、包(Package)及觸發器(Trigger),將業務邏輯封裝在數據庫層,減少網絡交互,提高執行效率。

? ? ?其異常處理機制通過預定義和自定義異常捕獲錯誤,確保程序健壯性。游標(顯式/隱式)支持逐行處理查詢結果集,而集合類型(關聯數組、嵌套表等)可高效操作批量數據。動態SQL技術(如EXECUTE IMMEDIATE)賦予SQL語句運行時動態構建的能力,適應靈活場景需求。PL/SQL與SQL無縫集成,支持直接在代碼中嵌入DML、事務控制語句,同時通過BULK COLLECT、FORALL等特性優化批量操作性能。隨著版本迭代,PL/SQL持續增強對JSON、云計算的支持,并強化調試工具(如DBMS_OUTPUT、UTL_FILE),成為企業級數據處理、事務管理和自動化任務的核心工具,廣泛應用于金融、電信等領域的高性能數據庫系統中。

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

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

相關文章

高防ip支持哪些網絡協議

高防IP通常支持多種網絡協議,以提供全面的網絡安全防護。以下是一些主要支持的網絡協議及其相關說明: TCP協議(傳輸控制協議): TCP協議是最常見的傳輸協議,廣泛應用于互聯網通信。高防IP通過對TCP協議的防…

Flutter基礎()

導航欄 appBar: AppBar() title: const Text(搜索) //標題 backgroundColor: Colors.blue //背景顏色 centerTitle: true //標題居中leading 屬性 作用: 放置在應用欄左側的控件,通常是一個圖標按鈕,用于導航或打開菜單。 AppBar(le…

ESP系列單片機選擇指南:結合實際場景的最優選擇方案

前言 在物聯網(IoT)快速發展的今天,ESP系列單片機憑借其優異的無線連接能力和豐富的功能特性,已成為智能家居、智慧農業、工業自動化等領域的首選方案。本文將深入分析各款ESP芯片的特點,結合典型應用場景,幫助開發者做出最優選擇…

搭建Caffeine+Redis多級緩存機制

本地緩存的簡單實現方案有HashMap,CucurrentHashMap,成熟的本地緩存方案有Guava 與 Caffeine ,企業級應用推薦下面說下兩者的區別 1. 核心異同對比 特性Guava CacheCaffeine誕生背景Google Guava 庫的一部分(2011年)…

【Linux系統】第四節—詳解yum+vim

hello 我是云邊有個稻草人 Linux—本節課所屬專欄—歡迎訂閱—持續更新中~ 目錄 畫板—本節課知識點詳解 一、軟件包管理器 1.1 什么是軟件包 1.2 Linux軟件?態 1.3 yum具體操作 【查看軟件包】 【安裝軟件】 【卸載軟件】 【注意事項】 1.4 安裝源 二、vim 2.1 …

EasyRTC嵌入式音視頻通信SDK打造帶屏IPC全場景實時通信解決方案

一、方案概述? 在智能安防與物聯網快速發展的背景下,帶屏IPC(網絡攝像機)不僅承擔著視頻采集與監控的基礎功能,還逐漸向多樣化交互與智能化方向演進。EasyRTC作為一款強大的實時通信框架,具備低延遲、高穩定性、跨平…

Linux下的c/c++開發之操作Redis數據庫

C/C 操作 Redis 的常用庫 在 C/C 開發中操作 Redis 有多種方式,最主流的選擇是使用第三方客戶端庫。由于 Redis 官方本身是使用 C 編寫的,提供的 API 非常適合 C/C 調用。常見的 Redis C/C 客戶端庫包括: hiredis:官方推薦的輕量…

go 通過匯編學習atomic原子操作原理

文章目錄 概要一、原理1.1、案例1.2、關鍵匯編 二、LOCK匯編指令2.1、 LOCK2.2、 原理2.2.1、 緩存行2.2.2、 緩存一致性之MESI協議2.2.3、lock原理 三、x86緩存發展四、x86 DMA發展參考 概要 在并發操作下,對一個簡單的aa2的操作都會出錯,這是因為這樣…

mapreduce打包運行

maven打包 MapReduce是一個分布式運算程序的編程框架,是用戶開發“基于Hadoop的數據分析應用”的核心框架。 MapReduce核心功能是將用戶編寫的業務邏輯代碼和自帶默認組件整合成一個完整的分布式運算程序(例如:jar包)&#xff0…

小白成長之路-LInux系統文件與目錄管理(二)

提示:第二部分對第一部分收尾 文章目錄 常見的命令如下一、文件查看命令1. more命令2.less命令3.head命令4.tail命令5.nl命令(了解)6.創建目錄命令7.創建文件命令>: 覆蓋重定向>>: 追加重定向 8.touch命令9.echo命令10.文件或目錄復…

JVM之虛擬機運行

虛擬機運行快速復習 try-catch:catch-異常表棧展開,finally-代碼復制異常表兜底 類的生命周期:加載,連接(驗證,準備,解析),初始化,使用,卸載 類…

AI數字人實現原理

隨著人工智能與數字技術的快速發展,AI數字人(Digital Human)作為新一代人機交互媒介,正在多個行業中快速落地。無論是在虛擬主播、在線客服、教育培訓,還是在數字代言、元宇宙中,AI數字人都扮演著越來越重要…

Android開發-數據庫SQLite

在Android應用開發中,當需要存儲結構化數據時,SQLite是一個非常強大的工具。SQLite是一款輕量級的關系型數據庫管理系統,它內嵌于Android系統中,支持SQL語法,并且不需要單獨的服務器進程或系統配置。本文將介紹如何在A…

android實現USB通訊

在 Android 上枚舉 USB 設備除了使用 UsbManager.getDeviceList() 方法外,還有以下幾種常見的方式: 1. 使用 USB 設備過濾器(XML 配置) 通過在 AndroidManifest.xml 中配置 USB 設備過濾器,可以讓系統自動檢測并通知…

FFmpeg視頻編碼的完整操作指南

步驟如下: 安裝和準備FFmpeg:確保包含所需編碼器(如libx264)。基本命令行編碼:使用ffmpeg命令進行轉碼,設置視頻編碼器、CRF、預設等。API編碼流程(針對開發者): a. 注冊…

鴻蒙 UIAbility組件與UI的數據同步和窗口關閉

使用 EventHub 進行數據通信 Stage模型概念圖 根據 Stage 模型概念圖 UIAbility 先于 ArkUI Page 創建 所以,事件要先 .on 訂閱 再 emit 發布 假如現在有頁面 Page1 和他的 UIAbility // src/main/ets/page1ability/Page1Ability.ets onCreate(want: Want, laun…

全棧工程師實戰手冊:LuatOS日志系統開發指南!

本文聚焦LuatOS-log庫的實戰應用場景,通過完整案例演示日志模塊集成、格式定制及遠程同步方案,幫助全棧開發者構建靈活可靠的日志管理框架。下面,我們一起來認識LuatOS的log庫! 一、 log.info() log info()主要打印一些正常的…

STM32-USART串口通信(9)

一、通信接口介紹 通信的目的:將一個設備的數據傳送到另一個設備,擴展硬件系統。 當STM32想要實現一些功能,但是需要外掛一些其他模塊才能實現,這就需要在兩個設備之間連接上一根或多跟通信線,通過通信線路發送或者接…

【MoveIt 2】使用 MoveIt 任務構造器(MoveIt Task Constructor)進行拾取和放置

本教程將引導您創建一個使用 MoveIt 任務構造器規劃抓取和放置操作的包。MoveIt 任務構造器(https://github.com/moveit/moveit_task_constructor/tree/ros2/)提供了一種為包含多個不同子任務(稱為階段)的任務進行規劃的方法。如果…

破解商業綜合體清潔管理困局:商業空間AI智能保潔管理系統全場景解決方案

方案整體概述 隨著商業綜合體日益向智能化、精細化管理轉型,傳統保潔工作面臨人員監管難、清潔效果評估難、應急響應滯后等諸多挑戰。為解決這些痛點,本系統依托計算機視覺、行為識別、圖像分割與深度學習等AI技術,構建一套集人員管理、工作…