當前位置:首頁 » 服務存儲 » 網頁如何調用存儲過程
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

網頁如何調用存儲過程

發布時間: 2023-08-20 20:20:07

A. 存儲過程的實例

資料庫存儲過程
資料庫存儲過程的實質就是部署在資料庫端的一組定義代碼以及sql。將常用的或很復雜的工作,預先用SQL語句寫好並用一個指定的名稱存儲起來,那麼以後要叫資料庫提供與已定義好的存儲過程的功能相同的服務時,只需調用execute,即可自動完成命令。
利用SQL的語言可以編寫對於資料庫訪問的存儲過程,其語法如下:
CREATE PROC[EDURE] procere_name [;number]
[
{@parameter data_type} ][VARYING] [= default] [OUTPUT]
]
[,...n]
[WITH
{
RECOMPILE
| ENCRYPTION
| RECOMPILE, ENCRYPTION
}
]
[FOR REPLICATION]
AS
sql_statement [...n]
[ ]內的內容是可選項,而()內的內容是必選項,
例:若用戶想建立一個刪除表tmp中的記錄的存儲過程Select_delete可寫為:
Create Proc select_del As
Delete tmp
例:用戶想查詢tmp表中某年的數據的存儲過程
create proc select_query @year int as
select * from tmp where year=@year
在這里@year是存儲過程的參數
例:該存儲過程是從某結點n開始找到最上層的父親結點,這種經常用到的過程可以由存儲過程來擔當,在網頁中重復使用達到共享。
空:表示該結點為頂層結點
fjdid(父結點編號)
結點n 非空:表示該結點的父親結點號
dwmc(單位名稱) CREATEprocsearch_dwmc@dwidoldint,@dwmcresultvarchar(100)outputasdeclare@stopintdeclare@resultvarchar(80)declare@dwmcvarchar(80)declare@dwidintsetnocountonset@stop=1set@dwmc=""select@dwmc=dwmc,@dwid=convert(int,fjdid)fromjtdwwhereid=@dwidoldset@result=rtrim(@dwmc)if@dwid=0set@stop=0while(@stop=1)and(@dwid<>0)beginset@dwidold=@dwidselect@dwmc=dwmc,@dwid=convert(int,fjdid)fromjtdwwhereid=@dwidoldif@@rowcount=0set@dwmc=""elseset@result=@dwmc+@resultif(@dwid=0)or(@@rowcount=0)set@stop=0elsecontinueendset@dwmcresult=rtrim(@result)使用execpro-name[pram1pram2.....]SQL Server中存儲過程
sql語句執行的時候要先編譯,然後執行。存儲過程就是編譯好了的一些sql語句。用的時候直接就可以用了。
在SQL Server的查詢分析器中,輸入以下代碼:
declare @tot_amt int
execute order_tot_amt 1,@tot_amt output
select @tot_amt
以上代碼是執行order_tot_amt這一存儲過程,以計算出訂單編號為1的訂單銷售金額,我們定義@tot_amt為輸出參數,用來承接我們所要的結果。
Oracle中的存儲過程
1.創建過程
與其它的資料庫系統一樣,Oracle的存儲過程是用PL/SQL語言編寫的能完成一定處理功能的存儲在資料庫字典中的程序。
語法:
create [or replace] procere procere_name
[ (argment [ { in| in out }] type,
argment [ { in | out | in out } ] type
{ is | as }
<類型.變數的說明>
(注:不用 declare語句 )
Begin
<執行部分>
exception
<可選的異常處理說明>
end;
1.1 這里的IN表示向存儲過程傳遞參數,OUT表示從存儲過程返回參數。而IN OUT 表示傳遞參數和返回參數;
1.2 在存儲過程內的參數只能指定參數類型;不能指定長度;
1.3 在AS或IS 後聲明要用到的變數名稱和變數類型及長度;
1.4 在AS或IS 後聲明變數不要加declare 語句。
2.使用過程
存儲過程建立完成後,只要通過授權,用戶就可以在SQLPLUS 、Oracle開發工具或第三方開發工具來調用運行。Oracle 使用CALL 語句來實現對存儲過程的調用。
語法:
call procere_name( parameter1, parameter2…);
3.開發過程
如今的幾大資料庫廠商提供的編寫存儲過程的工具都沒有統一,雖然它們的編寫風格有些相似,但由於沒有標准,所以各家的開發調試過程也不一樣。下面編寫PL/SQL存儲過程、函數、包及觸發器的步驟如下:
3.1 編輯存儲過程源碼使用文字編輯處理軟體編輯存儲過程源碼,要用類似WORD文字處理軟體進行編輯時,要將源碼存為文本格式。
3.2 對存儲過程程序進行解釋在SQLPLUS或用調試工具將 存儲過程程序進行解釋;
在SQL>下調試,可用start 或get 等Oracle命令來啟動解釋。如:
SQL>start c:stat1.sql
如果使用調試工具,可直接編輯和點擊相應的按鈕即可生成存儲過程。
3.3 調試源碼直到正確我們不能保證所寫的存儲過程達到一次就正確。所以這里的調試是每個程序員必須進行的工作之一。在SQLPLUS下來調試主要用的方法是:
1.使用 SHOW ERROR命令來提示源碼的錯誤位置;
2.使用 USER_ERRORS數據字典來查看各存儲過程的錯誤位置。
3.4 授權執行權給相關的用戶或角色如果調試正確的存儲過程沒有進行授權,那就只有建立者本人才可以運行。所以作為應用系統的一部分的存儲過程也必須進行授權才能達到要求。 在SQLPLUS下可以用GRANT命令來進行存儲過程的運行授權。
語法:
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: 系統許可權
role: 角色名
user: 被授權的用戶名
object_privilege: 所授予的許可權名字,可以是
ALTER
DELETE
EXECUTE
INDEX
INSERT
REFERENCES
SELECT
UPDATE
Column: 列名
schema: 模式名
object: 對象名
4.數據字典
USER_SOURCE 用戶的存儲過程、函數的源代碼字典
DBA_SOURCE 整個系統所有用戶的存儲過程、函數的源代碼字典
ALL_SOURCE 當前用戶能使用的存儲過程(包括其她用戶授權)、函數的源代碼字典
USER_ERRORS 用戶的存儲過程、函數的源代碼存在錯誤的信息字典
臨時表
(針對SQL2000/2005)
可以創建本地和全局臨時表。本地臨時表僅在當前會話中可見;全局臨時表在所有會話中都可見。
本地臨時表的名稱前面有一個編號符 (#table_name),而全局臨時表的名稱前面有兩個編號符 (##table_name)。
SQL 語句使用 CREATE TABLE 語句中為 table_name 指定的名稱引用臨時表:
CREATE TABLE #MyTempTable (cola INT PRIMARY KEY)
INSERT INTO #MyTempTable VALUES (1)
如果本地臨時表由存儲過程創建或由多個用戶同時執行的應用程序創建,則 SQL Server 必須能夠區分由不同用戶創建的表。為此,SQL Server 在內部為每個本地臨時表的表名追加一個數字後綴。存儲在 tempdb 資料庫的 sysobjects 表中的臨時表,其全名由 CREATE TABLE 語句中指定的表名和系統生成的數字後綴組成。為了允許追加後綴,為本地臨時表指定的表名 table_name 不能超過 116 個字元。
除非使用 DROP TABLE 語句顯式除去臨時表,否則臨時表將在退出其作用域時由系統自動除去:
當存儲過程完成時,將自動除去在存儲過程中創建的本地臨時表。由創建表的存儲過程執行的所有嵌套存儲過程都可以引用此表。但調用創建此表的存儲過程的進程無法引用此表。
所有其它本地臨時表在當前會話結束時自動除去。
全局臨時表在創建此表的會話結束且其它任務停止對其引用時自動除去。任務與表之間的關聯只在單個 Transact-SQL 語句的生存周期內保持。換言之,當創建全局臨時表的會話結束時,最後一條引用此表的 Transact-SQL 語句完成後,將自動除去此表。

B. 請問什麼是存儲過程,存儲過程作用是什麼,什麼情況下才用存儲過程如何用sql調用存儲過程

sql語句執行的時候要先編譯,然後執行。存儲過程(Stored Procere)是一組為了完成特定功能的SQL語句集,經編譯後存儲在資料庫中。用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它。存儲過程是資料庫中的一個重要對象,任何一個設計良好的資料庫應用程序都應該用到存儲過程.
這是一個基礎教程你看看http://www.aspxuexi.com/asp/sp/2007-11-20/2990.htm

C. 表單post提交查詢資料庫調用存儲過程實現分頁功能

首先要知道分頁顯示數據需要哪些參數,包括總共有多少條數據的參數dataCount,每頁顯示多少條數據的參數pageSize,總共有多少頁數的參數pageCount,當前頁數(頁碼)的參數pageIndex。

獲取總共多少條數據的參數dataCount非常簡單,執行Sql語句「select count(*) from test」就可以拿到dataCount值了,還有一個非常簡單的參數就是當前頁數(頁碼)pageIndex默認就是1。
每頁顯示多少條數據根據網頁顯示量來設定,假設網頁一頁顯示10,那麼pageSize就是10,有dataCount和pageSize值,總共有多少頁數也就可以獲得了,pageCount=dataCount/pageSize,通過這樣計算頁數方式獲得的數據量一定小於實際的頁數,這里就需要用到取頂函數pageCount=1.0*dataCount/pageSize。

關鍵就是如何通過准備的參數獲取數據,還需要用到Sql Server2005及以上版本的資料庫才有的給資料庫表數據查詢時增加序號的函數,這是因為我們存放在資料庫的數據沒有連續自動增長的編號,藉助函數row_number()可以通過按某個欄位排序設定序號,方便獲取數據准確。
比較兩條Sql語句「select * from test」和「select *,row_number() over(order by Test1) as '序號' from Test」查詢數據進行比較就會發現在查詢結果中會增加一個通過欄位Test1排序而產生的一個序號,並且這個序號是連續自動增長的。

接下來創建存儲過程,指定參數就可以了。
create proc P_Test--創建存儲過程P_Test
@pageSize int,--每頁數據條數
@pageIndex int,--當前頁數(頁碼)
@pageCount int output--總的頁數,因為需要顯示頁數,因此是個輸出參數
as
declare @datacount int--總數據條數
select @datacount=count(*) from test--獲得總數據條數值並賦給參數
set @pageCount=ceiling(1.0*@datacount/@pageSize)--獲得總頁數,並賦給參數
--接下來是獲得指定頁數據
select * from
(select *,row_number() over(order by Test1) as num from test) as temp
where num between @pageSize*(@pageIndex-1)+1 and @pageSize*@pageIndex

D. 在網頁引用資料庫的詳細方法(如何引用資料庫數據)

1SQLServer2000常用的數據導入導出方法1

1通過DTS的設計器進行導入或導出DTS的設計器功能強大,支持多任務,也是可視化界面,易於操作,但熟悉的人一般不多,如果只是進行SQLServer資料庫中部分表的移動,用這種方法最好,當然,也可以進行全部表的移動

在SQLServerEnterpriseManager中,展開伺服器左邊的+,選擇資料庫,右擊,選擇Alltasks/ImportData

(或Alltasks/ExportData

),進入向導模式,然後按照提示一步一步進行就可以了,裡面分得非常詳細,可以靈活的在不同數據源之間復制數據,非常的方便,而且還可以另存成DTS包,如果以後還有相同的復制任務,直接運行DTS包就行,省時省力

也可以直接打開DTS設計器,方法是展開伺服器名稱下面的DataServices,選LocalPackages,在右邊的窗口中右擊,選NewPackage,就打開了DTS設計器

值得注意的是:檔鬧巧如果源資料庫要拷貝的表有外鍵,注意移動的順序,有時要分批移動,否則外鍵主鍵,索引可能丟失,移動的時候選項旁邊的提示說的很明白,或者一次性的復制到目標資料庫中,再重新建立外鍵,主鍵,索引

其實在建立資料庫時,建立外鍵,主鍵,索引的文件應該和建表文件分開,而且用的數據文件也分開,並分別放在不同的驅動器上,有利於資料庫的優化

1

2利用Bcp工具這種工具雖然在SQLServer2000的版本中不推薦使用,但許多資料庫管理員仍很喜歡用它,尤其是用過SQLServer早期版本的人

不過Bcp確實有其局限性,首先它的界面不是圖形化的;其次它只是在SQLServer的表(視圖)與文本文件之間進行復制

但是另一方面,它也有其優點:性能好,開銷小,佔用內存少,速度快

1

3利用備份和恢復先對源資料庫進行完全備份,備份到一個設備(device)上,然後把備份文件復制到目的伺服器上(恢復的速度快),進行資料庫的恢復操作,在恢復的資料庫名中填上源資料庫的名字(名字必須相同),選擇強制型恢復(可以覆蓋以前資料庫的選項),在選擇從設備中進行恢復,瀏覽時選中備份的文件就行了

這種方法可以完全恢復資料庫,包括外鍵,主鍵,索引

1

4直接拷貝數據文件把資料庫的數據文件(*

mdf)和日誌文件(*

ldf)都拷貝到目的伺服器,在SQLServerQueryAnalyzer中用語句進行恢復:EXECsp_attach_db@dbname=』test』,@filename1=』d:mssql7data est_data

mdf』,@filename2=』d:mssql7data est_log

ldf』這樣就把test資料庫附加到SQLServer中,可以照常使用,如果不想用原來的日誌文件,可以用如下的命令:EXECsp_detach_db@dbname=』test』EXECsp_attach_single_file_db@dbname=』test』,@physname=』d:mssql7data est_data

mdf』這個語句的作用是僅行鍵僅載入數據文件,日誌文件可以由SQLServer資料庫自動添加,但是原來的日誌文件中記錄的數據就丟失了

1

5在應用程序中定製可以在應用程序(PB、VB)中執行自己編寫的程序,也可以在QueryAnalyzer中執行,這種方法比較靈活,其實是利用一個平台連接到資料庫,在平台中用的主要是SQL語句,這種方法彎謹對資料庫的影響小,但是如果用到遠程鏈接伺服器,要求網路之間的傳輸性能好,一般有兩種語句:1

5

1select

intonew_tablenamewhere

1

5

2insert(into)old_tablenameselect

from

where

這兩種方式的區別是前者把數據插入一個新表(先建立表,再插入數據),而後者是把數據插入已經存在的一個表中,一般來說,第二條語句強於前者

1

6SQLServer的復制功能SQLServer提供了強大的數據復制功能,也是最不易掌握的,具體應用請參考相關資料,值得注意的是要想成功進行數據的復制工作,有些條件是必不可少的:1

6

1SQLServerAgent必須啟動,MSDTC必須啟動

1

6

2所有要復制的表必須有主鍵

1

6

3如果表中有text或image數據類型,必須使用withlog選項,不能使用withno_log選項

另外maxtextreplsize選項控制可以復制的文本和圖像數據的最大規模,超過這個限制的操作將失敗

1

6

4在要進行復制的計算機上,應該至少是隱含共享,即共享名是C$或D$

1

6

5為SQLServer代理使用的WindowsNT賬號不能是一個本地的系統賬號,因為本地的系統賬號不允許網路存取

1

6

6如果參與復制的伺服器在另外的計算機域中,必須在這些域之間建立信任關系

2實現基於網頁的資料庫數據導入那麼,如何實現基於網頁的資料庫數據導入呢,下面利用一個比較簡單的網路介紹一下

假設某區域網的網路拓撲結構如下所示:其中伺服器A和工作站B位於區域網內,工作站C與伺服器D位於Internet內,區域網與Internet是物理隔離的,工作站C與工作站D在同一個辦公室內,伺服器A上的資料庫管理系統是Oracle,伺服器D上的資料庫管理系統是SQLServer2000

由於工作需要,要求把伺服器A的有關數據導入到伺服器D上

2

1通常的工作流程:2

1

1在工作站B上運行客戶端軟體,將伺服器A上數據導入到本地的dbf文件

2

1

2用移動硬碟把dbf文件從工作站B拷貝到工作站C上

2

1

3在工作站C上,用ftp軟體將dbf文件上傳到伺服器D上

2

1

4在工作站C上,運行遠程桌面軟體登錄到伺服器D上

2

1

5在伺服器D上,執行DTS,將dbf文件中的數據導入到SQLServer資料庫

2

1

6在伺服器D上,運行相關存儲過程,做數據的後期處理工作

在許多情況下,因為各種不同情況的需要,這個工作流程每天(甚至更短的時間內)就要執行一次,非常繁瑣,而且使用手工操作,很容易出錯

下面提出一種改進的方案

2

2改進後的工作流程2

2

1在工作站B上運行客戶端軟體,將伺服器A上數據導入到本地的dbf文件

2

2

2用移動硬碟把dbf文件從工作站B拷貝到工作站C上

2

2

3在工作站C上,打開伺服器D上的相關網頁,利用網頁將dbf文件的數據導入到伺服器D上的SQLServer資料庫中

首先,要在網頁里實現上傳功能,把dbf文件從工作站C上傳到服務D上,這里就不多介紹了

要通過網頁把dbf文件導入到SQLServer中,需要藉助DTS可編程對象

DTS包含一組可編程COM對象,主要包含:DTS

Package、DTS

Connection、DTS

Step、DTS

、DTS

、DTS

在ASP網頁里,通過用VBScript腳本創建調用DTS可編程COM對象,可以完成數據導入任務

SQLServer2000有比較詳細的文檔資料介紹DTS編程,但沒有給一個具體的例子,如果僅參考文檔資料,難度比較大,開發時間也會相當長

這里大概的介紹一下開發程序的過程

首先,在SQLSever2000的DTS設計器里,創建DTS包,實現從dbf文件到SQLServer2000的數據導入,把後期處理的存儲過程也添加到DTS包里

將這個DTS包另存為VBScript文件

有了這個VBScript文件,開發程序就容易多了,加入所需要的其他代碼,就可以在網頁里實現資料庫的數據導入

參考文獻【1】張莉,等

SQLServer資料庫原理及應用教程〔M〕

北京:清華大學出版社,2003

【2】梁方明

SQLServer2000資料庫編程〔M〕

北京:北京希望電子出版社,2002

【3】LouisDavidson(美)

SQLServer2000資料庫設計權威指南〔M〕

中國電力出版社,2002

[