❶ ORA-03113 通信通道的文件結束!求助!
str_content varchar2(200);
count0 number(10);
count1 number(10);
BEGIN
str_content:=substr(CONTENT,1,1);
if str_content = 'B' or str_content = '搜宴b' then
count0:=0;
count1:=0;
這個好悶純像是中毒螞漏咐了吧!!
❷ 存儲過程和觸發器有什麼不同
首先介紹一下觸發器:
觸發器是一種特殊類型的存儲過程,當使用下面的一種或多種數據修改操作在指定表中對數據進行修改時,觸發器會生效:UPDATE、INSERT 或 DELETE。觸發器可以查詢其它表,而且可以包含復雜的 sql 語句。它們主要用於強制復雜的業務規則或要求。例如,可以控制是否允許基於顧客的當前帳戶狀態插入定單。
觸發器還有助於強制引用完整性,以便在添加、更新或刪除表中的行時保留表之間已定義的關系。然而,強制引用完整性的最好方法是在相關表中定義主鍵和外鍵約束。如果使用資料庫關系圖,則可以在表之間創建關系以自動創建外鍵約束。有關詳細信息,請參見表關系。
使用觸發器的優點
觸發器的優點如下:
觸發器是自動的:它們在對表的數據作了任何修改(比如手工輸入或者應用程序採取的操作)之後立即被激活。
觸發器可以通過資料庫中的相關表進行層疊更改。例如,可以在 titles 表的 title_id 列上寫入一個刪除觸發器,以使其它表中的各匹配行採取刪除操作。該觸發器用 title_id 列作為唯一鍵,在 titleauthor、sales 及 roysched 表中對各匹配行進行定位。
觸發器可以強制限制,這些限制比用 CHECK 約束所定義的更復雜。與 CHECK 約束不同的是,觸發器可以引用其它表中的列。
再介紹存儲過程:
存儲過程(Stored Procere)是一組為了完成特定功能的SQL語句集,經編譯後存儲在資料庫中。用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它。存儲過程是資料庫中的一個重要對象,任何一個設計良好的資料庫應用程序都應該用到存儲過程。總的來說,存儲過程具有以下一些優點:
◆存儲過程允許標准組件式編程
◆存儲過程能夠實現較快的執行速度
◆存儲過程能夠減少網路流量
◆存儲過程可被作為一種安全機制來充分利用
使用 SQL Server 中的存儲過程而不使用存儲在客戶計算機本地的 Transact-SQL 程序的優勢有:
允許模塊化程序設計。
只需創建過程一次並將其存儲在資料庫中,以後即可在程序中調用該過程任意次。存儲過程可由在資料庫編程方面有專長的人員創建,並可獨立於程序源代碼而單獨修改。
允許更快執行。
如果某操作需要大量 Transact-SQL 代碼或需重復執行,存儲過程將比 Transact-SQL 批代碼的執行要快。將在創建存儲過程時對其進行分析和優化,並可在首次執行該過程後使用該過程的內存中版本。每次運行 Transact-SQL 語句時,都要從客戶端重復發送,並且在 SQL Server 每次執行這些語句時,都要對其進行編譯和優化。
減少網路流量。
一個需要數百行 Transact-SQL 代碼的操作由一條執行過程代碼的單獨語句就可實現,而不需要在網路中發送數百行代碼。
可作為安全機制使用。
即使對於沒有直接執行存儲過程中語句的許可權的用戶,也可授予他們執行該存儲過程的許可權
❸ SQL中觸發器、存儲過程
1、觸發器:當向表unit插入的數據後,且objectid>10000時,向表test_tab插入數據
create
trigger
trig1
after
insert
on
unit
for
each
row
when
(objectid>10000)
begin
insert
into
test_tab
values(new.objectid,new.name);
end;存儲過程:向表test插入調用存儲時的參數@id,@namecreate
procere
pro_name
@id,@nameasbegininsert
into
test
values(@id,@name);end;2、兩個區別,通過語法可以看出來,觸發器是在執行了一定的操作後,根據觸發條件,系統自動執行某一操作;而存儲過程則是根據你設定的特定操作,來進行相應的操作而已。3、至於什麼時候用觸發器,什麼時候用存儲過程,這個就要根據你的使用情況了。比如說,在對某張表進行了特定操作後,我們讓系統自動去執行一些操作,這個時候就可以使用觸發器。而存儲過程呢,如果我們在某一個事務中要進行的sql操作特別多,那麼我們就可以把這些sql語句用存儲過程來匯總,達到執行一遍存儲過程就可以執行多條sql命令的目的。另外,你聽說的現在不用觸發器,這點明顯是被誤導了,觸發器和存儲過程是各有優點的。舉個例子,比如說電信的通話記錄,你可以想像每天的數據量有多大,那麼為了保證系統的性能,我們就可以設定觸發器來對表的容量進行限定,比如達到了1000萬條數據,我們可以觸發一個清表的操作,那麼這張表就可以保證數據量始終在1000W以下(這個例子不是很合適,但是可以說明點問題)。之所以有人說不用觸發器,這點也是從資料庫性能來說的,說實話,使用觸發器時,如果設計得不合適,那麼對整個系統的性能會造成很大的影響的,所以在設計資料庫時,一定要慎重。整個產品的性能並不是說代碼優化就行了,資料庫的架構設計也應該考慮在其中。
❹ 存儲過程和觸發器的區別和聯系。
我的理解:主要是使用場合不同,還有就是觸發器中不能使用commit(這個應該是約定而不是規定)
存儲過程相當於打包好的sql語法,可以包含復雜的sql操作,在程序調用時只要執行該存儲過程,一句話就可以完成復雜的資料庫操作.
觸發器是也是打包好的sql語法,是一種特殊類型的存儲過程,不由用戶直接調用。創建觸發器時會對其進行定義,以便在對特定表或列作特定類型的數據修改時執行
另外:觸發器相對一般的存儲過程也多了一些在代碼編寫方面的不同,比如說create
trigger
必須是批處理中的第一條語句,並且只能應用到一個表中等等.具體的可以看一下觸發器的說明;http://ke..com/view/1189954.htm
❺ 怎樣添加觸發器 來觸發所對應的存儲過程
對於sp為數據源的dw,可以在column specification 中右鍵可賀升叢以增加,刪除列! 如果不知禪櫻道column specification 在哪裡可笑寬以單擊view 菜單->column specifications
❻ 存儲過程和觸發器到底是個什麼玩意
電腦上的主板上的觸發器不是存儲元件,確實姿春碼是晶體管元件,比如說早期主板上常見的跡哪門電路,不森襪過現在都集成到南橋里了
❼ 請問SQL觸發器用在什麼地方 ...求解...
先說觸發器,再說好處和壞處
-------------------------------
觸發器,主要是用來同步更新數據的,雜亂枯燥的文章不給你轉了,看起來累,舉個例子吧:
假設有兩個表,tab_1 , tab_2
再假設兩個表裡都有「人員性別」這個欄位
tab_1的數據例如: 張三```男```1978`````2002
tab_2的數據例如: 張三```男```銷售科```科長
我要改tab_1中張三的性別為「女」的話,那麼tab_2的性別也該改為「女」,對吧,總不能兩張表的性別不同吧。
如果不用觸發器的話,我們就要改完tab_1,再去改tab_2,使性別都變成女
於是這里可以用到觸發器了:
原理是:當tab_1中某人的性別發生變更後,資料庫自動將tab_2的性別進行同步修改
觸發器也可以這樣應用:
1、當刪除tab_1中的某人信息時,觸發器一並刪除該人的tab_2中的數據
2、在tab_1中新插入一個人員時,觸發器在tab_2中一並新增一條該人的數據
===================================================================================
所以在你建立觸發器時,就要指定該觸發器的用途,是同步更新,還是刪除、插入,由你指定。
基本的語法規則是:
create trigger 觸發器名稱(你自己命名的) on 表 for 用途(delete|update|insert)
as
delete|update|insert語句
----------------------------------------------------------------------
例如:
create trigger tri_A on tab_1 FOR DELETE
AS
delete tab_2 from deleted where tab_2.id = deleted.id;
意思是:在tab_1表上,建立觸發器(tri_A),用於刪除該表的數據時觸發一個事務,什麼事務呢?——刪除tab_2中的該編號人員的記錄。
FOR INSERT、FOR UPDATE分別是建立用於「插入記錄」、「更新數據」的觸發器,例子里的FOR DELETE是用於觸發「刪除記錄」的。
這里還要看清楚,那個delete語句中的表,是from deleted哦,還有,where子句的tab_2.id = deleted.id,不是tab_2.id = tab_1.id哦,deleted.id是指你剛刪除的那條記錄的id(而update、insert,都用inserted.id)
===================================================================================
好處:相對於外部程序、存儲過程,觸發器可以更快更高效的維護數據
壞處:(我自己的經驗)觸發器要用的恰到好處,一個大型應用里,觸發器越少越好,觸發器會使編程時源碼的結構被迫打亂,為將來的程序修改、源碼閱讀帶來很大不便。
❽ 想學asp.net+mysql做一個網路投票系統 為何創建存儲過程總是錯誤 希望大家能幫幫我
先找個mysql的存儲過程的語法看下吧。
❾ ASP.NET投票系統,要求如下,網上找的都有些問題
/* 存儲過程Pr_GetVotes */
CREATE PROCEDURE Pr_GetVotes
AS
SELECT * FROM Votes ORDER BY VoteID
/* 存念肆儲過程Pr_GetSingleVote */
CREATE PROCEDURE Pr_GetSingleVote
(@VoteID int)
AS
SELECT Votes.* FROM Votes WHERE VoteID = @VoteID
/* 存儲過程Pr_AddVote */
CREATE PROCEDURE Pr_AddVote(@Item varchar(100))
AS
INSERT INTO Votes(Item,ItemCount) VALUES(@Item,0) RETURN @@Identity
/* 存儲過程Pr_UpdateVote */
CREATE PROCEDURE Pr_UpdateVote (@VoteID int)
AS
UPDATE Votes SET VoteCount = VoteCount + 1
WHERE VoteID = @VoteID
/* 存儲過程Pr_DeleteVote */
CREATE PROCEDURE Pr_DeleteVote (@VoteID int)
AS
DELETE Votes
WHERE VoteID = @VoteID
public class Vote
{
public SqlDataReader GetVotes()
{
//定義類SQLHelper
SQLHelper.SQLHelper sqlHelper = new SQLHelper.SQLHelper();
//定義保存從資料庫獲取的結果的DataReader
SqlDataReader dr = null;
try
{ //執行存儲過程
sqlHelper.RunProc("Pr_GetVotes", out dr);
}
catch (Exception ex)
{ //拋出執行資料庫異常
SystemError.CreateErrorLog(ex.Message);
throw new Exception(ex.Message, ex);
}
//返回從資料庫獲取的結果
return (dr);
}
public int AddVote(String sItem)
{ //定義類SQLHelper
SQLHelper.SQLHelper sqlHelper = new SQLHelper.SQLHelper();
//創建訪問資料庫的參數
SqlParameter[] paramList = {
sqlHelper.CreateInParam("@Item", SqlDbType.VarChar,100,sItem)
};
try
{ //執行存儲過程
return (sqlHelper.RunProc("Pr_AddVote", paramList));
}
catch (Exception ex)
{ //拋出執行資料庫異常虛並
SystemError.CreateErrorLog(ex.Message);
throw new Exception(ex.Message, ex);
}
}
public void UpdateVote(int nVoteID)
{ //定義類SQLHelper
SQLHelper.SQLHelper sqlHelper = new SQLHelper.SQLHelper();
//創建訪問數據仔譽轎庫的參數
SqlParameter[] paramList = {sqlHelper.CreateInParam("@VoteID", SqlDbType.Int, 4,nVoteID)};
try
{ //執行存儲過程
sqlHelper.RunProc("Pr_UpdateVote", paramList);
}
catch (Exception ex)
{ //拋出執行資料庫異常
SystemError.CreateErrorLog(ex.Message);
throw new Exception(ex.Message, ex);
}
}
public void DeleteVote(int nVoteID)
{ //定義類SQLHelper
SQLHelper.SQLHelper sqlHelper = new SQLHelper.SQLHelper();
//創建訪問資料庫的參數
SqlParameter[] paramList = {
sqlHelper.CreateInParam("@VoteID", SqlDbType.Int, 4,nVoteID)
};
try
{ //執行存儲過程
sqlHelper.RunProc("Pr_DeleteVote", paramList);
}
catch (Exception ex)
{ //拋出執行資料庫異常
SystemError.CreateErrorLog(ex.Message);
throw new Exception(ex.Message, ex);
}
}
}
❿ 如何在觸發器中調用存儲過程
在觸發器中調用存儲過程:
CREATEtriggermalice
onBBSUser
forupdate
as
ifupdate(receive)--當receive欄位發生update事件時觸發
begin
updatebbsuser
setreceive_temp=bu.receive_temp+(i.receive-d.receive)
frombbsuserbu,deletedd,insertedi
wherebu.userid=i.userid
declare@tempfloat,@scopefloat
set@temp=(selectbb.receive_tempfrombbsuserbb,deleteddwherebb.userid=d.userid)
set@scope=(selectbb.receive_scopefromBBSUserbb,deleteddwherebb.userid=d.userid)
if@temp<=@scope
updateuserinfo
setstandnumber=bu.standnumber+(i.receive-d.receive)
fromuserinfobu,deletedd,insertedi
wherebu.userid=d.userid
declare@userint,@comfloat
select@user=d.userid,@com=us.standnumber
fromUserInfous,Deletedd,Insertedi
whereus.userid=d.userid
exectimely@user,@com
if@temp>@scope
begin
updateuserinfo
setstandnumber=bu.standnumber+(@scope-d.receive)
fromuserinfobu,deletedd,insertedi
wherebu.userid=d.userid
updatebbsuser
setreceive_temp=@scope
frombbsuserbu,deletedd
wherebu.userid=d.userid
select@user=d.userid,@com=us.standnumber
fromUserInfous,Deletedd,Insertedi
whereus.userid=d.userid
exectimely@user,@com
end
end