18.oracle的過程和函數

oracle11g的過程和函數

  • 一、過程(Procedure)
    • 1、子程序
    • 2、過程的相關語法
  • 二、函數(Function)
    • 1、函數的概念
    • 2、函數的創建
    • 3、 案例

在Oracle數據庫中,過程和函數都是用來封裝一系列SQL語句和邏輯操作的數據庫對象,以便在需要時可以重復使用。它們都可以接受參數并返回值,但在使用上有一些區別。
zohanshu

一、過程(Procedure)

  • 過程是一組SQL語句和邏輯操作的集合,它可以接受輸入參數,但不一定返回數值。
  • 過程可以執行數據操作、流程控制和業務邏輯,它可以包含事務控制語句,如COMMIT和ROLLBACK。
  • 過程通常用于執行一系列的操作,例如數據處理、數據導入導出等。

1、子程序

  1. 什么是子程序

    命名的 PL/SQL 塊,編譯并存儲在數據庫中。

    • 子程序的各個部分:
      • 聲明部分
      • 可執行部分
      • 異常處理部分(可選)
    • 子程序的分類:
      • 過程 - 執行某些操作
      • 函數 - 執行操作并返回值
  2. 子程序的優點:

    • 模塊化:將程序分解為邏輯模塊
    • 可重用性:可以被任意數目的程序調用
    • 可維護性:簡化維護操作
    • 安全性:通過設置權限,使數據更安全

2、過程的相關語法

  1. 創建語法

    CREATE OR REPLACE PROCEDURE procedure_name (parameter1 IN datatype1, parameter2 OUT datatype2)
    AS
    BEGIN-- 存儲過程的邏輯代碼
    END;
    /
    

    在上面的語法中:

    • CREATE OR REPLACE用于創建或替換已存在的存儲過程。
    • PROCEDURE關鍵字用于聲明創建一個存儲過程。
    • procedure_name是存儲過程的名稱。
    • parameter1是輸入參數,使用IN關鍵字聲明,后面跟著參數的數據類型。
    • parameter2是輸出參數,使用OUT關鍵字聲明,后面跟著參數的數據類型。
    • ASBEGIN之間是存儲過程的實際邏輯代碼。
    • END;表示存儲過程的結束。

    下面是一個示例,展示了如何創建一個簡單的存儲過程:

    CREATE OR REPLACE PROCEDURE get_employee_name (p_employee_id IN NUMBER, p_employee_name OUT VARCHAR2)
    AS
    BEGINSELECT employee_name INTO p_employee_name FROM employees WHERE employee_id = p_employee_id;
    END;
    /
    

    在上面的示例中,我們創建了一個名為get_employee_name的存儲過程。它接受一個員工ID作為輸入參數,并返回該員工的姓名。在實際使用時,可以通過調用這個存儲過程來獲取員工的姓名。

  2. 過程參數的三種模式

    在Oracle中,存儲過程和函數的參數可以使用以下三種模式進行聲明和傳遞:

  • IN模式:

    • 當參數聲明為IN模式時,表示該參數是一個輸入參數,即存儲過程或函數可以讀取該參數的值,但不能修改它。
    • 在調用存儲過程或函數時,需要提供IN模式參數的值作為輸入。
    • 例如:
      CREATE OR REPLACE PROCEDURE my_procedure (p_input_param IN VARCHAR2) AS
      BEGIN-- 讀取p_input_param的值,但不能修改它
      END;
      
  • OUT模式:

    • 當參數聲明為OUT模式時,表示該參數是一個輸出參數,即存儲過程或函數可以修改該參數的值,并且該值將在存儲過程或函數執行完畢后返回給調用者。
    • 在調用存儲過程或函數時,OUT模式參數通常不需要提供初始值,因為它的值將由存儲過程或函數賦予。
    • 例如:
      CREATE OR REPLACE PROCEDURE my_procedure (p_output_param OUT NUMBER) AS
      BEGINp_output_param := 100; -- 修改p_output_param的值
      END;
      
  • IN OUT模式:

    • 當參數聲明為IN OUT模式時,表示該參數既是輸入參數,又是輸出參數,即存儲過程或函數可以讀取并修改該參數的值,并且該值將在存儲過程或函數執行完畢后返回給調用者。
    • 在調用存儲過程或函數時,需要提供IN OUT模式參數的初始值作為輸入,并且在存儲過程或函數執行完畢后,該參數的值將被修改并返回給調用者。
    • 例如:
      CREATE OR REPLACE PROCEDURE my_procedure (p_in_out_param IN OUT VARCHAR2) AS
      BEGINp_in_out_param := p_in_out_param || '_modified'; -- 修改p_in_out_param的值
      END;
      

    通過使用這三種參數模式,可以在存儲過程和函數中實現對參數的不同操作和傳遞方式,從而滿足不同的業務需求。

  1. 執行過程的語法
    在Oracle中,執行存儲過程的語法如下:

    EXECUTE procedure_name(parameter1, parameter2, ...);
    

    或者可以使用以下語法:

    CALL procedure_name(parameter1, parameter2, ...);
    

    在上面的語法中:

    • EXECUTE或CALL關鍵字用于執行存儲過程。
    • procedure_name是要執行的存儲過程的名稱。
    • parameter1, parameter2, …是存儲過程的參數,如果存儲過程有參數的話,需要根據參數的順序傳遞參數的值。

    例如,如果有一個名為get_employee_name的存儲過程,它接受一個員工ID作為輸入參數,并返回員工的姓名作為輸出參數,那么可以使用以下語法來執行該存儲過程:

    EXECUTE get_employee_name(100, :employee_name);
    

    或者使用CALL語法:

    CALL get_employee_name(100, :employee_name);
    

    在上面的示例中,100是作為輸入參數傳遞給存儲過程的員工ID,:employee_name是一個輸出參數,用于接收存儲過程返回的員工姓名。

    通過使用上述語法,可以執行存儲過程并傳遞參數,從而實現對數據庫的操作。

  2. 過程的執行權限授予
    要將存儲過程的執行權限授予其他用戶,你可以使用Oracle的GRANT語句。以下是授予其他用戶執行存儲過程權限的示例:

    GRANT EXECUTE ON procedure_name TO other_user;
    

    在上面的示例中:

    • procedure_name是要授予權限的存儲過程的名稱。
    • other_user是要授予權限的其他用戶的名稱。

    執行上述GRANT語句后,other_user將獲得對procedure_name存儲過程的執行權限,允許該用戶執行該存儲過程。

    如果你希望其他用戶能夠執行某個schema中的所有存儲過程,可以使用以下語法:

    GRANT EXECUTE ON SCHEMA_NAME TO other_user;
    

    在上面的示例中,SCHEMA_NAME是包含存儲過程的schema的名稱,other_user將獲得對該schema中所有存儲過程的執行權限。

    請注意,授予執行權限是一種敏感的操作,應該謹慎使用。確保只授予必要的權限,并且只授予給需要執行存儲過程的用戶。

二、函數(Function)

1、函數的概念

  • 函數也是一組SQL語句和邏輯操作的集合。
  • 函數是可以返回值的命名的 PL/SQL 子程序。
  • 函數通常用于計算和返回一個值,例如在查詢中調用函數來進行數學運算、字符串處理或者日期計算。
  • 函數可以被用于SELECT語句的列中,也可以在其他SQL語句中調用。

在Oracle 11g數據庫中,過程和函數都可以使用PL/SQL(Procedural Language/Structured Query Language)來編寫,PL/SQL是Oracle數據庫的過程化擴展語言,它允許開發人員在數據庫中編寫存儲過程、函數、觸發器等。

無論是過程還是函數,它們都可以提高數據庫的性能和安全性,減少重復編寫相同邏輯的工作,同時也可以簡化數據庫應用程序的開發和維護工作。

2、函數的創建

  1. 創捷語法

    CREATE OR REPLACE FUNCTION function_name (parameter1 IN datatype1) RETURN datatype2
    ASvariable datatype2;
    BEGIN-- 函數的邏輯代碼RETURN variable;
    END;
    /
    

    在上面的語法中:

    • CREATE OR REPLACE用于創建或替換已存在的函數。
    • FUNCTION關鍵字用于聲明創建一個函數。
    • function_name是函數的名稱。
    • parameter1是輸入參數,使用IN關鍵字聲明,后面跟著參數的數據類型。
    • RETURN datatype2用于聲明函數的返回類型。
    • AS和BEGIN之間是函數的實際邏輯代碼。
    • RETURN variable;用于返回函數的結果。

    下面是一個示例,展示了如何創建一個簡單的函數:

    CREATE OR REPLACE FUNCTION calculate_bonus (p_salary IN NUMBER) RETURN NUMBER
    ASv_bonus NUMBER;
    BEGINIF p_salary > 50000 THENv_bonus := p_salary * 0.1;ELSEv_bonus := p_salary * 0.05;END IF;RETURN v_bonus;
    END;
    /
    

    以上代碼是一個創建或替換函數的示例。該函數名為calculate_bonus,接受一個輸入參數p_salary(工資)并返回一個數值類型的結果,表示獎金金額。
    函數的邏輯如下:

    • 如果輸入的工資p_salary大于50000,則獎金金額為工資的10%;
    • 否則,獎金金額為工資的5%。

    在函數體內部,使用了一個局部變量v_bonus來存儲計算得到的獎金金額,并使用IF-ELSE條件語句來根據不同的情況進行計算。最后,使用RETURN語句返回計算得到的獎金金額。

    通過使用上述代碼,可以在數據庫中創建一個名為calculate_bonus的函數,當需要根據工資計算獎金時,可以調用此函數來獲得相應的獎金金額。

  2. 函數的限制:

  • 函數的參數類型和數量必須與函數聲明中的參數類型和數量匹配。
  • 函數的返回類型必須與函數聲明中指定的返回類型匹配。
  • 函數體內部的代碼必須遵循數據庫管理系統所使用的特定語法和規則。
  • 在函數體內部,可以訪問和操作數據庫表、視圖、其他函數、存儲過程等數據庫對象,但需要確保有足夠的權限來執行這些操作。
  1. 訪問函數的兩種方式:
  • 直接調用:在SQL語句中可以直接調用函數,例如:

    SELECT calculate_bonus(60000) FROM dual;
    

    這里的calculate_bonus是函數的名稱,60000是傳遞給函數的參數。

  • 作為表達式的一部分:函數可以作為SQL表達式的一部分來使用,例如:

    SELECT employee_name, calculate_bonus(salary) AS bonus FROM employees;
    

    在這個例子中,calculate_bonus函數被用作一個表達式,用來計算每個員工的獎金,并將結果作為一個新的列返回。

    通過這兩種方式,可以方便地使用函數來進行計算和數據處理,從而提高數據庫查詢和操作的靈活性和功能性。

3、 案例

  • 案例題目
    已經執行了下面語句

    create table  分數表 (student_no number(3),name varchar2(10), score number(3));insert into   分數表  values (1,'張一', 56);
    insert into   分數表 values(2,'張二', 82);
    insert into   分數表 values  (3,'張三', 90);
    

    要求:創建一個函數,可以接受用戶輸入的學號,得到該學生的名次,并輸出這個名次。
    要實現這個功能,可以創建一個函數,函數的輸入參數是學生的學號,函數的輸出是該學生的名次。下面是一個示例函數的定義:

  • 案例解答:

    CREATE OR REPLACE FUNCTION get_student_rank(p_student_no IN NUMBER) RETURN NUMBER
    ASv_rank NUMBER;
    BEGINSELECT COUNT(*) INTO v_rankFROM 分數表WHERE score > (SELECT score FROM 分數表 WHERE student_no = p_student_no);RETURN v_rank + 1; -- 因為排名從1開始,所以需要加1
    END;
    /
    

    在上面的函數中,我們創建了一個名為get_student_rank的函數,它接受一個學號作為輸入參數,并返回該學生的名次。函數的邏輯如下:

    • 首先,我們使用一個SELECT語句來計算比指定學生分數更高的學生數量,這個數量就是指定學生的名次。
    • 然后,我們將這個名次返回作為函數的結果。

    使用這個函數,可以通過以下方式獲取指定學生的名次:

    SELECT get_student_rank(2) FROM dual;
    

    這將返回學號為2的學生的名次。

以下對過程和函數進行的比較:

特性過程函數
返回值可以有OUT參數來返回值返回單個值
在SQL中的使用不能直接在SQL語句中使用可以直接在SQL語句中使用
錯誤處理可以使用異常處理來處理錯誤可以使用異常處理來處理錯誤
事務處理可以提交或回滾事務不能提交或回滾事務
調用方式可以從其他過程或觸發器中調用可以從SQL語句或其他函數中調用
CALL my_procedure(param1, param2);SELECT my_function(param1, param2) FROM dual;

這些是過程和函數之間的一些主要區別。根據特定任務的具體要求,每種方法都有其自己的用例和優勢。

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

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

相關文章

ChatGPT重磅升級!集簡云支持GPT4 Turbo Vision, GPT4 Turbo, Dall.E 3,Whisper等最新模型

在11月7日凌晨,OpenAI全球開發者大會宣布了 GPT-4的一次大升級,推出了 GPT-4 Turbo號稱為迄今為止最強的大模型。 此次GPT-4的更新和升級在多個方面顯示出強大的優勢和潛力。為了讓集簡云用戶能快速體驗新模型的能力,我們第一時間整理了大會發…

VR直播如何打破視角壁壘,提升觀看體驗?

隨著數字技術的不斷發展,直播行業也發生了新的變革,VR直播也成為了直播行業中新的趨勢,那么VR直播是如何打破視角壁壘,提升觀看體驗的呢? 杭州亞運會那幾天,多項比賽熱火朝天,無論你是參賽隊伍的…

【double check 讀寫鎖】

使用double check 讀寫鎖 讀多寫少場景 記錄下 //來源 jdbc 中的查詢連接信息 //public abstract class ConnectionUrl implements DatabaseUrlContainer public static ConnectionUrl getConnectionUrlInstance(String connString, Properties info) {if (connString null…

上市公司常見的印章問題契約鎖如何幫您解決?

您知道公司印章的管理和使用是否存在問題?公司內部該如何通過印章問題自查,及時進行風險防治? 印章是上市公司權利的象征,開展“印章管理審查”確保管理和使用合規,也是上市公司內控和監管的一項重要內容。如果存在不合…

S71200通過PROFINET協議和島電數字控制器通訊

項目要求 西門子S71200PLC需要通過PROFINET協議和島電數字控制器(型號:SRS13A)通訊,讀取溫度的測量值PV和設定值SV。 項目實施 采用NET90-PN-MBT(以下簡稱“網關”),它是一款將Modbus TCP/RT…

點擊按鈕,按鈕的文字變為倒計時,的小技巧(適用于獲取驗證碼)

看效果圖&#xff1a; 代碼 <a-buttonclick"getSms":disabled"myState.smsSendFlag"v-text"(!myState.smsSendFlag && 獲取驗證碼) || ${myState.time} s" ></a-button>data(){return {myState: {smsSendFlag: false,tim…

AI數字人的源碼獨立部署就是你創業的起點

隨著AI繪畫、chat gpt的爆火&#xff0c;AI時代開始初露矛頭的話&#xff0c;那么今年&#xff0c;或許真正是我們全面進入AI時代的元年&#xff0c;一個更新的更智能化的時代正以勢不可擋的姿態奔涌而來&#xff01; 晚一步&#xff0c;失去先機&#xff1b;晚一步&#xff0c…

Notepad-- ubuntu下載安裝

Notepad-- ubuntu下載安裝 下載 Gitee鏈接&#xff1a; https://gitee.com/cxasm/notepad– 安裝 sudo apt install *.deb運行 /opt/apps/com.hmja.notepad/files/Notepad--出錯 需要安裝qt5 sudo apt-get install qt5-default

網絡安全入門教程(非常詳細)從零基礎入門到精通

網絡安全是一個龐大而不斷發展的領域&#xff0c;它包含多個專業領域&#xff0c;如網絡防御、網絡攻擊、數據加密等。介紹網絡安全的基本概念、技術和工具&#xff0c;逐步深入&#xff0c;幫助您成為一名合格的網絡安全從業人員。 一、網絡安全基礎知識 1.計算機基礎知識 了解…

微服務簡介

1、什么是微服務 微服務&#xff08;或稱微服務架構&#xff09;是一種云原生架構方法&#xff0c;在單個應用中包含眾多松散耦合且可單獨部署的小型組件或服務。 這些服務通常擁有自己的技術棧&#xff0c;包括數據庫和數據管理模型&#xff1b;通過一個REST API、事件流和消息…

linux上的通用拍照程序

最近因為工作需要&#xff0c;在ubuntu上開發了一個拍照程序。 為了找到合適的功能研究了好幾種實現方式&#xff0c;在這里記錄一下。 目錄 太長不看版 探索過程 v4l2 QT opencv4.2 打開攝像頭 為什么不直接打開第一個視頻節點 獲取所有分辨率 切換攝像頭 太長不看…

七要素微氣象儀氣象數據監測助手

WX-WQX7 隨著科技的發展&#xff0c;氣象預測的準確性已成為人們日常生活的重要參考。而七要素微氣象儀&#xff0c;作為新型的氣象探測設備&#xff0c;以其精細化的數據測量和解析能力&#xff0c;正在改變我們的天氣預測方式。 一、產品介紹 七要素微氣象儀是一款集成了溫…

某投資公司薪酬激勵體系改革項目成功案例紀實

——優化薪酬結構&#xff0c;實現薪酬公平&#xff0c;提高員工工作積極性 【客戶行業】金融行業 【問題類型】薪酬激勵 【客戶背景】 某投資管理公司位于一線城市&#xff0c;是經市人民ZF批準&#xff0c;在2000年左右設立的市直屬綜合性投資公司。主要承擔ZF重大建設項目…

JAVA實現flappy bird游戲

圖片素材 實現代碼 import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.util.Date; import java.text.SimpleDateFormat; i…

飛翔的小鳥游戲

GameApp類 package App;import main.GameFrame;public class GameApp {public static void main(String[] args) {//游戲的入口new GameFrame();} } main Barrier 類 package main;import util.Constant; import util.GameUtil;import java.awt.*; import java.awt.image.Buf…

gitea倉庫鏡像同步至gitlab

1、參考文檔&#xff1a;倉庫鏡像 | Gitea Documentation 2、錯誤一&#xff1a;賬號密碼錯誤問題 解決方法&#xff1a; 出現以上錯誤為第三步用戶名&#xff08;Oauth2應用名稱&#xff09;或者密碼&#xff08;Gitlab個人訪問令牌&#xff09;錯誤。 1&#xff09;如下圖1…

【UE4虛幻】UTexture2D紋理裁剪函數

參數說明&#xff1a; 源2D紋理圖片&#xff1a;UTexture2D* SourceTexture 裁剪區域的左上角&#xff1a;const FVector2D TopLeft 裁剪區域的右下角&#xff1a;const FVector2D BottomRight 返回值是裁剪之后的紋理圖片 UTexture2D* APointProjection::CropPicture(UTextur…

洗地機哪個牌子好用?洗地機選購攻略

傳統的清潔方式都是掃把拖把的結合&#xff0c;既繁瑣也勞累&#xff0c;每次清潔完后還得累的腰酸背痛的&#xff0c;像廚房這種地方甚至會不容易清潔干凈&#xff0c;總感覺地板灰蒙蒙的。洗地機的誕生就很好的解決了這些問題&#xff0c;不用一遍遍的重復掃地拖地擦地&#…

1410. HTML 實體解析器 --力扣 --JAVA

題目 「HTML 實體解析器」 是一種特殊的解析器&#xff0c;它將 HTML 代碼作為輸入&#xff0c;并用字符本身替換掉所有這些特殊的字符實體。 HTML 里這些特殊字符和它們對應的字符實體包括&#xff1a; 雙引號&#xff1a;字符實體為 &quot; &#xff0c;對應的字符是 &qu…

JOSEF約瑟 過電流繼電器 JL15-300/11 觸點形式一開一閉 板前接線

系列型號 JL15-1.5/11電流繼電器JL15-2.5/11電流繼電器 JL15-5/11電流繼電器JL15-10/11電流繼電器 JL15-15/11電流繼電器JL15-20/11電流繼電器 JL15-30/11電流繼電器JL15-40/11電流繼電器 JL15-60/11電流繼電器JL15-80/11電流繼電器 JL15-100/11電流繼電器JL15-150/11電流繼電…