存储过程详解
存儲(chǔ)過程(Stored Procedure)是在大型數(shù)據(jù)庫系統(tǒng)中,一組為了完成特定功能的SQL 語句集,經(jīng)編譯后存儲(chǔ)在數(shù)據(jù)庫中,用戶通過指定存儲(chǔ)過程的名字并給出參數(shù)(如果該存儲(chǔ)過程帶有參數(shù))來執(zhí)行它。
編輯本段存儲(chǔ)過程概述
在大型數(shù)據(jù)庫系統(tǒng)中,存儲(chǔ)過程和觸發(fā)器具有很重要的作用。無論是存儲(chǔ)過程還是觸發(fā)器,都是SQL 語句和流程控制語句的集合。就本質(zhì)而言,觸發(fā)器也是一種存儲(chǔ)過程。存儲(chǔ)過程在運(yùn)算時(shí)生成執(zhí)行方式,所以,以后對(duì)其再運(yùn)行時(shí)其執(zhí)行速度很快。SQL Server 2005 不僅提供了用戶自定義存儲(chǔ)過程的功能,而且也提供了許多可作為工具使用的系統(tǒng)存儲(chǔ)過程。編輯本段存儲(chǔ)過程的種類
1系統(tǒng)存儲(chǔ)過程
以sp_開頭,用來進(jìn)行系統(tǒng)的各項(xiàng)設(shè)定.取得信息.相關(guān)管理工作。2本地存儲(chǔ)過程
用戶創(chuàng)建的存儲(chǔ)過程是由用戶創(chuàng)建并完成某一特定功能的存儲(chǔ)過程,事實(shí)上一般所說的存儲(chǔ)過程就是指本地存儲(chǔ)過程。3臨時(shí)存儲(chǔ)過程
分為兩種存儲(chǔ)過程: 一是本地臨時(shí)存儲(chǔ)過程,以井字號(hào)(#)作為其名稱的第一個(gè)字符,則該存儲(chǔ)過程將成為一個(gè)存放在tempdb數(shù)據(jù)庫中的本地臨時(shí)存儲(chǔ)過程,且只有創(chuàng)建它的用戶才能執(zhí)行它; 二是全局臨時(shí)存儲(chǔ)過程,以兩個(gè)井字號(hào)(##)號(hào)開始,則該存儲(chǔ)過程將成為一個(gè)存儲(chǔ)在tempdb數(shù)據(jù)庫中的全局臨時(shí)存儲(chǔ)過程,全局臨時(shí)存儲(chǔ)過程一旦創(chuàng)建,以后連接到服務(wù)器的任意用戶都可以執(zhí)行它,而且不需要特定的權(quán)限。4遠(yuǎn)程存儲(chǔ)過程
在SQL Server2005中,遠(yuǎn)程存儲(chǔ)過程(Remote Stored Procedures)是位于遠(yuǎn)程服務(wù)器上的存儲(chǔ)過程,通常可以使用分布式查詢和EXECUTE命令執(zhí)行一個(gè)遠(yuǎn)程存儲(chǔ)過程。5 擴(kuò)展存儲(chǔ)過程
擴(kuò)展存儲(chǔ)過程(Extended Stored Procedures)是用戶可以使用外部程序語言編寫的存儲(chǔ)過程,而且擴(kuò)展存儲(chǔ)過程的名稱通常以xp_開頭。編輯本段基本語法
[1]一.創(chuàng)建存儲(chǔ)過程 create procedure sp_name @[參數(shù)名] [類型],@[參數(shù)名] [類型] as begin ......... end 以上格式還可以簡寫成: create proc sp_name @[參數(shù)名] [類型],@[參數(shù)名] [類型] as begin ......... end /*注:“sp_name”為需要?jiǎng)?chuàng)建的存儲(chǔ)過程的名字,該名字不可以以阿拉伯?dāng)?shù)字開頭*/ 二.調(diào)用存儲(chǔ)過程 1.基本語法:exec sp_name [參數(shù)名] 三.刪除存儲(chǔ)過程 1.基本語法: drop procedure sp_name 2.注意事項(xiàng) (1)不能在一個(gè)存儲(chǔ)過程中刪除另一個(gè)存儲(chǔ)過程,只能調(diào)用另一個(gè)存儲(chǔ)過程 四.其他常用命令 1.show procedure status 顯示數(shù)據(jù)庫中所有存儲(chǔ)的存儲(chǔ)過程基本信息,包括所屬數(shù)據(jù)庫,存儲(chǔ)過程名稱,創(chuàng)建時(shí)間等 2.show create procedure sp_name 顯示某一個(gè)mysql存儲(chǔ)過程的詳細(xì)信息 3、exec sp_helptext sp_name 顯示你這個(gè)sp_name這個(gè)對(duì)象創(chuàng)建文本編輯本段格式
CREATE PROCEDURE [擁有者.]存儲(chǔ)過程名[;程序編號(hào)] sql中的存儲(chǔ)過程及相關(guān)介紹 [(參數(shù)#1,…參數(shù)#1024)] [WITH {RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION} ] [FOR REPLICATION] AS 程序行 其中存儲(chǔ)過程名不能超過128個(gè)字。每個(gè)存儲(chǔ)過程中最多設(shè)定1024個(gè)參數(shù) (SQL Server 7.0以上版本),參數(shù)的使用方法如下: @參數(shù)名 數(shù)據(jù)類型[VARYING] [=內(nèi)定值] [OUTPUT] 每個(gè)參數(shù)名前要有一個(gè)“@”符號(hào),每一個(gè)存儲(chǔ)過程的參數(shù)僅為該程序內(nèi)部使用,參數(shù)的類型除了IMAGE外,其他SQL Server所支持的數(shù)據(jù)類型都可使用。 [=內(nèi)定值]相當(dāng)于我們?cè)诮?shù)據(jù)庫時(shí)設(shè)定一個(gè)字段的默認(rèn)值,這里是為這個(gè)參數(shù)設(shè)定默認(rèn)值。[OUTPUT]是用來指定該參數(shù)是既有輸入又有輸出值的,也就是在調(diào)用了這個(gè)存儲(chǔ)過程時(shí),如果所指定的參數(shù)值是我們需要輸入的參數(shù),同時(shí)也需要在結(jié)果中輸出的,則該項(xiàng)必須為OUTPUT,而如果只是做輸出參數(shù)用,可以用CURSOR,同時(shí)在使用該參數(shù)時(shí),必須指定VARYING和OUTPUT這兩個(gè)語句。 例子: CREATE PROCEDURE order_tot_amt @o_id int, @p_tot int output AS SELECT @p_tot = sum(Unitprice*Quantity) FROM orderdetails WHERE ordered=@o_id GO 例子說明: 該例子是建立一個(gè)簡單的存儲(chǔ)過程order_tot_amt,這個(gè)存儲(chǔ)過程根據(jù)用戶輸入的定單ID號(hào)碼(@o_id),由訂單明細(xì)表 (orderdetails)中計(jì)算該定單銷售總額[單價(jià)(Unitprice)*數(shù)量(Quantity)],這一金額通過@p_tot這一參數(shù)輸出給調(diào)用這一存儲(chǔ)過程的程序。編輯本段存儲(chǔ)過程的功能
這類語言主要提供以下功能,讓用戶可以設(shè)計(jì)出符合引用需求的程序: 1)、變量說明 2)、ANSI(美國國家標(biāo)準(zhǔn)化組織)兼容的SQL命令(如Select,Update….) 3)、一般流程控制命令(if…else…、while….) 4)、內(nèi)部函數(shù)編輯本段觸發(fā)器
觸發(fā)器的概念及作用
觸發(fā)器是一種特殊類型的存儲(chǔ)過程,它不同于我們前面介紹過的存儲(chǔ)過程。觸發(fā)器主要是通過事件進(jìn)行觸發(fā)而被執(zhí)行的,而存儲(chǔ)過程可以通過存儲(chǔ)過程名字而被直接調(diào)用。當(dāng)對(duì)某一表進(jìn)行諸如Update、 Insert、 Delete 這些操作時(shí),SQL Server 就會(huì)自動(dòng)執(zhí)行觸發(fā)器所定義的SQL 語句,從而確保對(duì)數(shù)據(jù)的處理必須符合由這些SQL 語句所定義的規(guī)則。 觸發(fā)器的主要作用就是其能夠?qū)崿F(xiàn)由主鍵和外鍵所不能保證的復(fù)雜的參照完整性和數(shù)據(jù)的一致性。除此之外,觸發(fā)器還有其它許多不同的功能: (1) 強(qiáng)化約束(Enforce restriction) 觸發(fā)器能夠?qū)崿F(xiàn)比CHECK 語句更為復(fù)雜的約束。 (2) 跟蹤變化Auditing changes 觸發(fā)器可以偵測(cè)數(shù)據(jù)庫內(nèi)的操作,從而不允許數(shù)據(jù)庫中未經(jīng)許可的指定更新和變化。 (3) 級(jí)聯(lián)運(yùn)行(Cascaded operation)。 觸發(fā)器可以偵測(cè)數(shù)據(jù)庫內(nèi)的操作,并自動(dòng)地級(jí)聯(lián)影響整個(gè)數(shù)據(jù)庫的各項(xiàng)內(nèi)容。例如,某個(gè)表上的觸發(fā)器中包含有對(duì)另外一個(gè)表的數(shù)據(jù)操作(如刪除,更新,插入)而該操作又導(dǎo)致該表上觸發(fā)器被觸發(fā)。 (4) 存儲(chǔ)過程的調(diào)用(Stored procedure invocation)。 為了響應(yīng)數(shù)據(jù)庫更新,觸發(fā)器可以調(diào)用一個(gè)或多個(gè)存儲(chǔ)過程,甚至可以通過外部過程的調(diào)用而在DBMS( 數(shù)據(jù)庫管理系統(tǒng))本身之外進(jìn)行操作。 由此可見,觸發(fā)器可以解決高級(jí)形式的業(yè)務(wù)規(guī)則或復(fù)雜行為限制以及實(shí)現(xiàn)定制記錄等一些方面的問題。例如,觸發(fā)器能夠找出某一表在數(shù)據(jù)修改前后狀態(tài)發(fā)生的差異,并根據(jù)這種差異執(zhí)行一定的處理。此外一個(gè)表的同一類型(Insert、 Update、 Delete)的多個(gè)觸發(fā)器能夠?qū)ν环N數(shù)據(jù)操作采取多種不同的處理。 總體而言,觸發(fā)器性能通常比較低。當(dāng)運(yùn)行觸發(fā)器時(shí),系統(tǒng)處理的大部分時(shí)間花費(fèi)在參照其它表的這一處理上,因?yàn)檫@些表既不在內(nèi)存中也不在數(shù)據(jù)庫設(shè)備上,而刪除表和插入表總是位于內(nèi)存中??梢娪|發(fā)器所參照的其它表的位置決定了操作要花費(fèi)的時(shí)間長短。觸發(fā)器的種類
SQL Server 2000 支持兩種類型的觸發(fā)器:AFTER 觸發(fā)器和INSTEAD OF 觸發(fā)器。其中AFTER 觸發(fā)器即為SQL Server 2000 版本以前所介紹的觸發(fā)器。該類型觸發(fā)器要求只有執(zhí)行某一操作(Insert Update Delete) 之后,觸發(fā)器才被觸發(fā),且只能在表上定義??梢詾獒槍?duì)表的同一操作定義多個(gè)觸發(fā)器。對(duì)于AFTER 觸發(fā)器,可以定義哪一個(gè)觸發(fā)器被最先觸發(fā),哪一個(gè)被最后觸發(fā),通常使用系統(tǒng)過程sp_settriggerorder 來完成此任務(wù)。 INSTEAD OF 觸發(fā)器表示并不執(zhí)行其所定義的操作(Insert、 Update、 Delete),而僅是執(zhí)行觸發(fā)器本身。既可在表上定義INSTEAD OF 觸發(fā)器,也可以在視圖上定義INSTEAD OF 觸發(fā)器,但對(duì)同一操作只能定義一個(gè)INSTEAD OF 觸發(fā)器。常用格式
Create procedure procedure_name [@parameter data_type][output] [with]{recompile|encryption} as sql_statement 解釋: output:表示此參數(shù)是可傳回的 with {recompile|encryption} recompile:表示每次執(zhí)行此存儲(chǔ)過程時(shí)都重新編譯一次 encryption:所創(chuàng)建的存儲(chǔ)過程的內(nèi)容會(huì)被加密 如: 表book的內(nèi)容如下 編號(hào) 書名 價(jià)格 001 C語言入門 $30 002 PowerBuilder報(bào)表開發(fā) $52 實(shí)例1:查詢表Book的內(nèi)容的存儲(chǔ)過程 create proc query_book as select * from book go exec query_book 實(shí)例2: 加入一筆記錄到表book,并查詢此表中所有書籍的總金額 Create proc insert_book @param1 char(10),@param2 varchar(20),@param3 money,@param4 money output with encryption ---------加密 as insert into book(編號(hào),書名,價(jià)格) Values(@param1,@param2,@param3) select @param4=sum(價(jià)格) from book go 執(zhí)行例子: declare @total_price money exec insert_book '003','Delphi 控件開發(fā)指南',$100,@total_price print '總金額為'+convert(varchar,@total_price) go 存儲(chǔ)過程的3種傳回值: 1)、以Return傳回整數(shù) 2)、以output格式傳回參數(shù) 3)、Recordset 傳回值的區(qū)別: output和return都可在批次程式中用變量接收,而recordset則傳回到執(zhí)行批次的客戶端中。 實(shí)例3: 設(shè)有兩個(gè)表為Product,Order_,其表內(nèi)容如下: Product 產(chǎn)品編號(hào) 產(chǎn)品名稱 客戶訂數(shù) 001 鋼筆 30 002 毛筆 50 003 鉛筆 100 Order_ 產(chǎn)品編號(hào) 客戶名 客戶訂金 001 南山區(qū) $30 002 羅湖區(qū) $50 003 寶安區(qū) $4 請(qǐng)實(shí)現(xiàn)按編號(hào)為連接條件,將兩個(gè)表連接成一個(gè)臨時(shí)表,該表只含編號(hào).產(chǎn)品名.客戶名.訂金.總金額, 總金額=訂金*訂數(shù),臨時(shí)表放在存儲(chǔ)過程中 代碼如下: Create proc temp_sale as select a.產(chǎn)品編號(hào),a.產(chǎn)品名稱,b.客戶名,b.客戶訂金,a.客戶訂數(shù)* b.客戶訂金 as總金額 into #temptable from Product a inner join Order_ b on a.產(chǎn)品編號(hào)=b.產(chǎn)品編號(hào)-----此處要用別名 if @@error=0 print 'Good' else print 'Fail' go編輯本段優(yōu)點(diǎn)
* 存儲(chǔ)過程的能力大大增強(qiáng)了SQL語言的功能和靈活性。存儲(chǔ)過程可以用流控制語句編寫,有很強(qiáng)的靈活性,可以完成復(fù)雜的判斷和較復(fù)雜的 運(yùn)算。 * 可保證數(shù)據(jù)的安全性和完整性。 # 通過存儲(chǔ)過程可以使沒有權(quán)限的用戶在控制之下間接地存取數(shù)據(jù)庫,從而保證數(shù)據(jù)的安全。 # 通過存儲(chǔ)過程可以使相關(guān)的動(dòng)作在一起發(fā)生,從而可以維護(hù)數(shù)據(jù)庫的完整性。 * 在運(yùn)行存儲(chǔ)過程前,數(shù)據(jù)庫已對(duì)其進(jìn)行了語法和句法分析,并給出了優(yōu)化執(zhí)行方案。這種已經(jīng)編譯好的過程可極大地改善SQL語句的性能。由于執(zhí)行SQL語句的大部分工作已經(jīng)完成,所以存儲(chǔ)過程能以極快的速度執(zhí)行。 * 可以降低網(wǎng)絡(luò)的通信量。 * 使體現(xiàn)企業(yè)規(guī)則的運(yùn)算程序放入數(shù)據(jù)庫服務(wù)器中,以便: # 集中控制。 # 當(dāng)企業(yè)規(guī)則發(fā)生變化時(shí)在服務(wù)器中改變存儲(chǔ)過程即可,無須修改任何應(yīng)用程序。企業(yè)規(guī)則的特點(diǎn)是要經(jīng)常變化,如果把體現(xiàn)企業(yè)規(guī)則的運(yùn)算程序放入應(yīng)用程序中,則當(dāng)企業(yè)規(guī)則發(fā)生變化時(shí),就需要修改應(yīng)用程序工作量非常之大(修改、發(fā)行和安裝應(yīng)用程序)。如果把體現(xiàn)企業(yè)規(guī)則的運(yùn)算放入存儲(chǔ)過程中,則當(dāng)企業(yè)規(guī)則發(fā)生變化時(shí),只要修改存儲(chǔ)過程就可以了,應(yīng)用程序無須任何變化。 簡單講: 1.存儲(chǔ)過程只在創(chuàng)造時(shí)進(jìn)行編譯,以后每次執(zhí)行存儲(chǔ)過程都不需再重新編譯,而一般SQL語句每執(zhí)行一次就編譯一次,所以使用存儲(chǔ)過程可提高數(shù)據(jù)庫執(zhí)行速度。 2.當(dāng)對(duì)數(shù)據(jù)庫進(jìn)行復(fù)雜操作時(shí)(如對(duì)多個(gè)表進(jìn)行Update,Insert,Query,Delete時(shí)),可將此復(fù)雜操作用存儲(chǔ)過程封裝起來與數(shù)據(jù)庫提供的事務(wù)處理結(jié)合一起使用。 3.存儲(chǔ)過程可以重復(fù)使用,可減少數(shù)據(jù)庫開發(fā)人員的工作量 4.安全性高,可設(shè)定只有某些用戶才具有對(duì)指定存儲(chǔ)過程的使用權(quán) 有一點(diǎn)需要注意的是,一些網(wǎng)上盛傳的所謂的存儲(chǔ)過程要比sql語句執(zhí)行更快的說法,實(shí)際上是個(gè)誤解,并沒有根據(jù),包括微軟內(nèi)部的人也不認(rèn)可這一點(diǎn),所以不能作為正式的優(yōu)點(diǎn),希望大家能夠認(rèn)識(shí)到這一點(diǎn)。編輯本段缺點(diǎn)
1:調(diào)試麻煩,但是用 PL/SQL Developer 調(diào)試很方便!彌補(bǔ)這個(gè)缺點(diǎn)。 2:移植問題,數(shù)據(jù)庫端代碼當(dāng)然是與數(shù)據(jù)庫相關(guān)的。但是如果是做工程型項(xiàng)目,基本不存在移植問題。 3:重新編譯問題,因?yàn)楹蠖舜a是運(yùn)行前編譯的,如果帶有引用關(guān)系的對(duì)象發(fā)生改變時(shí),受影響的存儲(chǔ)過程、包將需要重新編譯(不過也可以設(shè)置成運(yùn)行時(shí)刻自動(dòng)編譯)。 4: 如果在一個(gè)程序系統(tǒng)中大量的使用存儲(chǔ)過程,到程序交付使用的時(shí)候隨著用戶需求的增加會(huì)導(dǎo)致數(shù)據(jù)結(jié)構(gòu)的變化,接著就是系統(tǒng)的相關(guān)問題了,最后如果用戶想維護(hù)該系統(tǒng)可以說是很難很難、而且代價(jià)是空前的,維護(hù)起來更麻煩。編輯本段實(shí)例
數(shù)據(jù)庫存儲(chǔ)過程
數(shù)據(jù)庫存儲(chǔ)過程的實(shí)質(zhì)就是部署在數(shù)據(jù)庫端的一組定義代碼以及SQL。將常用的或很復(fù)雜的工作,預(yù)先用SQL語句寫好并用一個(gè)指定的名稱存儲(chǔ)起來,那么以后要叫數(shù)據(jù)庫提供與已定義好的存儲(chǔ)過程的功能相同的服務(wù)時(shí),只需調(diào)用execute,即可自動(dòng)完成命令。 利用SQL的語言可以編寫對(duì)于數(shù)據(jù)庫訪問的存儲(chǔ)過程,其語法如下: CREATE PROC[EDURE] procedure_name [;number] [ {@parameter data_type} ][VARYING] [= default] [OUTPUT] ] [,...n] [WITH { RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION } ] [FOR REPLICATION] AS sql_statement [...n] [ ]內(nèi)的內(nèi)容是可選項(xiàng),而()內(nèi)的內(nèi)容是必選項(xiàng), 例:若用戶想建立一個(gè)刪除表tmp中的記錄的存儲(chǔ)過程Select_delete可寫為: Create Proc select_del As Delete tmp 例:用戶想查詢tmp表中某年的數(shù)據(jù)的存儲(chǔ)過程 create proc select_query @year int as select * from tmp where year=@year 在這里@year是存儲(chǔ)過程的參數(shù) 例:該存儲(chǔ)過程是從某結(jié)點(diǎn)n開始找到最上層的父親結(jié)點(diǎn),這種經(jīng)常用到的過程可以由存儲(chǔ)過程來擔(dān)當(dāng),在網(wǎng)頁中重復(fù)使用達(dá)到共享。 空:表示該結(jié)點(diǎn)為頂層結(jié)點(diǎn) fjdid(父結(jié)點(diǎn)編號(hào)) 結(jié)點(diǎn)n 非空:表示該結(jié)點(diǎn)的父親結(jié)點(diǎn)號(hào) dwmc(單位名稱) CREATE proc search_dwmc @dwidold int,@dwmcresult varchar(100) output as declare @stop int declare @result varchar(80) declare @dwmc varchar(80) declare @dwid int set nocount on set @stop=1 set @dwmc="" select @dwmc=dwmc,@dwid=convert(int,fjdid) from jtdw where id=@dwidold set @result=rtrim(@dwmc) if @dwid=0 set @stop=0 while (@stop=1) and (@dwid<>0) begin set @dwidold=@dwid select @dwmc=dwmc,@dwid=convert(int,fjdid) from jtdw where id=@dwidold if @@rowcount=0 set @dwmc="" else set @result=@dwmc+@result if (@dwid=0) or (@@rowcount=0) set @stop=0 else continue end set @dwmcresult=rtrim(@result) 使用exec pro-name [pram1 pram2.....]SQL Server中存儲(chǔ)過程
sql語句執(zhí)行的時(shí)候要先編譯,然后執(zhí)行。存儲(chǔ)過程就是編譯好了的一些sql語句。用的時(shí)候直接就可以用了。 在SQL Server的查詢分析器中,輸入以下代碼: declare @tot_amt int execute order_tot_amt 1,@tot_amt output select @tot_amt 以上代碼是執(zhí)行order_tot_amt這一存儲(chǔ)過程,以計(jì)算出定單編號(hào)為1的定單銷售金額,我們定義@tot_amt為輸出參數(shù),用來承接我們所要的結(jié)果。Oracle中的存儲(chǔ)過程
1.創(chuàng)建過程 與其它的數(shù)據(jù)庫系統(tǒng)一樣,Oracle的存儲(chǔ)過程是用PL/SQL語言編寫的能完成一定處理功能的存儲(chǔ)在數(shù)據(jù)庫字典中的程序。 語法: create [or replace] procedure procedure_name [ (argment [ { in| in out }] type, argment [ { in | out | in out } ] type { is | as } <類型.變量的說明> ( 注: 不用 declare 語句 ) Begin <執(zhí)行部分> exception <可選的異常處理說明> end; 1.1 這里的IN表示向存儲(chǔ)過程傳遞參數(shù),OUT表示從存儲(chǔ)過程返回參數(shù)。而IN OUT 表示傳遞參數(shù)和返回參數(shù); 1.2 在存儲(chǔ)過程內(nèi)的參數(shù)只能指定參數(shù)類型;不能指定長度; 1.3 在AS或IS 后聲明要用到的變量名稱和變量類型及長度; 1.4 在AS或IS 后聲明變量不要加declare 語句。 2.使用過程 存儲(chǔ)過程建立完成后,只要通過授權(quán),用戶就可以在SQLPLUS 、Oracle開發(fā)工具或第三方開發(fā)工具來調(diào)用運(yùn)行。Oracle 使用EXECUTE 語句來實(shí)現(xiàn)對(duì)存儲(chǔ)過程的調(diào)用。 語法: EXEC[UTE] procedure_name( parameter1, parameter2…); 3.開發(fā)過程 目前的幾大數(shù)據(jù)庫廠商提供的編寫存儲(chǔ)過程的工具都沒有統(tǒng)一,雖然它們的編寫風(fēng)格有些相似,但由于沒有標(biāo)準(zhǔn),所以各家的開發(fā)調(diào)試過程也不一樣。下面編寫PL/SQL存儲(chǔ)過程、函數(shù)、包及觸發(fā)器的步驟如下: 3.1 編輯存儲(chǔ)過程源碼使用文字編輯處理軟件編輯存儲(chǔ)過程源碼,要用類似WORD 文字處理軟件進(jìn)行編輯時(shí),要將源碼存為文本格式。 3.2 對(duì)存儲(chǔ)過程程序進(jìn)行解釋在SQLPLUS或用調(diào)試工具將 存儲(chǔ)過程程序進(jìn)行解釋; 在SQL>下調(diào)試,可用start 或get 等Oracle命令來啟動(dòng)解釋。如: SQL>start c:\stat1.sql 如果使用調(diào)試工具,可直接編輯和點(diǎn)擊相應(yīng)的按鈕即可生成存儲(chǔ)過程。[2]? 3.3 調(diào)試源碼直到正確我們不能保證所寫的存儲(chǔ)過程達(dá)到一次就正確。所以這里的調(diào)試是每個(gè)程序員必須進(jìn)行的工作之一。在SQLPLUS下來調(diào)試主要用的方法是: 1.使用 SHOW ERROR命令來提示源碼的錯(cuò)誤位置; 2.使用 USER_ERRORS 數(shù)據(jù)字典來查看各存儲(chǔ)過程的錯(cuò)誤位置。 3.4 授權(quán)執(zhí)行權(quán)給相關(guān)的用戶或角色如果調(diào)試正確的存儲(chǔ)過程沒有進(jìn)行授權(quán),那就只有建立者本人才可以運(yùn)行。所以作為應(yīng)用系統(tǒng)的一部分的存儲(chǔ)過程也必須進(jìn)行授權(quán)才能達(dá)到要求。 在SQLPLUS下可以用GRANT命令來進(jìn)行存儲(chǔ)過程的運(yùn)行授權(quán)。 語法: GRANT system_privilege | role TO user | role | PUBLIC [WITH ADMIN OPTION] 或 GRANT object_privilege | ALL column ON schema.object TO user | role | PUBLIC WITH GRANT OPTION 其中 system_privilege: 系統(tǒng)權(quán)限 role: 角色名 user: 被授權(quán)的用戶名 object_privilege: 所授予的權(quán)限名字,可以是 ALTER DELETE EXECUTE INDEX INSERT REFERENCES SELECT UPDATE Column: 列名 schema: 模式名 object: 對(duì)象名 4.數(shù)據(jù)字典 USER_SOURCE 用戶的存儲(chǔ)過程、函數(shù)的源代碼字典 DBA_SOURCE 整個(gè)系統(tǒng)所有用戶的存儲(chǔ)過程、函數(shù)的源代碼字典 ALL_SOURCE 當(dāng)前用戶能使用的存儲(chǔ)過程(包括其她用戶授權(quán))、函數(shù)的源代碼字典 USER_ERRORS 用戶的存儲(chǔ)過程、函數(shù)的源代碼存在錯(cuò)誤的信息字典編輯本段臨時(shí)表
(針對(duì)SQL2000/2005) 可以創(chuàng)建本地和全局臨時(shí)表。本地臨時(shí)表僅在當(dāng)前會(huì)話中可見;全局臨時(shí)表在所有會(huì)話中都可見。 本地臨時(shí)表的名稱前面有一個(gè)編號(hào)符 (#table_name),而全局臨時(shí)表的名稱前面有兩個(gè)編號(hào)符 (##table_name)。 SQL 語句使用 CREATE TABLE 語句中為 table_name 指定的名稱引用臨時(shí)表: CREATE TABLE #MyTempTable (cola INT PRIMARY KEY) INSERT INTO #MyTempTable VALUES (1) 如果本地臨時(shí)表由存儲(chǔ)過程創(chuàng)建或由多個(gè)用戶同時(shí)執(zhí)行的應(yīng)用程序創(chuàng)建,則 SQL Server 必須能夠區(qū)分由不同用戶創(chuàng)建的表。為此,SQL Server 在內(nèi)部為每個(gè)本地臨時(shí)表的表名追加一個(gè)數(shù)字后綴。存儲(chǔ)在 tempdb 數(shù)據(jù)庫的 sysobjects 表中的臨時(shí)表,其全名由 CREATE TABLE 語句中指定的表名和系統(tǒng)生成的數(shù)字后綴組成。為了允許追加后綴,為本地臨時(shí)表指定的表名 table_name 不能超過 116 個(gè)字符。 除非使用 DROP TABLE 語句顯式除去臨時(shí)表,否則臨時(shí)表將在退出其作用域時(shí)由系統(tǒng)自動(dòng)除去: 當(dāng)存儲(chǔ)過程完成時(shí),將自動(dòng)除去在存儲(chǔ)過程中創(chuàng)建的本地臨時(shí)表。由創(chuàng)建表的存儲(chǔ)過程執(zhí)行的所有嵌套存儲(chǔ)過程都可以引用此表。但調(diào)用創(chuàng)建此表的存儲(chǔ)過程的進(jìn)程無法引用此表。 所有其它本地臨時(shí)表在當(dāng)前會(huì)話結(jié)束時(shí)自動(dòng)除去。 全局臨時(shí)表在創(chuàng)建此表的會(huì)話結(jié)束且其它任務(wù)停止對(duì)其引用時(shí)自動(dòng)除去。任務(wù)與表之間的關(guān)聯(lián)只在單個(gè) Transact-SQL 語句的生存周期內(nèi)保持。換言之,當(dāng)創(chuàng)建全局臨時(shí)表的會(huì)話結(jié)束時(shí),最后一條引用此表的 Transact-SQL 語句完成后,將自動(dòng)除去此表?!?來源:http://baike.baidu.com/view/68525.htm 相關(guān);http://www.cnblogs.com/knowledgesea/archive/2013/01/02/2841588.htmlmysql存儲(chǔ)過程語法及實(shí)例
總結(jié)
- 上一篇: AD9371,ADRV9009多路同步模
- 下一篇: 一个单片机ADC的挖坑填坑之旅