關於packages中多個同名程式(procedure)的呼叫
今天在除錯剛剛接手過來的一個資料的時候,發現其中一個package中有很多同名的procedure, 感到有點奇怪, 萬一程式呼叫 package_name.procedure_name, 它怎麼知道呼叫的是哪個呢 ? 後來查詢才發現,自己讀書不仔細, 在包內可以用同一個名字宣告多個程式,在執行時會根據引數的數目和資料型別呼叫正確的程式。
不過我覺得這樣是不是又會多出幾個步驟,每次呼叫都要掃描這個packages中所有的procedure名稱,看看是否有重複的,然後檢驗呼叫端的引數和packages中幾個相同名稱的procedure的引數數目及型別,選定後才能進行呼叫執行 。 Oracle為什麼還要這樣設計 ?
附 :
------------------------------------------------------------------------------------------------------------------
Oracle 過程(Procedure)、函式(Function)、包(Package)、觸發器(Trigger)
PL/SQL程式塊可背獨立編譯並儲存在資料庫中,任何與資料庫相連線的應用程式都可以訪問這些儲存的PL/SQL程式塊。ORACLE提供了四種型別的可儲存的程式:
過程和函式
過程和函式都以編譯後的形式存放在資料庫中,函式可以沒有引數也可以有多個引數並有一個返回值。過程有零個或多個引數,沒有返回值。函式和過程都可以透過引數列表接收或返回零個或多個值,函式和過程的主要區別不在於返回值,而在於他們的呼叫方式。過程是作為一個獨立執行語句呼叫的:
pay_involume(invoice_nbr,30,due_date);
函式以合法的表示式的方式呼叫:
order_volumn:=open_orders(SYSDATE,30);
建立過程的語法如下:
CREATE [ OR REPLACE] PROCEDURE [schema.]procedure_name [parameter_lister] {AS|IS} 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 {AS|IS} 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 {AS|IS} 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 {AS|IS} private_variable_declarations | private_type_declarations | private_exception_declarations | private_cursor_declarations | function_declarations | procedure_specifications END [package_name] |
私有資料結構是那些在包主體內部,對被呼叫程式而言是不可見的。
觸發器(Triggers)
觸發器是一種自動執行響應資料庫變化的程式。可以設定為在觸發器事件之前或之後觸發或執行。能夠觸發觸發器事件的事件包括下面幾種:
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 {before|after|instead of} event ON {table_or_view_name|DATABASE} [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 TABLE table_name DISABLE ALL TRIGGERS; ALTER TABLE table_name ENABLE ALL TRIGGERS; |
刪除觸發器使用DROP TRIGGER
DROP TRIGGER trigger_name; |
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-696060/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何查詢Procedure, Packages定義中的某些關鍵字 - dba_sourcePackage
- 在程式中定義多個同值不同名的變數變數
- 一個關於支付的SQL-ProcedureSQL
- oracle 中呼叫 store procedureOracle
- 關於js中的this呼叫JS
- 呼叫遠端procedure的2個問題
- Mysql關於procedure、function的詳解MySqlFunction
- C語言關於多原始檔的呼叫C語言
- 一個關於SessionBean呼叫的問題。SessionBean
- 一個例項中,多個synchronized方法的呼叫synchronized
- oracle sqr之多個procedure過程變數傳遞及同名變數定義Oracle變數
- 使用call在sqlplus中呼叫procedure和funtion!SQL
- 關於多維程式的思考 (轉)
- 一個關於值傳遞呼叫的問題
- CompletableFuture中實現多個 REST 呼叫REST
- plsql中的procedure和function程式設計SQLFunction程式設計
- 請看程式碼(關於JAVA的遞迴呼叫)Java遞迴
- 關於c#多執行緒中的幾個訊號量C#執行緒
- PLSQL 呼叫 返回 遊標(Cursor)PROCEDURESQL
- 關於 Python 多執行緒/多程式Python執行緒
- SQL中關於NULL的程式碼SQLNull
- 在SQL Developer中Debug一個procedureSQLDeveloper
- 關於jsp呼叫ejb出錯的jsp程式如下JS
- Java程式設計思想中關於閉包的一個例子Java程式設計
- 關於一個java專案呼叫另一個java專案的心得Java
- 兩個目錄中,刪除其中一個目錄中同名檔案的做法
- 每日一個 Golang PackagesGolangPackage
- 找到procedure中reference的物件物件
- 關於一臺電腦使用多個GitHub賬戶管理程式碼的記錄Github
- 請教一個關於JAVA SOCKET程式設計中的問題Java程式設計
- mybatis3呼叫瀚高procedure報錯MyBatisS3
- 關於爛程式碼的那些事(中)
- phpcmsV9呼叫多個模型中的最新內容的解決方法PHP模型
- Qt中多個原始檔中呼叫同一引數或物件等QT物件
- 關於非同步介面呼叫的疑問?非同步
- 關於Corba呼叫的Timeout 問題ORB
- python中怎麼呼叫另一個程式Python
- mysql procedure 中 repeat &cursor 的用法。MySql