亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Oracle > 正文

Oracle PL/SQL語言初級教程之過程和函數

2024-08-29 13:50:02
字體:
來源:轉載
供稿:網友
  過程和函數

  過程和函數都以編譯后的形式存放在數據庫中,函數可以沒有參數也可以有多個參數并有一個返回值。過程有零個或多個參數,沒有返回值。函數和過程都可以通過參數列表接收或返回零個或多個值,函數和過程的主要區別不在于返回值,而在于他們的調用方式。過程是作為一個獨立執行語句調用的:

pay_involume(invoice_nbr,30,due_date);

  函數以合法的表達式的方式調用:

order_volumn:=open_orders(SYSDATE,30);

  創建過程的語法如下:

CREATE [ OR REPLACE] PROCEDURE [schema.]procedure_name
[parameter_lister]
{ASIS}
declaration_section
BEGIN
executable_section
[EXCEPTION
exception_section]
END [procedure_name]

  每個參數的語法如下:

paramter_name mode datatype [(:=DEFAULT) value]

  mode有三種形式:IN、OUT、INOUT。

  IN表示在調用過程的時候,實際參數的取值被傳遞給該過程,形式參數被認為是只讀的,當過程結束時,控制會返回控制環境,實際參數的值不會改變。

  OUT在調用過程時實際參數的取值都將被忽略,在過程內部形式參數只能是被賦值,而不能從中讀取數據,在過程結束后形式參數的內容將被賦予實際參數。

  INOUT這種模式是IN和OUT的組合;在過程內部實際參數的值會傳遞給形式參數,形勢參數的值可讀也可寫,過程結束后,形勢參數的值將賦予實際參數。

  創建函數的語法和過程的語法基本相同,唯一的區別在于函數有RETUREN子句

CREATE [ OR REPLACE] FINCTION [schema.]function_name
[parameter_list]
RETURN returning_datatype
{ASIS}
declaration_section
BEGIN
executable_section
[EXCEPTION]
exception_section
END [procedure_name]

  在執行部分函數必須有喲個或多個return語句。

  在創建函數中可以調用單行函數和組函數,例如:

CREATE OR REPLACE FUNCTION my_sin(DegreesIn IN NUMBER)
RETURN NUMBER
IS
pi NUMBER=ACOS(-1);
RadiansPerDegree NUMBER;

BEGIN
RadiansPerDegree=pi/180;
RETURN(SIN(DegreesIn*RadiansPerDegree));
END
  包

  包是一種將過程、函數和數據結構捆綁在一起的容器;包由兩個部分組成:外部可視包規范,包括函數頭,過程頭,和外部可視數據結構;另一部分是包主體(package body),包主體包含了所有被捆綁的過程和函數的聲明、執行、異常處理部分。

  打包的PL/SQL程序和沒有打包的有很大的差異,包數據在用戶的整個會話期間都一直存在,當用戶獲得包的執行授權時,就等于獲得包規范中的所有程序和數據結構的權限。但不能只對包中的某一個函數或過程進行授權。包可以重載過程和函數,在包內可以用同一個名字聲明多個程序,在運行時根據參數的數目和數據類型調用正確的程序。

  創建包必須首先創建包規范,創建包規范的語法如下:

CREATE [OR REPLACE] PACKAGE package_name
{ASIS}
public_variable_declarations
public_type_declarations
public_exception_declarations
public_cursor_declarations
function_declarations
procedure_specifications
END [package_name]

  創建包主體使用CREATE PACKAGE BODY語句:

CREATE [OR REPLACE] PACKAGE BODY package_name
{ASIS}
private_variable_declarations
private_type_declarations
private_exception_declarations
private_cursor_declarations
function_declarations
procedure_specifications
END [package_name]

  私有數據結構是那些在包主體內部,對被調用程序而言是不可見的。

  觸發器(Triggers)

  觸發器是一種自動執行響應數據庫變化的程序??梢栽O置為在觸發器事件之前或之后觸發或執行。能夠觸發觸發器事件的事件包括下面幾種:

  DML事件
  DDL事件
  數據庫事件

  DML事件觸發器可以是語句或行級觸發器。DML語句觸發器在觸發語句之前或之后觸發DML行級觸發器在語句影響的行變化之前或之后觸發。用戶可以給單一事件和類型定義多個觸發器,但沒有任何方法可以增強多觸發器觸發的命令。下表列出了用戶可以利用的觸發器事件:

事件觸發器描述
INSERT 當向表或視圖插入一行時觸發觸發器
UPDATE 更新表或視圖中的某一行時觸發觸發器
DELETE從表或視圖中刪除某一行時觸發觸發器
CREATE當使用CREATE語句為數據庫或項目增加一個對象時觸發觸發器
ALTER當使用ALTER語句為更改一個數據庫或項目的對象時觸發觸發器
DROP當使用DROP語句刪除一個數據庫或項目的對象時觸發觸發器
START打開數據庫時觸發觸發器,在事件后觸發
SHUTDOWN 關閉數據庫時觸發,事件前觸發
LOGON當一個會話建立時觸發,事件前觸發
LOGOFF當關閉會話時觸發,事件前觸發
SERVER服務器錯誤發生時觸發觸發器,事件后觸發

  創建觸發器的語法如下:

CREATE [OR REPLACE] TRIGGER trigger_name
{beforeafterinstead of} event
ON {table_or_view_nameDATABASE}
[FOR EACH ROW[WHEN condition]]
trigger_body

  只有DML觸發器(INSERT、UPDATE、DELETE)語句可以使用INSTEAD OF觸發器并且只有表的DML觸發器可以是BEFORE或AFTER觸發器。

  象約束一樣觸發器可以被設置為禁用或啟用來關閉或打開他們的執行體(EXECUTE),將觸發器設置為禁用或啟用使用ALTER TRIGGER語句:

ALTER TRIGGER trigger_name ENABLE;
ALTER TRIGGER trigger_name DISABLE;

  要禁用或啟用表的所有觸發器,使用ALTER TABLE語句

ALTER TRIGGER table_name DISABLE ALL TRIGGER;
ALTER TRIGGER table_name ENABLE ALL TRIGGER;

  刪除觸發器使用DROP TRIGGER

DROP TRIGGER trigger_name;

  數據字典

  Oracle數據字典包含了用戶數據庫的元數據。帶下劃線的表名稱中帶OBJ$、UET$、SOURCE$,這些表是在執行CREATE DATABASE語句期間由sql.bsq腳本創建的,一般情況下用戶很少訪問這些表。腳本catalog.sql(通常位于$oracle_home/rdbms/admin)在CREATE DATABASE語句之后立即運行,創建數據字典視圖。

  數據字典視圖大致可以分為三類:

  .前綴為USER_的數據字典視圖,包含了用戶擁有的對象的信息。

  .前綴為ALL_的數據字典視圖,包含了用戶當前可以訪問的全部對象和權限的信息。

  .前綴為DBA_的數據字典視圖,包含了數據庫擁有的所有對象和權限的信息。

  在絕大多數數據字典視圖中都有象DBA_TABLES,ALL_TABLES和USER_TABLES這樣的視圖家族。Oracle中有超過100個視圖家族,所以要全面介紹這些視圖家族是單調乏味的而且沒有多大的意義。在下表中列出了最重要和最常用的視圖家族,需要注重的是每個視圖家族都有一個DBA_,一個ALL_一個USER_視圖。

視圖家族(View Family)描述
COL_PRIVS包含了表的列權限,包括授予者、被授予者和權限
EXTENTS 數據范圍信息,比如數據文件,數據段名(segment_name)和大小
INDEXES索引信息,比如類型、唯一性和被涉及的表
IND_COLUMNS 索引列信息,比如索引上的列的排序方式
OBJECTS 對象信息,比如狀態和DDL time
ROLE_PRIVS角色權限,比如GRANT和ADMIN選項
SEGMENTS 表和索引的數據段信息,比如tablespace和storage
SEQUECNCES序列信息,比如序列的cache、cycle和ast_number
SOURCE 除觸發器之外的所有內置過程、函數、包的源代碼
SYNONYMS 別名信息,比如引用的對象和數據庫鏈接db_link
SYS_PRIVS 系統權限,比如grantee、privilege、admin選項
TAB_COLUMNS 表和視圖的列信息,包括列的數據類型
TAB_PRIVS 表權限,比如授予者、被授予者和權限
TABLES表信息,比如表空間(tablespace),存儲參數(storage parms)和數據行的數量
TRIGGERS 觸發器信息,比如類型、事件、觸發體(trigger body)
USERS用戶信息,比如臨時的和缺省的表空間
VIEWS視圖信息,包括視圖定義

  在Oracle中還有一些不常用的數據字典表,但這些表不是真正的字典家族,他們都是一些重要的單一的視圖。

VIEW NAME描述
USER_COL_PRIVS_MADE用戶授予他人的列權限
USER_COL_PRIVS_RECD 用戶獲得的列權限
USER_TAB_PRIVS_MADE 用戶授予他人的表權限
USER_TAB_PRIVS_RECD用戶獲得的表權限

  其他的字典視圖中主要的是V$視圖,之所以這樣叫是因為他們都是以V$或GV$開頭的。V$視圖是基于X$虛擬視圖的。V$視圖是SYS用戶所擁有的,在缺省狀況下,只有SYS用戶和擁有DBA系統權限的用戶可以看到所有的視圖,沒有DBA權限的用戶可以看到USER_和ALL_視圖,但不能看到DBA_視圖。與DBA_,ALL,和USER_視圖中面向數據庫信息相反,這些視圖可視的給出了面向實例的信息。

   在大型系統上化幾周時間手工輸入每一條語句

   手工輸入帶用戶名變量的語句,然后再輸入每一個用戶名,這需要花好幾個小時的時間

   寫一條SQL語句,生成需要的ALTER USER語句,然后執行他,這只需要幾分鐘時間

  很明顯我們將選擇生成SQL的方法:

  例:

SELECT 'ALTER USER'username
'TEMPORARY TABLESPACE temp;'
FROM DBA_USERS
WHERE username<>'SYS'
AND temporary_tablespace<>'TEMP';

  這個查詢的結果將被脫機處理到一個文件中,然后在執行:

ALTER USER SYSTEM TEMPORARY TABLESPACE temp;
ALTER USER OUTLN TEMPORARY TABLESPACE temp;
ALTER USER DBSNMP TEMPORARY TABLESPACE temp;
ALTER USER SCOTT TEMPORARY TABLESPACE temp;
ALTER USER DEMO TEMPORARY TABLESPACE temp;


上一篇:Oracle PL/SQL語言初級教程之表和視圖

下一篇:Oracle PL/SQL語言初級教程之操作和控制語言

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91免费电影网站| 精品人伦一区二区三区蜜桃免费| 久久亚洲国产成人| 国产日韩欧美中文在线播放| 国产精品一区久久久| 91情侣偷在线精品国产| 日韩视频在线观看免费| 亚洲免费精彩视频| 成人有码在线视频| 国产精品丝袜视频| 欧美黑人国产人伦爽爽爽| 亚洲va电影大全| 色综合色综合久久综合频道88| 久久精品国产清自在天天线| 菠萝蜜影院一区二区免费| 成人网中文字幕| 国产精品免费一区| 色综合久久天天综线观看| 国产日韩一区在线| 岛国av一区二区| 欧美视频中文字幕在线| 亚洲精品免费一区二区三区| 伦伦影院午夜日韩欧美限制| 亚洲欧美综合v| 亚洲国产天堂久久国产91| 精品网站999www| 国产一区二区在线播放| 国产成人精品在线| 另类少妇人与禽zozz0性伦| 久热精品视频在线免费观看| 国产日韩精品电影| 亚洲第一页自拍| 欧美日韩在线观看视频小说| 日韩久久精品成人| 成人黄色av网站| 韩国视频理论视频久久| 热re99久久精品国产66热| 久久国产精品免费视频| 色天天综合狠狠色| xvideos成人免费中文版| 日本伊人精品一区二区三区介绍| 久久久久久久久久久av| 久久av红桃一区二区小说| 欧美精品性视频| 成人h视频在线观看播放| 国产日韩一区在线| 久久精品一区中文字幕| 日韩美女写真福利在线观看| 亚洲人午夜色婷婷| 伊人青青综合网站| 久久精品视频一| 成人网在线免费看| 69久久夜色精品国产7777| 亚洲欧美日韩成人| 国产suv精品一区二区三区88区| 国产精品久久久久久久久久99| 成人情趣片在线观看免费| xxx一区二区| 97视频免费观看| 亚洲jizzjizz日本少妇| 亚洲第一av网| 欧美xxxx14xxxxx性爽| 国产日产欧美a一级在线| 7777精品久久久久久| 国产精品久久久久国产a级| 欧美激情视频免费观看| 中文字幕亚洲自拍| 色在人av网站天堂精品| 亚洲欧美成人精品| 亚洲国内高清视频| 久久噜噜噜精品国产亚洲综合| 国产97人人超碰caoprom| 日本一欧美一欧美一亚洲视频| 欧美丰满少妇xxxx| 在线中文字幕日韩| 成人444kkkk在线观看| 日韩精品久久久久| 亚洲自拍中文字幕| 成人女保姆的销魂服务| 亚洲国产另类久久精品| 疯狂做受xxxx高潮欧美日本| 日韩在线视频免费观看| 欧美亚洲成人精品| 国产日韩欧美日韩大片| 91九色单男在线观看| 欧美日韩高清在线观看| 91嫩草在线视频| 国产精品视频成人| 国产福利精品视频| 亚洲国产精品电影| 亚洲免费伊人电影在线观看av| 亚洲www在线| 欧美伊久线香蕉线新在线| 久久久精品视频在线观看| 欧美成人精品xxx| 国产精品香蕉在线观看| 在线观看国产精品淫| 欧美性高潮床叫视频| 欧美孕妇与黑人孕交| 国产一区二区三区网站| 北条麻妃久久精品| 久久久亚洲天堂| 69精品小视频| 91精品在线国产| 福利一区视频在线观看| 国产精品久久在线观看| 亚洲综合第一页| 一本色道久久88亚洲综合88| 97久久精品人人澡人人爽缅北| 国产精品激情av电影在线观看| 奇米四色中文综合久久| 欧美肥婆姓交大片| 91精品国产自产在线观看永久| 国产a∨精品一区二区三区不卡| 日韩激情在线视频| 日韩成人中文电影| 国产成人高清激情视频在线观看| 久久精品视频在线播放| 91夜夜未满十八勿入爽爽影院| 国产精品欧美在线| 国产精品一香蕉国产线看观看| 欧美日韩在线视频观看| 午夜精品久久久久久久99热浪潮| 中文字幕成人在线| 性金发美女69hd大尺寸| 欧美黄色片视频| 国产成人精品久久久| 亚洲一区二区日本| 亚洲aaa激情| 亚洲成**性毛茸茸| 日韩av在线网页| 亚洲乱码一区二区| 欧美激情免费观看| 国产亚洲aⅴaaaaaa毛片| 国产精品第一视频| 久久久噜噜噜久久| 欧美性猛交xxxx免费看| 久热精品视频在线免费观看| 美日韩精品免费视频| 亚洲午夜国产成人av电影男同| 久久视频免费观看| 欧美寡妇偷汉性猛交| 亚洲美女动态图120秒| 国产成人精品av在线| 国产精品日韩在线一区| 91久久久精品| 国产成人亚洲综合91精品| 久久伊人精品天天| 欧美亚洲另类制服自拍| 国产精品久久久亚洲| 国产成人福利视频| 欧美久久精品一级黑人c片| 国产91久久婷婷一区二区| 久久婷婷国产麻豆91天堂| 欧美极品少妇xxxxⅹ喷水| 夜色77av精品影院| 成人中文字幕在线观看| 国产精品一区二区三区免费视频| 一本一道久久a久久精品逆3p| 欧美午夜xxx| 欧美性生交xxxxxdddd| 成人黄色免费片| 国产一区二区三区高清在线观看| 国产日韩亚洲欧美|