當前位置:編程學習大全網 - 源碼下載 - 存儲過程如何使用

存儲過程如何使用

問題壹:SQL 中存儲過程怎麽使用? sql存儲過程及應用

壹、簡介:

存儲過程(Stored Procedure), 是壹組為了完成特定功能的SQL 語句,集經編譯後

存儲在數據庫中,用戶通過指定存儲過程的名字並給出參數,如果該存儲過程帶有參數來執行

它,

在SQL Server 的系列版本中,存儲過程分為兩類:系統提供的存儲過程和用戶自定義存儲過程

系統SP,主要存儲master 數據庫中,並以sp_為前綴並且系統存儲過程主要是從系統表中獲取

信息,從而為系統管理員管理SQL Server。用戶自定義存儲過程是由用戶創建,並能完成

某壹特定功能,如:查詢用戶所需數據信息的存儲過程。

存儲過程具有以下優點

1.存儲過程允許標準組件式編程(模塊化設計)

存儲過程在被創建以後,可以在程序中被多次調用,而不必重新編寫該存儲過程的SQL語句,而

且數

據庫專業人員可隨時對存儲過程進行修改,但對應用程序源代碼毫無影響。因為應用程序源代

碼只包含存

儲過程的調用語句,從而極大地提高了程序的可移植性。

2.存儲過程能夠實現快速的執行速度

如果某壹操作包含大量的Transaction-SQL 代碼,,或分別被多次執行,那麽存儲過程要比批處理

執行速度快很多,因為存儲過程是預編譯的,在首次運行壹個存儲過程時,查詢優化器對其進

行分析優

化,並給出最終被存在系統表中的執行計劃,而批處理的Transaction-SQL 語句在每次運行時

都要進行

編譯和優化,因此速度相對要慢壹些。

3.存儲過程能夠減少網絡流量

對於同壹個針對數據數據庫對象的操作,如查詢修改,如果這壹操作所涉及到的Transaction-SQL

語句被組織成壹存儲過程,那麽當在客戶計算機上調用該存儲過程時,網絡中傳送的只是該調

用語句,否

則將是多條SQL 語句從而大大增加了網絡流量降低網絡負載。

4.存儲過程可被作為壹種安全機制來充分利用

系統管理員通過,對執行某壹存儲過程的權限進行限制,從而能夠實現對相應的數據訪問權限的

制。

二、變量

@I

三、流程控制語句(if else | select case | while )

Select ... CASE 實例

DECLARE @iRet INT, @PKDisp VARCHAR(20)

SET @iRet = '1'

Select @iRet =

CASE

WHEN @PKDisp = '壹' THEN 1

WHEN @PKDisp = '二' THEN 2

WHEN @PKDisp = '三' THEN 3

WHEN @PKDisp = '四' THEN 4

WHEN @PKDisp = '五' THEN 5

ELSE 100

END

四、存儲過程格式

創建存儲過程

Create Proc dbo.存儲過程名

存儲過程參數

AS

執行語句

RETURN

執行存儲過程

GO

*********************************************************/

-- 變量的聲明,sql裏面聲明變量時必須在變量前加@符號

DECLARE @I INT

-- 變量的賦值,變量賦值時變量前必須加set

SET @I = 30

-- 聲明多個變量

DECLARE @s varchar(10),@a INT

-- Sql 裏if語句

IF 條件 BEGIN

執行語句

END

ELSE BEGIN

......>>

問題二:為什麽要使用存儲過程? 幾個去 IBM 面試的兄弟回來抱怨:去了好幾個不同的 IBM項目組,幾乎每個面試官問到數據庫的時候都要問用沒用過存儲過程,煩人不?大家去面的程序員,又不是筆者認為,存儲過程說白了就是壹堆 SQL 的合並。中間加了點邏輯控制。但是存儲過程處理比較復雜的業務時比較實用。比如說,壹個復雜的數據操作。如果妳在前臺處理的話。可能會涉及到多次數據庫連接。但如果妳用存儲過程的話。就只有壹次。從響應時間上來說有優勢。也就是說存儲過程可以給我們帶來運行效率提高的好處。另外,程序容易出現 BUG數據量小的,或者和錢沒關系的項目不用存儲過程也可以正常運作。mysql 的存儲過程還有待實際測試。如果是正式項目,建議妳用 sqlserver 或 oracle的存儲過程。數據與數據之間打交道的話,過程會比程序來的快的多。面試官問有沒有用存儲,實際上就是想知道前來面試的程序員到底做過數據量大的項目沒。如果是培訓出來的,或者小項目小公司出來的,對存儲肯定接觸的少了。所以,要想進大公司,沒有豐富存儲過程經驗,是不行的。錯。存儲過程不僅僅適用於大型項目,對於中小型項目,使用存儲過程也是非常有必要的。其威力和優勢主要體現在:1.存儲過程只在創造時進行編譯,以後每次執行存儲過程都不需再重新編譯,而壹般 SQL語句每執行壹次就編譯壹次,所以使用存儲過程可提高數據庫執行速度。2.當對數據庫進行復雜操作時(如對多個表進行Update,Insert,Query,Delete時),可將此復雜操作用存儲過程封裝起來與數據庫提供的事務處理結合壹起使用。這些操作,如果用程序來完成,就變成了壹條條的 SQL語句,可能要多次連接數據庫。而換成存儲,只需要連接壹次數據庫就可以了。3.存儲過程可以重復使用,可減少數據庫開發人員的工作量。4.安全性高,可設定只有某此用戶才具有對指定存儲過程的使用權。 存儲過程的缺點1:調試麻煩,但是用 PL/SQL Developer 調試很方便!彌補這個缺點。 2:移植問題,數據庫端代碼當然是與數據庫相關的。但是如果是做工程型項目,基本不存在移植問題。 3:重新編譯問題,因為後端代碼是運行前編譯的,如果帶有引用關系的對象發生改變時,受影響的存儲過程、包將需要重新編譯(不過也可以設置成運行時刻自動編譯)。  4:如果在壹個程序系統中大量的使用存儲過程,到程序交付使用的時候隨著用戶需求的增加會導致數據結構的變化,接著就是系統的相關問題了,最後如果用戶想維護該系統可以說是很難很難、而且代價是空前的。維護起來更加麻煩!

問題三:oracle中的存儲過程,有什麽作用,以及怎麽在代碼中使用? 樓上也不知道從哪扒下來的,壹看LZ就是初學,舉點例子不行嗎?

比如建立個測試表

create table test(id int,name varchar2(10),counts int); insert into test values (1,'張三',100);insert into test values (2,'李四',200); mit;

現在給妳出個題目是

查詢所有人加在壹起的counts是多少

創建存儲過程

create or replace p_test --創建存儲過程,asv_counts int;--定義變量begin --開始select sum(counts) into v_counts from test;--將得到的結果放到變量裏DBMS_OUTPUT.PUT_LINE(v_counts);--將結果打印輸出end;--結束

執行這種不帶輸入參數的

begin p_test;end;

然後妳檢查下結果

再給妳創建壹個帶輸入參數的

題目是,查詢id為1的人名是什麽

create or replace p_test1(v_id int)asv_name varchar2(10);beginselect name into v_name from test where id=v_id;DBMS_OUTPUT.PUT_LINE(v_name);end;

執行時這樣

beginp_test1(1);end;

第2個我沒給妳寫註釋,妳看妳自己應該能理解吧

補充壹下,存儲過程不壹定只是執行查詢,也可以做刪除或者修改等sql語句,總體來說就是幾個或N個sql語句的 *** ,來完成系統內某些特定的需求,這些需求可以是壹個sql搞定的,也可以是多個sql組合的

問題四:SQL 存儲過程建立和使用方法? Sql Server的存儲過程是壹個被命名的存儲在服務器上的Transacation-Sql語句 *** ,是封裝重復性工作的壹種方法,它支持用戶聲明的變量、條件執行和其他強大的編程功能。 存儲過程相對於其他的數據庫訪問方法有以下的優點: (1)重復使用。存儲過程可以重復使用,從而可以減少數據庫開發人員的工作量。 (2)提高性能。存儲過程在創建的時候就進行了編譯,將來使用的時候不用再重新編譯。壹般的SQL語句每執行壹次就需要編譯壹次,所以使用存儲過程提高了效率。 (3)減少網絡流量。存儲過程位於服務器上,調用的時候只需要傳遞存儲過程的名稱以及參數就可以了,因此降低了網絡傳輸的數據量。 (4)安全性。參數化的存儲過程可以防止SQL註入式的攻擊,而且可以將Grant、Deny以及Revoke權限應用於存儲過程。 存儲過程壹***分為了三類:用戶定義的存儲過程、擴展存儲過程以及系統存儲過程。 其中,用戶定義的存儲過程又分為Transaction-SQL和CLR兩種類型。 Transaction-SQL 存儲過程是指保存的Transaction-SQL語句 *** ,可以接受和返回用戶提供的參數。 CLR存儲過程是指對.Net Framework公***語言運行時(CLR)方法的引用,可以接受和返回用戶提供的參數。他們在.Net Framework程序集中是作為類的公***靜態方法實現的。(本文就不作介紹了) 創建存儲過程的語句如下:Code

CREATE { PROC | PROCEDURE } [schema_name.] procedure_name [ ; number ]

[ { @parameter [ type_schema_name. ] data_type }

[ VARYING ] [ = default ] [ [ OUT [ PUT ]

] [ ,n ]

[ WITH [ ,n ]

[ FOR REPLICATION ]

AS { [;][ n ] | }

[;]

::=

[ ENCRYPTION ]

[ REPILE ]

[ EXECUTE_AS_Clause ]

::=

{ [ BEGIN ] statements [ END ] }

::=

EXTERNAL NAME assembly_name.class_name.method_name [schema_name]: 代表的是存儲過程所屬的架構的名稱 例如: Create Schema yangyang8848

Go

Create Proc yangyang8848.AllGoods

As Select * From Master_Goods

Go 執行:Exec AllGoods 發生錯誤。 執......>>

問題五:數據庫中的存儲過程怎麽用 啊!!求解..... 10分 關鍵字:procedure

例子:

SQL> create [or replace] procedure procedure_name is

begin

--開始執行

insert into test('10001','Visket');

end;

/

以上操作就能為test表添加壹條信息

執行存儲過程procedure用的命令是exec

記住存儲過程中,語句結尾壹定要有分號

問題六:存儲過程是多用還是少用? 做項目的時候我們有時候會面臨壹個選擇,我們到底是應該多寫存儲過程還是少寫存儲過程了?這個問題的爭論也是由來已久,在不同的公司以及不同的技術負責人那裏往往會得到不同的答案。在實際項目中我們最後所采取的方式,往往不外乎以下三種方式。

第壹種方式是要求所有數據庫操作不使用任何的存儲過程,所有操作都采用標準sql語句來完成,即便是壹個動作需要完成多步數據庫操作,也不使用任何存儲過程,而是在程序代碼中采用事務的方式來完成;第二種方式就是就要求所有的數據庫操作都用存儲過程封裝起來,哪怕是壹個最簡單的insert 操作。在程序代碼看不到壹行 sql語句,如果采用分工合作的方式,程序員甚至都可以不懂sql語法。第三種方式是壹般相對簡單的數據庫操作采用標準sql語句來完成,壹些相對比較復雜的商務邏輯用存儲過程來完成。

當然系統如果采用了hibernate或nhibernate之類的框架,不需要寫sql語句的時候,我想還是應該屬於第三種方式,因為在開發的時候hibernate框架允許我們在適當的時候,拋開其框架自己寫存儲過程和sql語句來完成數據庫操作。其實這三種方式都各有所長,也各有不足。

第壹種方式是所有的數據庫操作都采用標準sql語句來完成的方式,在程序的執行效率上是肯定不如後面兩種方式,系統如果是壹個大型的ERP,這種方式就是絕對不可取的。因為在開發基本結束後,系統如果需要優化或者希望得到優化時,那對開發人員來說就是壹件非常麻煩的事情了,因為優化的重點基本上都是集中數據庫操作上,開發人員所能做的就是壹個個sql語句去檢查,是不是還能進壹步優化,尤其是壹些相對比較復雜的查詢語句是我們所檢查的重點。分頁顯示就是壹個典型的存儲過程提高程序效率的例子。如果使用存儲過程來進行分頁操作,就是利用存儲過程從系統中提取我們所需要的記錄集,分頁的效率就大大提高了。反過來如果我們不用存儲過程進行分頁操作,是利用sql語句的方式把所有記錄集都讀入內存中,然後再從內存中獲取我們所需要的記錄 *** ,這樣分頁效率自然就降低了。當然利用sql語句也能得到我們所需要的記錄,而不是所有記錄,但是那樣麻煩多了,不在我們討論範圍之內。

這種方式另外還有壹個不足之處,壹個系統或壹個項目總會或多或少地存在有壹些容易變化而又復雜的商務邏輯,如果把這些復雜的商務邏輯封裝到存儲過程中,商務邏輯的變化都只涉及存儲過程變化,而與程序代碼不 *** ,那麽不用存儲過程太可惜了。

這種方式雖然有不足,但是壹旦采用這種方式的話,我們如果對該項目進行數據庫移植的時候,開發人員就會覺得當時的決策人是多麽的偉大與英明。而且我們知道access和mysql的以前版本是不提供存儲過程支持的,所有壹些中小項目在這個方面的選擇往往也是不得已而為之。不用存儲過程有壹個優點,調試代碼的時候沒有存儲過程可是要方便很多很多的哦,所以在很多很多的項目中都是采用標準的sql語句而不使用任何的存儲過程。這可是大多程序員用標準sql而不用存儲過程的直接原因,說白了,就是嫌麻煩。

第二種方式是所有的數據庫操作全部采用存儲過程封裝的方式,如果采用這種方式,程序的執行效率相對要高,尤其面對在壹些復雜的商務邏輯時候,不僅在效率方面有明顯的提高,而且當商務邏輯發生變化時,我們開發人員做相應的修改的時候,往往都不用修改程序代碼,僅僅修改存儲過程就能滿足系統變化了。

還有壹個好處就是當我們開發好的壹個系統後,如果發現壹種模式或語言在某些方面難以滿足需求時,我們就可以很快的用兩外壹種語言來重新開發,那個時候就非常方便了。比如在02年中科院下屬的壹個公司就用ASP開......>>

問題七:在SQL中存儲過程的壹般語法是什麽? sql server存儲過程語法

存儲過程就是作為可執行對象存放在數據庫中的壹個或多個SQL命令。

定義總是很抽象。存儲過程其實就是能完成壹定操作的壹組SQL語句,只不過這組語句是放在數據庫中的(這裏我們只談SQL Server)。如果我們通過創建存儲過程以及在ASP中調用存儲過程,就可以避免將SQL語句同ASP代碼混雜在壹起。這樣做的好處至少有三個:

第壹、大大提高效率。存儲過程本身的執行速度非常快,而且,調用存儲過程可以大大減少同數據庫的交互次數。

第二、提高安全性。假如將SQL語句混合在ASP代碼中,壹旦代碼失密,同時也就意味著庫結構失密。

第三、有利於SQL語句的重用。

在ASP中,壹般通過mand對象調用存儲過程,根據不同情況,本文也介紹其它調用方法。為了方便說明,根據存儲過程的輸入輸出,作以下簡單分類:

1. 只返回單壹記錄集的存儲過程

假設有以下存儲過程(本文的目的不在於講述T-SQL語法,所以存儲過程只給出代碼,不作說明):

/*SP1*/

CREATE PROCEDURE dbo.getUserList

as

set nocount on

begin

select * from dbo.[userinfo]

end

go

以上存儲過程取得userinfo表中的所有記錄,返回壹個記錄集。通過mand對象調用該存儲過程的ASP代碼如下:

'**通過mand對象調用存儲過程**

DIM Mym,MyRst

Set Mym = Server.CreateObject(ADODB.mand)

Mym.ActiveConnection = MyConStr 'MyConStr是數據庫連接字串

Mym.mandText = getUserList '指定存儲過程名

Mym.mandType = 4 '表明這是壹個存儲過程

Mym.Prepared = true '要求將SQL命令先行編譯

Set MyRst = Mym.Execute

Set Mym = Nothing

存儲嘩程取得的記錄集賦給MyRst,接下來,可以對MyRst進行操作。

在以上代碼中,mandType屬性表明請求的類型,取值及說明如下:

-1 表明mandText參數的類型無法確定

1 表明mandText是壹般的命令類型

2 表明mandText參數是壹個存在的表名稱

4 表明mandText參數是壹個存儲過程的名稱

還可以通過Connection對象或Recordset對象調用存儲過程,方法分別如下:

'**通過Connection對象調用存儲過程**

DIM MyConn,MyRst

Set MyConn = Server.CreateObject(&qu......>>

問題八:如何使用Oracle存儲過程的壹個簡單例子 樓主您好

---創建表

create table TESTTABLE

(

id1 VARCHAR2(12),

name VARCHAR2(32)

)

select t.id1,t.name from TESTTABLE t

insert into TESTTABLE (ID1, NAME)

values ('1', 'zhangsan');

insert into TESTTABLE (ID1, NAME)

values ('2', 'lisi');

insert into TESTTABLE (ID1, NAME)

values ('3', 'wangwu');

insert into TESTTABLE (ID1, NAME)

values ('4', 'xiaoliu');

insert into TESTTABLE (ID1, NAME)

values ('5', 'laowu');

---創建存儲過程

create or replace procedure test_count

as

v_total number(1);

begin

select count(*) into v_total from TESTTABLE;

DBMS_OUTPUT.put_line('總人數:'||v_total);

end;

--準備

--線對scott解鎖:alter user scott account unlock;

--應為存儲過程是在scott用戶下。還要給scott賦予密碼

---alter user scott identified by tiger;

---去命令下執行

EXECUTE test_count;

----在ql/spl中的sql中執行

begin

-- Call the procedure

test_count;

end;

create or replace procedure TEST_LIST

AS

---是用遊標

CURSOR test_cursor IS select t.id1,t.name from TESTTABLE t;

begin

for Test_record IN test_cursor loop---遍歷遊標,在打印出來

DBMS_OUTPUT.put_line(Test_record.id1||Test_record.name);

END LOOP;

test_count;--同時執行另外壹個存儲過程(TEST_LIST中包含存儲過程test_count)

end;

-----執行存儲過程TEST_LIST

begin

TEST_LIST;

END;

---存儲過程的參數

---IN 定義壹個輸入參數變量,用於傳遞參數給存儲過程

--OUT 定義壹個輸出參數變量,用於從存儲過程獲取數據

---IN OUT 定義壹個輸入、輸出參數變量,兼有以上兩者的功能

......>>

問題九:如何使用sql語句查看存儲過程 --下面這條語句可以查看存儲過程具體代碼exec sp_helptext 存儲過程名--下面這條語句查看數據庫中有哪些存儲過程select * from sysobjects where type='P'

問題十:存儲過程中怎麽使用row 壹般分為十種情況,每種語法各不相同: 1、 創建語法create proc | procedure pro_name [{@參數數據類型} [=默認值] [output], {@參數數據類型} [=默認值] [output], .... ]as SQL_statements2、 創建不帶參數存儲過程--創建存儲過程if (exists (select * from sys.objects where name = 'proc_get_student')) drop proc proc_get_studentgocreate proc proc_get_studentas select * from student;--調用、執行存儲過程exec proc_get_student;3、 修改存儲過程--修改存儲過程alter proc proc_get_studentasselect * from student;4、 帶參存儲過程--帶參存儲過程if (object_id('proc_find_stu', 'P') is not null) drop proc proc_find_stugocreate proc proc_find_stu(@startId int, @endId int)as select * from student where id between @startId and @endIdgoexec proc_find_stu 2, 4;5、 帶通配符參數存儲過程--帶通配符參數存儲過程if (object_id('proc_findStudentByName', 'P') is not null) drop proc proc_findStudentByNamegocreate proc proc_findStudentByName(@name varchar(20) = '%j%', @nextName varchar(20) = '%')as select * from student where name like @name and name like @nextName;goexec proc_findStudentByName;exec proc_findStudentByName '%o%', 't%';6、 帶輸出參數存儲過程if (object_id('proc_getStudentRecord', 'P') is not null) drop proc proc_getStudentRecordgocreate proc proc_getStudentRecord( @id int, --默認輸入參數 @name varchar(20) out, --輸出參數 @age varchar(20) output--輸入輸出參數)as select @name = name, @age = age from student where id = @id and sex = @age;go-- declare @id int, @name varchar(20), @temp varchar(20)......>>

  • 上一篇:白狐任務源代碼
  • 下一篇:尋求殺blackice.exe病毒的方法
  • copyright 2024編程學習大全網