存儲過程通信
1. 怎樣理解存儲過程可以降低網路的通信量
比較復雜的操作過程,比如購買一件物品
程序從數據伺服器查詢用戶信息 ->
程序判斷用戶是否有足夠的余額 ->
程序->數據伺服器,寫入購買物品
程序->數據伺服器, 減少用戶余額
如果用存儲過程的話通信過程就只有一步
程序提交購買物品到數據伺服器(存儲過程查詢用戶信息,判斷余額,寫入數據,返回執行結果)
把部分復雜的業務邏輯交給存儲過程處理,就能減少客戶端和數據伺服器之間來回傳輸數據的次數。
2. 簡單說說存儲過程與觸發器的概念與作用
存儲過程就是一個sql的程序集 可以包含多個SQL語句 並可以附帶各種邏輯判斷及處理
觸發器 就類似於程序里的事件觸發
只是這里通常是某個欄位的改變 某個表插入了數據 或者刪除某些數據
以上這些處理引發的另外一些表數據的改變
3. 資料庫中存儲過程有什麼作用
第一:存儲過程因為SQL語句已經預編繹過了,因此運行的速度比較快。
第二:存儲過程可以接受參數、輸出參數、返回單個或多個結果集以及返回值。可以向程序返回錯誤原因。
第三:存儲過程運行比較穩定,不會有太多的錯誤。只要一次成功,以後都會按這個程序運行。
第四:存儲過程主要是在伺服器上運行,減少對客戶機的壓力。
第五:存儲過程可以包含程序流、邏輯以及對資料庫的查詢。同時可以實體封裝和隱藏了數據邏輯。
第六:存儲過程可以在單個存儲過程中執行一系列 SQL 語句。
第七:存儲過程可以從自己的存儲過程內引用其它存儲過程,這可以簡化一系列復雜語句。
其實存儲過程還可以控制許可權,比如一個表不直接允許用戶直接訪問,但要求允許用戶訪問和修改其中一個或多個欄位,那就可以通過一個存儲過程來實現並允許該用戶使用該存儲過程。
還有,如果多條SQL語句執行過程中,過程環節返回了數據作為後面環節的輸入數據,如果直接通過SQL語句執行,勢必導致大量的數據通過網路返回到客戶機,並在客戶機運算;如果封裝在存儲過程中,則將運算放在伺服器進行,不但減少了客戶機的壓力,同時也減少了網路流量,提高了執行的效率。
4. 後台運行一個主存儲過程,主存儲過程通過管道同前端過程通信的例子
beginmaxpro為提交主存儲過程起動的程序maxpro 為主存儲過程readmaxpro 為主存佳話使用ORACLE中的DBMS_PIPE管道能力 注意要明文給於用戶 EXECUTE ANY PROCEDURE 權力才可以在sqlpus用設定set serveroutput ON 進行測試通過 @testmaxpro sql 創始程序包測試過程如下SQL> call beginmaxpro();JOB= 調用完成 SQL> call readmaxpro();maxpro 的當前進行狀態為 調用完成 SQL>*/ 建立狀態表create table mytest(mystatus integer);delete from mytest;INSERT INTO MYTEST(MYSTATUS) VALUES( );mit;/ 不可重用的存儲過程 並且處理過程通過管道給ORACEL內的存儲過程通信 使用ORACLE中的DBMS_PIPE管道能力 注意要明文給於用戶 EXECUTE ANY PROCEDURE 權力才可以 首先 create table mytest(mystatus integer); INSERT INTO MYTEST(MYSTATUS) VALUES( ); CREATE OR REPLACE PROCEDURE maxpro(P_NEXTDATE IN OUT DATE) ASCREATE OR REPLACE PROCEDURE maxpro AS n integer; status NUMBER;BEGIN 取當前狀態 SELECT mystatus INTO N FROM MYTEST; DBMS_OUTPUT PUT_LINE( n= || n); IF N= THEN DBMS_OUTPUT PUT_LINE( 過程不可重入 ); RETURN; END IF; 過程調用lock UPDATE MYTEST SET MYSTATUS= ;MIT; 通過DBMS_LOCK SLEEP( ); 模擬大的處理過程 過程處理一段時間後就將一些信息放入管道FOR N IN LOOP DBMS_PIPE PURGE( maxpro ); 清除原管道信息 DBMS_PIPE PACK_MESSAGE(N); 把信息放入緩沖區 status:=DBMS_PIPE SEND_MESSAGE( maxpro ); 信息放入管道mypipe 系統等待時間為 秒 最大長度 DBMS_LOCK SLEEP( ); END LOOP; 過程調用unlock DBMS_PIPE PURGE( maxpro ); 清除原管道信息 DBMS_PIPE PACK_MESSAGE( ); 把信息放入緩沖區 表示過程完成 信息放入管道mypipe 系統等待時間為 秒 最大長度 原長度為 現在設為 是擔心長度不足出錯 status:=DBMS_PIPE SEND_MESSAGE( maxpro ); UPDATE MYTEST SET MYSTATUS= ;DBMS_OUTPUT PUT_LINE( 過程處理完成 );MIT; P_NEXTDATE:=NULL;END maxpro;//*對於maxpro存儲過程的狀態進行讀取的過程 主要使用讀取管道的方法*/CREATE OR REPLACE PROCEDURE readmaxpro AS n integer;status integer;begin 接受等待時間為 秒 可以為 立即調用或DBMS_PIPE RECEIVE_MESSAGE( mypipe ) 等待 天 status:= DBMS_PIPE RECEIVE_MESSAGE( maxpro ); status為 為成功可以UNPACK_MESSAGE 為超時沒有數據 為信息太大 為內部錯誤 IF status <> THEN SELECT mystatus INTO N FROM MYTEST; IF N= THEN DBMS_OUTPUT PUT_LINE( maxpro 過程沒有起動 ); ELSE DBMS_OUTPUT PUT_LINE( maxpro 過程起動 但管道中現在沒有信息返回 ); END IF; return; END IF; DBMS_PIPE UNPACK_MESSAGE(n); DBMS_OUTPUT PUT_LINE( maxpro 的當前進行狀態為 || n);end; 起動maxpro為後台進程的存儲過程/CREATE OR REPLACE PROCEDURE beginmaxpro ASJOB BINARY_INTEGER;BEGIN DBMS_JOB SUBMIT(JOB maxpro; sysdate sysdate+( /( * * )) TRUE); DBMS_JOB SUBMIT(JOB maxpro; sysdate sysdate+( /( * * )) ); 提交做業 秒後執行 注意設定實例ini文件中的job_queue_interval = DBMS_JOB SUBMIT(JOB maxpro; sysdate NULL FALSE); DBMS_JOB SUBMIT(JOB maxpro; sysdate+( /( * * )) NULL FALSE); DBMS_OUTPUT PUT_LINE( JOB= || JOB); MIT;end;/ lishixin/Article/program/Oracle/201311/16828
5. 什麼是存儲過程
sql語句執行的時候要先編譯,然後執行。存儲過程就是編譯好了的一些sql語句。用的時候直接就可以用了。所以效率會高 一 存儲過程介紹 存儲過程是由流控制和SQL語句書寫的過程,這個過程經編譯和優化 後存儲在資料庫伺服器中,使用時只要調用即可。在ORACLE中,若干個 有聯系的過程可以組合在一起構成程序包。 使用存儲過程有以下的優點: * 存儲過程的能力大大增強了SQL語言的功能和靈活性。存儲過程可 以用流控制語句編寫,有很強的靈活性,可以完成復雜的判斷和較復雜的 運算。 * 可保證數據的安全性和完整性。 # 通過存儲過程可以使沒有許可權的用戶在控制之下間接地存取數據 庫,從而保證數據的安全。 # 通過存儲過程可以使相關的動作在一起發生,從而可以維護數據 庫的完整性。 * 再運行存儲過程前,資料庫已對其進行了語法和句法分析,並給出 了優化執行方案。這種已經編譯好的過程可極大地改善SQL語句的性能。 由於執行SQL語句的大部分工作已經完成,所以存儲過程能以極快的速度執 行。 * 可以降低網路的通信量。 * 使體現企業規則的運算程序放入資料庫伺服器中,以便: # 集中控制。 # 當企業規則發生變化時在伺服器中改變存儲過程即可,無須修改 任何應用程序。企業規則的特點是要經常變化,如果把體現企業規則的運 算程序放入應用程序中,則當企業規則發生變化時,就需要修改應用程序 工作量非常之大(修改、發行和安裝應用程序)。如果把體現企業規則的 運算放入存儲過程中,則當企業規則發生變化時,只要修改存儲過程就可 以了,應用程序無須任何變化。 不同資料庫存儲過程的寫法不一,在後面的講座中將分別介紹ORACLE 和SYBASE存儲過程的用法。 二 ORACLE 的存儲過程 ORACLE 創建存儲過程的語法為: create [or replace] procere 過程名 參數1 [in|out|in out] 數據類型 [,參數2 [in|out|in out] 數據類型]... pl/sql 語句 下面舉例說明ORACLE資料庫存儲過程的寫法和用法。 可以建立一個存儲過程,每當用戶修改資料庫的重要數據時,即把 用戶的用戶名、掌諍筒僮骼嘈圖鍬枷呂矗?nbsp; create procere update_log is begin insert into update_log_tab(use_name,update_date,operation) values(user,sysdate,'update' end; 可以在恰當的位置調用這個存儲過程來記錄用戶對表的修改。例如下面在 表sal_comm上建立一個修改觸發器,每當用戶修改此表後,用戶的名稱、修改 時間和操作即被記錄在了表update_log_tab中: create trigger audit_update after update on sal_comm for each row begin update_log end --三 Sybase的存儲過程 盡管Sybase存儲過程的功能和寫法與ORACLE類似,但他們之間還是 有一定的差別。下面講述SYBASE的存儲過程。 SYBASE可以用CREATE PROCere命令生成存儲過程: CREATE PROCere 存儲過程名 [;number] [[(] @parameter_name datatype [=default] [OUTput] [, @parameter_name datatype [=default] [OUTput]]...[)]] [WITH RECOMPILE] AS SQL_statements 下面是一個查詢作者編碼、名稱和生日的存儲過程: create proc p_auths @author_code varchar(10) as select author_code, name, birthdate from auths where author_code=@author_code 下面執行過程p_auths: p_auths @author_code=A00001 在CREATE PROC語句中,可以為參數賦預設值,該值可以是任何常量。 當用戶不提供參數值時,該值便作為參數值提供給過程。
6. 存儲過程是什麼意思
存儲過程(stored procere)是一組預先編譯好的transcat-sql代碼,由於是已經編譯好的代碼,所以執行的時候不必再次進行編譯,從而提高了程序的運行效率.存儲過程跟函數不同,存儲過程不能在被調用的位置上返回數據,也不能被應用在語句當中.但是存儲過程可以使用變數的形式來返回參數.存儲過程具有執行速度快、模塊化的程序設計、減少網路通信量、保證系統安全性等優點。使用存儲過程的好處很大,存儲過程比在ASP腳本中運行SQL命令效率更高;可以提高整體性能並減輕網路負載(減少了在網路伺服器和數據伺服器之間的交互);可以優化ASP代碼和增強代碼靈活性等等。
7. 使用存儲過程有哪些優點
對於操作員來講,存儲過程簡化了操作員的操作,進程定時調用,可以讓系統自動進行定時化、批量化的操作,減少了操作員的工作量。
而且存儲過程中可以增加一些日誌處理,便於操作員對數據的跟蹤。
8. 什麼是存儲過程
定義:
將常用的或很復雜的工作,預先用SQL語句寫好並用一個指定的名稱存儲起來, 那麼以後要叫資料庫提供與已定義好的存儲過程的功能相同的服務時,只需調用execute,即可自動完成命令。
講到這里,可能有人要問:這么說存儲過程就是一堆SQL語句而已啊?
Microsoft公司為什麼還要添加這個技術呢?
那麼存儲過程與一般的SQL語句有什麼區別呢?
存儲過程的優點:
1.存儲過程只在創造時進行編譯,以後每次執行存儲過程都不需再重新編譯,而一般SQL語句每執行一次就編譯一次,所以使用存儲過程可提高資料庫執行速度。
2.當對資料庫進行復雜操作時(如對多個表進行Update,Insert,Query,Delete時),可將此復雜操作用存儲過程封裝起來與資料庫提供的事務處理結合一起使用。
3.存儲過程可以重復使用,可減少資料庫開發人員的工作量
4.安全性高,可設定只有某此用戶才具有對指定存儲過程的使用權
存儲過程的種類:
1.系統存儲過程:以sp_開頭,用來進行系統的各項設定.取得信息.相關管理工作,
如 sp_help就是取得指定對象的相關信息
2.擴展存儲過程 以XP_開頭,用來調用操作系統提供的功能
exec master..xp_cmdshell 'ping 10.8.16.1'
3.用戶自定義的存儲過程,這是我們所指的存儲過程
常用格式
Create procere procee_name
[@parameter data_type][output]
[with]{recompile|encryption}
as
sql_statement
解釋:
output:表示此參數是可傳回的
with {recompile|encryption}
recompile:表示每次執行此存儲過程時都重新編譯一次
encryption:所創建的存儲過程的內容會被加密
如:
表book的內容如下
編號 書名 價格
001 C語言入門 $30
002 PowerBuilder報表開發 $52
實例1:查詢表Book的內容的存儲過程
create proc query_book
as
select * from book
go
exec query_book
實例2:加入一筆記錄到表book,並查詢此表中所有書籍的總金額
Create proc insert_book
@param1 char(10),@param2 varchar(20),@param3 money,@param4 money output
with encryption ---------加密
as
insert book(編號,書名,價格) Values(@param1,@param2,@param3)
select @param4=sum(價格) from book
go
執行例子:
declare @total_price money
exec insert_book '003','Delphi 控制項開發指南',$100,@total_price
print '總金額為'+convert(varchar,@total_price)
go
存儲過程的3種傳回值:
1.以Return傳回整數
2.以output格式傳回參數
3.Recordset
傳回值的區別:
output和return都可在批次程式中用變數接收,而recordset則傳回到執行批次的客戶端中
實例3:設有兩個表為Proct,Order,其表內容如下:
Proct
產品編號 產品名稱 客戶訂數
001 鋼筆 30
002 毛筆 50
003 鉛筆 100
Order
產品編號 客戶名 客戶訂金
001 南山區 $30
002 羅湖區 $50
003 寶安區 $4
請實現按編號為連接條件,將兩個表連接成一個臨時表,該表只含編號.產品名.客戶名.訂金.總金額,
總金額=訂金*訂數,臨時表放在存儲過程中
代碼如下:
Create proc temp_sale
as
select a.產品編號,a.產品名稱,b.客戶名,b.客戶訂金,a.客戶訂數* b.客戶訂金 as總金額
into #temptable from Proct a inner join Order b on a.產品編號=b.產品編號
if @@error=0
print 'Good'
else
&n bsp; print 'Fail'
go
存儲過程介紹
一、先介紹一下什麼是存儲過程
存儲過程是利用SQL Server所提供的Tranact-SQL語言所編寫的程序。Tranact-SQL語言是SQL Server提供專為設計資料庫應用程序的語言,它是應用程序和SQL Server資料庫間的主要程序式設計界面。它好比Oracle資料庫系統中的Pro-SQL和Informix的資料庫系統能夠中的Informix-4GL語言一樣。這類語言主要提供以下功能,讓用戶可以設計出符合引用需求的程序:
1)、變數說明
2)、ANSI兼容的SQL命令(如Select,Update….)
3)、一般流程式控制制命令(if…else…、while….)
4)、內部函數
二、存儲過程的書寫格
CREATE PROCEDURE [擁有者.]存儲過程名[;程序編號]
[(參數#1,…參數#1024)]
[WITH
{RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION}
]
[FOR REPLICATION]
AS 程序行
其中存儲過程名不能超過128個字。每個存儲過程中最多設定1024個參數
(SQL Server 7.0以上版本),參數的使用方法如下:
@參數名 數據類型 [VARYING] [=內定值] [OUTPUT]
每個參數名前要有一個「@」符號,每一個存儲過程的參數僅為該程序內部使用,參數的類型除了IMAGE外,其他SQL Server所支持的數據類型都可使用。
[=內定值]相當於我們在建立資料庫時設定一個欄位的默認值,這里是為這個參數設定默認值。[OUTPUT]是用來指定該參數是既有輸入又有輸出值的,也就是在調用了這個存儲過程時,如果所指定的參數值是我們需要輸入的參數,同時也需要在結果中輸出的,則該項必須為OUTPUT,而如果只是做輸出參數用,可以用CURSOR,同時在使用該參數時,必須指定VARYING和OUTPUT這兩個語句。
例子:
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
例子說明:
該例子是建立一個簡單的存儲過程order_tot_amt,這個存儲過程根據用戶輸入的定單ID號碼(@o_id),由定單明細表(orderdetails)中計算該定單銷售總額[單價(Unitprice)*數量(Quantity)],這一金額通過@p_tot這一參數輸出給調用這一存儲過程的程序
三、在SQL Server中執行存儲過程
在SQL Server的查詢分析器中,輸入以下代碼:
declare @tot_amt int
execute order_tot_amt 1,@tot_amt output
select @tot_amt
以上代碼是執行order_tot_amt這一存儲過程,以計算出定單編號為1的定單銷售金額,我們定義@tot_amt為輸出參數,用來承接我們所要的結果
sql語句執行的時候要先編譯,然後執行。存儲過程就是編譯好了的一些sql語句。用的時候直接就可以用了。
存儲過程是由流控制和SQL語句書寫的過程,這個過程經編譯和優化 後存儲在資料庫伺服器中,使用時只要調用即可。在ORACLE中,若干個 有聯系的過程可以組合在一起構成程序包。
使用存儲過程有以下的優點:
* 存儲過程的能力大大增強了SQL語言的功能和靈活性。存儲過程可 以用流控制語句編寫,有很強的靈活性,可以完成復雜的判斷和較復雜的 運算。
* 可保證數據的安全性和完整性。
# 通過存儲過程可以使沒有許可權的用戶在控制之下間接地存取資料庫,從而保證數據的安全。
# 通過存儲過程可以使相關的動作在一起發生,從而可以維護資料庫的完整性。
* 再運行存儲過程前,資料庫已對其進行了語法和句法分析,並給出 了優化執行方案。這種已經編譯好的過程可極大地改善SQL語句的性能。 由於執行SQL語句的大部分工作已經完成,所以存儲過程能以極快的速度執 行。
* 可以降低網路的通信量。
* 使體現企業規則的運算程序放入資料庫伺服器中,以便:
# 集中控制。
# 當企業規則發生變化時在伺服器中改變存儲過程即可,無須修改 任何應用程序。企業規則的特點是要經常變化,如果把體現企業規則的運 算程序放入應用程序中,則當企業規則發生變化時,就需要修改應用程序 工作量非常之大(修改、發行和安裝應用程序)。如果把體現企業規則的 運算放入存儲過程中,則當企業規則發生變化時,只要修改存儲過程就可 以了,應用程序無須任何變化。
9. 關於存儲過程的疑問!!求幫助!!
首先,存儲過程在執行的時候不需要預編譯,就速度上來說占優勢
另外,存儲過程相當於開發中的封裝,內部的查詢邏輯對於程序來說是不需要知道的,這樣在你的數據結構或者查詢邏輯有改動的時候,不會影響到程序這點是非常好的
再者,在很多查詢中我們需要連接很多表或者變數或者其它的時候,我們用存儲過程可以將臨時表,變數等鎖定在存儲過程中,它們的生命周期僅存在於存儲過程的執行期內不會影響到其它的應用
其它好處有很多,不一一列舉了。。
前台調用的話要看開發工具了,工具不同執行方式不同
在SQL的查詢分析器中可以直接調用
例如:exec procName 參數,參數(注意字元串或者時間都要加'',例如:'1988-12-14','參數1')
如果有不明白的地方可以給我留言