【Oracle學習筆記】7.存儲過程(Stored Procedure)

Oracle中的存儲過程是一組為了完成特定功能而預先編譯并存儲在數據庫中的SQL語句和PL/SQL代碼塊。它可以接受參數、執行操作(如查詢、插入、更新、刪除數據等),并返回結果。以下從多個方面詳細講解:

1. 存儲過程的創建

創建存儲過程使用 CREATE OR REPLACE PROCEDURE 語句,基本語法如下:

CREATE [OR REPLACE] PROCEDURE procedure_name[(parameter1 [IN | OUT | IN OUT] data_type [:= default_value],parameter2 [IN | OUT | IN OUT] data_type [:= default_value],...)]
IS-- 聲明部分,用于聲明變量、游標等variable1 data_type;variable2 data_type := initial_value;
BEGIN-- 執行部分,包含SQL語句和PL/SQL邏輯-- 例如,插入數據INSERT INTO your_table (column1, column2) VALUES (parameter1, variable1);-- 更新數據UPDATE your_table SET column2 = parameter2 WHERE column1 = variable2;-- 可以進行條件判斷IF variable1 > 10 THEN-- 執行某些操作DELETE FROM your_table WHERE column1 = variable2;END IF;-- 循環操作FOR i IN 1..10 LOOP-- 執行循環內的操作INSERT INTO another_table (column3) VALUES (i);END LOOP;
EXCEPTION-- 異常處理部分,捕獲并處理執行過程中的異常WHEN NO_DATA_FOUND THEN-- 處理沒有找到數據的異常DBMS_OUTPUT.PUT_LINE('沒有找到數據');WHEN OTHERS THEN-- 處理其他異常DBMS_OUTPUT.PUT_LINE('發生其他錯誤:'|| SQLERRM);
END;
  • CREATE [OR REPLACE]CREATE 用于創建新的存儲過程,OR REPLACE 表示如果存儲過程已存在,則替換它。這樣可以在不刪除存儲過程的情況下修改其定義。
  • procedure_name:存儲過程的名稱,遵循數據庫對象命名規則。
  • parameter:存儲過程可以有零個或多個參數。參數類型分為 IN(輸入參數,默認類型,用于向存儲過程傳遞值)、OUT(輸出參數,用于從存儲過程返回值)和 IN OUT(既可以輸入值,也可以返回值)。參數可以有默認值。
  • IS:開始聲明部分,用于聲明存儲過程內部使用的變量、游標等。
  • BEGIN:開始執行部分,包含實際要執行的SQL語句和PL/SQL邏輯。
  • EXCEPTION:異常處理部分,用于捕獲并處理執行過程中可能出現的異常。

2. 存儲過程的調用

調用存儲過程有兩種常見方式,取決于存儲過程是否有參數:

  • 無參數存儲過程調用
BEGINprocedure_name;
END;

例如,假設存在一個名為 delete_old_records 的無參數存儲過程,用于刪除舊記錄:

BEGINdelete_old_records;
END;
  • 有參數存儲過程調用
BEGINprocedure_name(parameter1_value, parameter2_value);
END;

如果存儲過程有 IN 參數,可以直接傳遞值;如果有 OUTIN OUT 參數,需要先聲明變量來接收返回值。例如,假設有一個存儲過程 calculate_total,用于計算訂單總金額并返回:

DECLAREtotal_amount NUMBER;
BEGINcalculate_total('2023 - 10 - 01', '2023 - 10 - 31', total_amount);DBMS_OUTPUT.PUT_LINE('訂單總金額為:'|| total_amount);
END;

這里 calculate_total 存儲過程接受兩個 IN 參數(日期范圍)和一個 OUT 參數(用于返回總金額)。

3. 存儲過程的優勢

  • 提高代碼復用性:將常用的業務邏輯封裝在存儲過程中,不同的應用程序或SQL腳本可以多次調用,避免重復編寫相同的代碼。
  • 增強安全性:通過對存儲過程授權,而不是直接對底層表授權,可以限制用戶對數據的訪問方式和范圍。用戶只能通過執行存儲過程來操作數據,而不能直接訪問表,從而保護數據的完整性和安全性。
  • 提升性能:存儲過程在數據庫服務器端編譯并存儲,執行時直接從服務器端調用,減少了網絡傳輸開銷。而且,數據庫可以對存儲過程進行優化,緩存執行計劃,提高執行效率。
  • 簡化應用程序開發:應用程序只需調用存儲過程,而無需關心復雜的SQL邏輯和數據處理細節,降低了開發難度,提高了開發效率。

4. 存儲過程的調試

  • 使用 DBMS_OUTPUT:在存儲過程中使用 DBMS_OUTPUT.PUT_LINE 語句輸出調試信息。在調用存儲過程之前,需要先設置 SET SERVEROUTPUT ON 開啟輸出功能。例如:
CREATE OR REPLACE PROCEDURE test_proc
IS
BEGINDBMS_OUTPUT.PUT_LINE('進入存儲過程');-- 其他邏輯DBMS_OUTPUT.PUT_LINE('離開存儲過程');
END;

然后調用存儲過程:

SET SERVEROUTPUT ON;
BEGINtest_proc;
END;
  • 使用Oracle SQL Developer等工具:這些工具提供了可視化的調試界面,可以設置斷點、查看變量值、單步執行存儲過程等,方便定位和解決問題。

5. 存儲過程的管理

  • 查看存儲過程定義:可以使用 DESC 命令查看存儲過程的參數列表,使用 USER_SOURCE 視圖查看存儲過程的源代碼。例如,查看 test_proc 的參數:
DESC test_proc;

查看 test_proc 的源代碼:

SELECT text
FROM USER_SOURCE
WHERE name = 'TEST_PROC'
ORDER BY line;
  • 修改存儲過程:使用 CREATE OR REPLACE PROCEDURE 語句重新創建存儲過程,即可修改其定義。
  • 刪除存儲過程:使用 DROP PROCEDURE 語句刪除存儲過程。例如:
DROP PROCEDURE test_proc;

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

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

相關文章

tc工具-corrupt 比 delay/loss 更影響性能

1. netem corrupt 5% 的作用 功能說明 corrupt 5% 表示 隨機修改 5% 的數據包內容(如翻轉比特位),模擬數據損壞。它本身不會直接丟棄或延遲數據包,而是讓接收端收到錯誤的數據(可能觸發校驗和失敗、協議層重傳等&…

Flask YAML管理工具

項目概述 項目地址:https://github.com/KaiqiZing/Flask_Yaml_Demo 這是一個基于Flask開發的YAML文件管理工具,提供了完整的YAML文件查看、編輯、管理功能,具有現代化的Web界面和強大的編輯能力。 核心功能 1. 文件管理功能 目錄掃描&am…

Embedding模型微調實戰(ms-swift框架)

目錄 簡介 1. 創建虛擬環境 2 安裝ms-swift 3安裝其他依賴庫 4. 下載數據集 5.開始embedding模型訓練 6. 自定義數據格式和對應的Loss類型 (1) infoNCE損失 (2)余弦相似度損失 (3)對比學習損失 (4).在線對比學習損失 &#…

從性能優化賽到社區Committer,走進趙宇捷在Apache Fory的成長之路

Apache Fory 是一個基于JIT和零拷貝的高性能多語言序列化框架,實現了高效緊湊的序列化協議,提供極致的性能、壓縮率和易用性。在多語言序列化框架技術領域取得了重大突破,推動序列化技術步入高性能易用新篇章!這一切,都…

Python實例題:基于 Flask 的任務管理系統

目錄 Python實例題 題目 要求: 解題思路: 代碼實現: Python實例題 題目 基于 Flask 的任務管理系統 要求: 使用 Flask 框架構建一個任務管理系統,支持以下功能: 用戶認證(注冊、登錄、…

利用GPU加速TensorFlow

一、寫在前面 我們已經依靠keras和TensorFlow給大家做了一些機器學習在圖像處理中的應用(影像組學學習手冊,基于深度學習的圖像分類任務),此前的教程中我們沒有用GPU進行加速,但是相較于CPU而言,GPU是設計用于處理大規模并行計算任務的硬件&…

模型預測專題:強魯棒性DPCC

0 1 前言 在進行DPCC的學習過程中,于下面鏈接看到了一篇強魯棒性算法;感覺挺有意思的,學習一下。 永磁同步電機高性能控制算法(12)——基于預測電流誤差補償的強魯棒預測控制/參數辨識&有限集預測控制與連續集預…

修復opensuse 風滾草rabbitmq的Error: :plugins_dir_does_not_exist問題

https://wiki.archlinux.org/title/Talk:RabbitMQ 報錯 yqh192 /u/l/r/l/r/plugins> sudo rabbitmq-plugins enable rabbitmq_management Error: :plugins_dir_does_not_exist Arguments given:enable rabbitmq_managementUsagerabbitmq-plugins [--node <node>] [--…

前端做gis地圖有哪些庫

以下是前端開發GIS地圖常用的庫&#xff1a; Leaflet&#xff1a;輕量級、易于使用的開源JavaScript庫&#xff0c;具有豐富的地圖功能和插件生態系統&#xff0c;支持多種地圖數據源&#xff0c;適合初學者和專業開發者。其優勢在于簡潔性和易用性&#xff0c;代碼結構清晰&am…

賦能城市安全韌性|眾智鴻圖總裁扈震受邀出席智慧城市大會發表主題報告

——“眾智鴻圖作為城市基礎設施智能化綜合服務提供商&#xff0c;以地理信息科學、時空大數據、人工智能為核心能力&#xff0c;長期深耕于燃氣、供水、排水等城市基礎設施生命線領域及港口、園區等工業領域&#xff0c;致力于為城市穩定運行與高效發展提供堅實保障。” 2025年…

【大語言模型入門】—— 淺析LLM基座—Transformer原理

【大語言模型入門】—— 淺析LLM基座—Transformer原理 解密GPT核心技術&#xff1a;Transformer架構深度解析被反復強調的核心概念意味著什么&#xff1f; GPT預測機制解析&#xff1a;從Next Token Prediction到任務推理核心機制的本質案例驅動的機制解析解構策略&#xff1a…

Django打造智能Web機器人控制平臺

Django 實現 Web 機器人控制 以下是關于 Django 實現 Web 機器人控制管理的實例思路和關鍵代碼片段,涵蓋多個常見場景。由于篇幅限制,剩余的可通過類似模式擴展。 基礎機器人模型定義 # models.py from django.db import modelsclass Robot(models.Model):name = models.C…

周賽98補題

題目意思&#xff1a; 給定一個數字判斷加上自身任意因子數&#xff0c;是否能成為一個奇數。 思路&#xff1a; 我們想一個最簡單的判斷方法&#xff0c; 任意的數字的因子數都有1&#xff0c;故&#xff0c;最簡單的方法就是判斷奇偶。 奇數1成偶數&#xff0c;偶數1成奇…

【STM32】 STM32低功耗模式詳解:睡眠模式與喚醒機制【待測試】

本篇知識點基于F0講解 一、STM32三種低功耗模式參考表格 模式功耗喚醒時間保持狀態典型應用場景睡眠模式中等 (mA級)最短 (μs級)CPU停止&#xff0c;外設保持短暫待機&#xff0c;快速響應停止模式低 (μA級)中等 (ms級)RAM保持&#xff0c;時鐘停止長時間待機&#xff0c;電…

【Vue入門學習筆記】Vue核心語法

目錄 準備工作刪除不需要的代碼 模版語法文本插值使用JavaScript表達式無效寫法原始HTML 屬性綁定簡寫布爾型Attribute動態綁定多個值 準備工作 刪除不需要的代碼 刪除components下的文件 進入App.vue 刪掉代碼&#xff0c;只保留如下內容 <template></template&g…

ClickHouse 窗口分析 argMax() / argMin()

argMin() 是 ClickHouse 中一個非常有用的聚合函數&#xff0c;它可以找出某個列的最小值&#xff0c;并返回該最小值對應的另一個列的值 函數語法 argMin(arg, val) arg&#xff1a;要返回的列&#xff08;當找到最小值時返回該列的值&#xff09; val&#xff1a;用于比較的…

k8s client 通過KubeConfig和證書方式連接api server

一、背景 本文以kubePi這樣一個k8s客戶端為示例,使用證書方式,怎么連接k8s集群。 然后告訴你證書是如何生成的, 最后通過一個Python編程示例,在程序里如何使用。 api server地址:比如https://110.206.56.308:6443 Certificate:證書內容 Certificate Key:證書的私鑰 先…

(2025.07)解決——ubuntu20.04系統開機黑屏,左上角光標閃爍

前面一些碎碎念&#xff1a; 電腦裝的雙系統&#xff0c;之前都還好著&#xff0c;今天突然ubuntu開機的時候黑屏了&#xff0c;左上角有光標在閃爍&#xff0c;也查了一些資料&#xff0c;基本上大家的都是驅動有問題&#xff0c;還有內存問題。&#xff08;個人建議&#xff…

一文講清libmodbus在STM32上基于FreeRTOS的移植

libmodbus 開發庫概述 libmodbus是一個免費的跨平臺支持RTU和TCP的Modbus庫&#xff0c;遵循LGPL V2.1協議。libmodbus支持Linux、 Mac Os X、 FreeBSD、 QNX和Windows等操作系統。 libmodbus可以向符合Modbus協議的設備發送和接收數據&#xff0c;并支持通過串口或者TCP網絡進…

go語言安裝達夢數據完整教程

一、安裝 go-dm 驅動 1. 使用 go get 命令安裝 # 打開PowerShell或命令提示符 go get github.com/dmdbms/go-dm# 若網絡問題&#xff0c;配置代理 go env -w GOPROXYhttps://goproxy.cn,direct2. 驗證驅動安裝 go list -m github.com/dmdbms/go-dm# 預期輸出類似 github.com…