oracle 包的管理

在PL/SQL程序開發中,為了方便實現模塊化程序的管理,可以將PL/SQL元素(如存儲過程、函數、變量、常量、自定義數據類型、游標等)根據模塊的程序結構組織在一起,存放在一個包中,稱為一個完整的單元,并在編譯之后存儲在數據庫服務器中,作為一種全局結構,供應用程序調用。
在Oracle數據庫中,包有兩類,一類是系統內置的包,每個包實現特定的應用過程、函數、常量等的集合,如DBMS_OUTPUT.put_line()就是調用了DBMS_OUTPUT包中的put_line()函數;
另一類是根據應用需要由用戶創建的包。
包由包規范(specification)和包體(body)兩部分組成,在數據庫中獨立存儲。包的創建包括包規范和包體的創建。
2.包的創建和應用

  1. 包的創建
    創建包規范的格式如下:
    CREATE [OR REPLACE] PACKAGE 包名稱IS|AS
    元素名稱定義(類型、變量、存儲過程、函數、游標、異常等)
    END [包名稱];
    元素聲明的順序可以是任意的,但必須先聲明再使用。過程和函數只聲明,不進行具體的實現。
    包體負責包規范中定義的函數或存儲過程的具體代碼實現,如果在包體中定義了包規范中沒有的元素,則此部分元素將被設置為私有訪問,只能由同一包中的函數或存儲過程使用。此外只有在包規范已經創建的條件下,才可以創建包體,如果包規范中不包含任何函數或存儲過程,則可以不創建包體。
    創建包體的格式如下:
    CREATE [OR REPLACE] PACKAGE BODY 包名稱IS|AS
    元素結構實現;
    END [包名稱];

    在創建包體時需要注意:
    包體中的名稱應與包規范中的包名稱保持一致。
    包體中存儲過程和函數的聲明格式必須與包規范中的聲明完全一致。
    包的調用格式如下:
    begin
    pkg_demo.proc_insert_users(‘2022-1-5’,‘yyyy-mm-dd’);
    pkg_demo.proc_update_users(‘2022-10-5’,‘yyyy-mm-dd’);
    end;

【例7-15】創建一個包,該包中包括一個存儲過程PRINT_ENAME,在包體中使用存儲過程實現輸出文字的功能,然后在建立存儲過程調用該包。
具體代碼如下:

—創建包規范
create or replace package EMPLOYEE_PKG
as
procedure PRINT_ENAME;
end EMPLOYEE_PKG;
—創建包體
CREATE OR REPLACE PACKAGE BODY employee_pkg as
Procedure print_ename is
Begin
Dbms_output.put_line(‘我們一定要學習好數據庫’);
End print_ename;
End employee_pkg;

—創建調用該包

CREATE OR REPLACE Procedure callEMPLOYEEPKG
as
begin

EMPLOYEE_PKG.PRINT_ENAME;

End callEMPLOYEEPKG;

執行后,如圖7-23所示。
在這里插入圖片描述

圖7-23執行計算職工年薪函數

2)包的持續性
在包規范中,所有聲明的元素都具有全局作用域,元素的值在整個用戶會話期間將一直存在,因此在用戶會話期間,元素可以在應用程序各個部分的代碼中被引用。每個用戶會話都會維護屬于自己會話的元素的副本,用戶之間的元素互不干擾。這種在用戶會話期間元素值和狀態的持續性被稱為包的持續性。包的持續性具體可以體現在包中變量的持續性和游標持續性上。

變量的持續性是指,當用戶調用包時,系統會為每個調用者創建屬于該用戶的變量副本,并在用戶的整個會話期間持續存在。包變量對當前會話用戶是私有的。
【例7-16】在test用戶下創建一個包,該包中包括變量 pkgvar,設置該變量初始值為0。建立存儲過程proc_set_var重新給該變量賦值,然后在建立函數fun_get_var 調用包pkgvar。
登錄scott用戶,在該用戶下調用存儲過程proc_set_var給變量賦值為10,查詢變量 pkgvar
的值。登錄sy 用戶,在該用戶下調用存儲過程proc_set_var給變量賦值為20,在scott下查詢變量 pkgvar的值。
本例中兩個不同用戶同時對一個包變量進行存取操作,通過變量值驗證包變量在用戶會話期間的持續性。
創建包含變量的包,存儲過程代碼如下:
create or replace package pkg_varas
pkgvar number:=0;
end pkg_var;
–創建設置變量值的存儲過程
create or replace procedure proc_set_var(p_var number)as
begin
pkg_var.pkgvar:=p_var;
end proc_set_var;
創建獲取包變量值的函數,代碼如下:
create or replace function fun_get_var return number
As
begin
return pkg_var.pkgvar;
end fun_get_var;
登錄scott 用戶,調用存儲過程后,查詢函數中變量的值,代碼如下:
Connect scott/tiger@ ;
EXECUTE proc_set_var(10);
Select fun_ get_var FROM dual ;
執行后,如圖7-24所示。
在這里插入圖片描述

圖7-24查看變量的值

由上述結果可以看出,此時包變量的值為10。接下來通過用戶 sys啟動另一個 SQL * Plus 窗口,此時訪問testt用戶下包變量的值仍為初始值0,然后重新設置包變量值為20,代碼如下:
登錄到sys用戶,查看變量的值
Connect sys/sjk@orcl;
–給變量賦值為20
EXECUTE proc_set_var(20);

Select fun_get_var from dual;

接下來回到scott用戶下,此時再次查詢包變量的值,會發現包變量仍為10,并沒有受 用戶操作的影響,
3)使用數據字典,查看包
通過查詢數據字典視圖user_objects、user_source查看當前用戶的所有包規范、包體,具體代碼如下:
select object_type,object_name,status from user_objectswhere object_type in (‘PACKAGE’,‘PACKAGE BODY’);
執行后如圖7-25所示。
在這里插入圖片描述

圖7-25查看包的基本信息

4)重新編譯包
包的重新編譯包括對包規范和包體整體進行重新編譯或者分別進行重新編譯。其語法如下:
alter package 包名稱 compile;
alter package 包名稱 compile specification;
alter package 包名稱 compile body;

COMPILE表示重新編譯包規范和包體。
COMPILE SPECIFICATION 表示重新編譯包規范。
COMPILE BODY表示重新編譯包體。
分別重新編譯包規范和包體
alter package pkg_varas compile specification;
alter package pkg_varas compile body;
5)刪除包
當不需要使用定義的包規范或包時,用戶可以使用刪除整個包,也可以只刪除包體。
刪除包格式如下:
drop package 包的名稱;
刪除包規范的同時會將其對應的包體一起刪除。
6)系統常用包
在Oracle中,除了可以使用用戶創建的包外,還可以利用Oracle系統所提供的開發部進行代碼的編寫,方便應用程序的開發。下述是幾個常用的系統包:
dbms_output包:是最常用的一個系統包 。
dbms_output.put_line()函數就是其中的一個子程序。
dbms_alter包:用于數據庫報警,允許會話間通信。
dbms_job包:用于任務調度服務。
dbms_lob包:用于處理大對象操作。
dbms_pipe包:用于數據庫管道,允許會話間通信。
dbms_sql包:用于執行動態SQL。
utl_file包:用于文件的輸入輸出。
除了utl_file包存儲在服務器和客戶端外,其他的包均存儲在服務器中。

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

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

相關文章

LINUX 5 cat du head tail wc 計算機拓撲結構 計算機網絡 服務器 計算機硬件

計算機網絡 計算機拓撲結構 計算機按性能指標分:巨型機、大型機、小型機、微型機。大型機、小型機安全穩定,小型機用于郵件服務器 Unix系統。按用途分:專用機、通用機 計算機網絡:局域網‘、廣域網 通信協議’ 計算機終端、客戶端…

從零開始的圖論講解(1)——圖的概念,圖的存儲,圖的遍歷與圖的拓撲排序

目錄 前言 圖的概念 1. 頂點和邊 2. 圖的分類 3. 圖的基本性質 圖的存儲 鄰接矩陣存圖 鄰接表存圖 圖的基本遍歷 拓撲排序 拓撲排序是如何寫的呢? 1. 統計每個節點的入度 2. 構建鄰接表 3. 將所有入度為 0 的節點加入隊列 4. 不斷彈出隊頭節點,更新其…

強化學習Q-Learning:DQN

強化學習Q-Learning/DQN 本文是一篇學習筆記,主要參考李宏毅老師的強化學習課程。 目前主流的強化學習方法大致可以分為 policy-based 和 value-based 兩大類。之前我們介紹的 policy gradient 策略梯度,就是 policy-based 的方法。本文要介紹的 Q-learn…

W公司云安全解決方案

1 安全理念DevOpvSec 統一安全運營 2 安全責任分層模型 3 云安全產品線 4 云安全解決方案/部署架構 5 安全能力 6 信創云平臺適配 7 統一化安全運營 利用云安全平臺實現統一的安全運維 8 安全資源池的統一納管 9 案例分享:私有云 10 云安全解決方案的衍生特點 11 …

python中的in關鍵字查找的時間復雜度

列表(List) 對于列表來說, in 運算符的復雜度是 O(n),其中n是列表的長度。這意味著如果列表中有n個元素,那么執行 in 運算符需要遍歷整個列表來查找目標元素。 以下是一個示例,演示了在列表中使用 in 運算…

MySQL基礎 [一] - Ubuntu版本安裝

目錄 預安裝 先查看自己操作系統的版本 添加MySQL APT下載源 下載 安裝 正式安裝 查看MySQL狀態 打開MySQL 預安裝 先查看自己操作系統的版本 lsb_release -a 添加MySQL APT下載源 下載 下載發布包 下載地址 : https://dev.mysql.com/downloads/repo/apt/ 這里下…

Springboot整合Mybatis+Maven+Thymeleaf學生成績管理系統

前言 該系統為學生成績管理系統,可以當作學習參考,也可以成為Spirng Boot初學者的學習代碼! 系統描述 學生成績管理系統提供了三種角色:學生,老師,網站管理員。主要實現的功能如下: 登錄 &a…

操作系統之文件系統

🧑 博主簡介:CSDN博客專家,歷代文學網(PC端可以訪問:https://literature.sinhy.com/#/literature?__c1000,移動端可微信小程序搜索“歷代文學”)總架構師,15年工作經驗,…

AG32:MCU和CPLD如何交互?

本文檔介紹了AG32開發中,MCU與CPLD交互的具體方式以及例子。如需了解AG32更多資料可發郵件:salesagm-micro.com 一、MCU和CPLD直接交互 cpld工程創建及編譯的操作流程,參考文檔《AG32下fpga和cpld的使用入門》 在工程中,用戶邏輯…

機器人軌跡跟蹤控制——CLF-CBF-QP

本次使用MATLAB復現CLF-CBF-QP算法,以實現機器人軌跡跟蹤同時保證安全性能 模型 使用自行車模型來進行模擬機器人的移動動態,具體的模型推導參考車輛運動學模型-自行車模型 采用偏差變量 p ~ = p ? p r e f u ~ = u ? u r e f \tilde{p} = p - p_{ref} \\ \tilde{u} = …

009_抽象類和接口

抽象類和接口 final關鍵字常量 單例模式(設計模式)枚舉類抽象類抽象類的注意事項、特點使用抽象類的好處模版方法設計模式 接口接口的好處接口的注意事項 final關鍵字 final關鍵字是最終的意思,可以修飾類、方法、變量。 修飾類:…

新潮透明液體水珠水滴失真故障扭曲折射特效海報字體標題設計ps樣機動作素材 Bubble Photoshop Templates

只需單擊幾下即可創建引人注目的視覺效果!您需要做的就是將您的文本或圖像放入智能對象中并應用作。 包中包含: 15 個靜態 Photoshop 模板(PS 2019 及更高版本) 01-05 垂直布局 (22504000)06-10 水平布局…

Android DiaLog全屏設置,帶有叉號的彈窗,這個彈窗分為兩個部分,一個是主體,另一個是關閉部分。自定義布局彈窗

1.先上圖。要實現的效果圖。 2.這是我自己實現的效果圖,是不是跟效果圖一摸一樣 來看看整體效果 3.我把自己實現的效果圖的代碼寫出來。如下就是我的代碼 3.1首先是MainActivity類 import androidx.appcompat.app.AppCompatActivity;import android.app.Alert…

NVR接入錄像回放平臺用EasyCVR打造地下車庫安防:大型商居安全優選方案

一、背景分析 隨著居民生活品質的提升,大型商業建筑和住宅小區紛紛配套建設地下停車庫。但是地下車庫盜竊、失火、惡意毀壞車輛、外部人員隨意進出等事件頻發,部署視頻監控系統成為保障地下車庫的安全關鍵舉措。 目前,很多商業和住宅都會在…

階段測試 【過程wp】

分享總結: 回顧起來,真的感慨很多呀。看著并不難啊,但難的是解題思維:如何判斷該頁面的關鍵點,快速地確定問題的核心,找到對應的解決方法。達到便捷、高效的得到結果。我們做了整整近七個半小時。在這個過程中,我發現自己的思維鈍化,不太能自主高效地劃分判斷漏洞類型,…

【C++】<STL部分>:STL標準模板庫概要

STL(standard template libaray-標準模板庫),是C標準庫的重要組成部分,包含了很多常用的數據結構和算法。 在我們學習了模板的之后,再來看STL,就能知道它是C標準庫中的模板類和模板函數的集合,作為可復用的庫大大提高…

從傳遞函數到PID控制器

在過程控制中,按偏差的比例(P,Proportional)、積分(I,Integral)和微分(D,Differential)進行控制的PID控制器(亦稱PID調節器)是應用最為…

【PVR Review】《A Review of Palmar Vein Recognition》

[1]張秀峰,牛選兵,王偉,等.掌靜脈識別研究綜述[J].大連民族大學學報,2020,22(01):33-37.DOI:10.13744/j.cnki.cn21-1431/g4.2020.01.007. 文章目錄 1、背景2、手掌靜脈識別方法2.1、傳統手掌靜脈圖像識別方法2.2、基于深度學習的掌靜脈圖像識別 3、手掌靜脈識別難點 1、背景 目…

vector復制耗時

CPP中的vector對象在傳參給子函數時&#xff0c;如果直接傳參&#xff0c;會造成復制給形參的額外耗時 如何解決這個問題呢&#xff1f; 這樣定義局部函數 const vector <int>&vec可以保證傳遞vector對象時使用地址傳遞&#xff0c;并且使用const保證vector不被改變…

算法思想之雙指針

文章目錄 雙指針字符串序列判定字符串所有整數最小和服務交換接口失敗率分析分披薩最多團隊 雙指針 雙指針是指在解決問題時使用兩個指針&#xff0c;通常分別指向數組或字符串中的不同位置&#xff0c;通過移動這兩個指針來解決問題的一種技巧。雙指針技巧常用于解決數組、鏈…