當前位置:首頁 » 存儲配置 » 存儲過程label

存儲過程label

發布時間: 2022-08-11 20:13:08

① (c#)怎麼得到存儲過程中的輸出參數求例子!

.....
sqlCommand comm=new SqlCommand ();
comm.CommandType=CommandType.StoredProcere;
comm.CommandText=pro_name;
comm.Connection=Conn;
SqlParameter para1=new SqlParameter ("@bianhao",SqlDbType.NVarChar,20);
para1.Direction=ParameterDirection.Output;

comm.ExecuteNonQuery();
conn.Close();
label1.Text=comm.Parameters["@bianhao"].Value.ToString();///此處將存儲過程的返回參數取出

② mysql中的存儲過程、觸發器、視圖的用法

建立存儲過程

Create procere、Create function

下面是它們的格式:
Create proceresp_Name ([proc_parameter ])
routine_body

這里的參數類型可以是 IN OUT INOUTT ,意思和單詞的意思是一樣的,IN 表示是傳進來的參數,
OUT 是表示傳出去的參數,INOUT 是表示傳進來但最終傳回的參數。
Create functionsp_Name ([func_parameter ])
Returns type

Routine_body
Returns type 指定了返回的類型,這里給定的類型與返回值的類型要是一樣的,否則會報錯。

下面給出兩個簡單的例子來說明:

1、 顯示 Mysql 當前版本

執行結果
mysql> use welefen;
Database changed
mysql> delimiter // #定義//作為結束標記符號
mysql> create procere getversion(out param1 varchar(50)) #param1為傳出參數
-> begin
-> select version() into param1; #將版本的信息賦值給 param1
-> end
-> //
Query OK, 0 rows affected (0.00 sec)

mysql> call getversion(@a); #調用getversion()這個存儲過程
-> //
Query OK, 0 rows affected (0.00 sec)

mysql> select @a;
-> //
+--------------------------+
| @a |
+--------------------------+
| 5.1.14-beta-community-nt |
+--------------------------+
1 row in set (0.00 sec)

2、 顯示」hello world」

執行結果
mysql> delimiter //
mysql> create function display(w varchar(20)) returns varchar(50)
-> begin
-> return concat('hello 『,w);
-> end
-> //
Query OK, 0 rows affected (0.05 sec)

mysql> select display("world");
-> //
+------------------+
| display("world") |
+------------------+
| hello world |
+------------------+
1 row in set (0.02 sec)

其他操作存儲過程的語句

前面我們已經知道了怎麼創建存儲過程,下面看看其他常用的用於操作存儲過程的語句。

Alter {procere | function} sp_Name []

Alter 語法是用來改變一個過程或函數的特徵,當你想改變存儲過程或者函數的結構時可以使
用它。當然你也可以先 drop 它再 create。

Drop {procere | function} [if exists] sp_Name

Drop 語法即用來刪除一個存儲程序或者函數,當你創建的一個存儲過程或者函數的名字已經存
在時,你想把以前的給覆蓋掉,那麼此時你就可以使用 drop ,然後在創建。

Show create {procere | function } sp_Name

Show 語法用來顯示創建的存儲過程或者函數的信息。這里的 show 用法跟數據表中的 show 用
法是很相似的。

Show {procere | function} status [like 'partten']

它返回子程序的特徵,如資料庫,名字,類型,創建者及創建和修改日期。如果沒有指定樣式,
根據你使用的語句,所有存儲程序和存儲函數的信息都被列出。

看了以上的幾個語法,你是不是感覺跟對表的操作很相象,那你就想對了,他們確實是很相似
的。帶著一份激動心情我們繼續往下看,你會發現很簡單。

Begin ... End 語句

通過 begin end 可以來包含多個語句,每個語句以「;」結尾。

Declare

用Declare 來聲明局部變數
Declarevar_Name type defaulevaule

Delare 條件

Declarecondition_Name CONDITION FOR condition_value

調用存儲過程

Call

格式:
Callsp_Name [parameter ]

這里的 sp_Name 必須是由 create procere 創建的名稱。它可以通過聲明的參數來傳回值,
它也返回受影響的行數,在 MySQL 中可以通過 mysql_affected_rows() 來獲得。

流程式控制制語句

IF 語句

IFsearch_condition THENstatement_list
[ELSEIFsearch_condition THENstatement_list]
[ELSEstatement_list]
END IF

CASE 語句

CASE case_value
WHEN when_value THENstatement_list
WHEN when_value THENstatement_list]
ELSEstatement_list]
END CASE

LOOP 語句

[begin_label:] LOOP
statement_list
END LOOP [end_label]
LOOP 實現了一個簡單的循環,通過 LEAVE 來退出

LEAVE 語句

LEAVE lable
退出語句,一般可以用在循環中。

ITERATE 語句

ITERATE lable
ITERATE 一般出現在 LOOP、REPEATE、WHILE 里,意思是再次循環。

REPEATE 語句

[begin_label:] REPEAT
statement_list
UNTILsearch_condition
END REPEAT [end_label]
REPEAT 語句內的語句或語句群被重復,直至 search_condition 為真。

WHILE 語句

[begin_label:] WHILEsearch_condition DO
statement_list
END WHILE [end_label]
WHILE 語句內的語句或語句群被重復,直至 search_condition 為真。
運用實例

下面通過幾個例子來講述他們的應用:

對網站用戶的操作

為了簡單,用戶表只有用戶名和密碼的信息.在服務端,我們建立如下的表:

代碼片段
Drop table if exists user;
Create table user(
Id int unsigned not null auto_increment,
Name varchar(20) not null,
Pwd char(32) not null,
Primary key(Id)
);

添加用戶的存儲過程:

代碼片段
Delimiter //
Create procere insertuser(in username varchar(20),in userpwd varchar(32))
Begin
Insert into welefen.user(Name,Pwd) values (username,md5(userpwd));
End
//

驗證用戶的存儲過程:

代碼片段
Delimiter //
Create procere validateuser(in username varchar(20),out param1)
Begin
Select Pwd into param1 from welefen.user where Name=username;
End
//

修改密碼的存儲過程:

代碼片段
Delimiter //
Create procere modifyPwd(in username varchar(20),in userpwd varchar(32))
Begin
Update welefen.user set Pwd=md5(userpwd) where Name=username;
End
//

刪除用戶的存儲過程:

代碼片段
Delimiter //
Create procere deleteuser(in username varchar(20))
Begin
delete from welefen.user where Name=username;
End
//

在客戶端,我們給出如下的程序:

代碼片段
文件名:ProcereUser.php
<?php

if (!mysql_connect("localhost","root","welefen")){
echo "連接資料庫失敗";
}
if (!mysql_select_db("welefen")){
echo "選擇資料庫表失敗<br>";
}

$insert_user=array("welefen","welefen");//這里的welefen分別為用戶名、密碼
if (mysql_query("call insertuser('$insert_user[0]','$insert_user[1]')")){
echo "添加用戶$insert_user[0]成功<br>";
}else {
echo "添加用戶$insert_user[0]失敗<br>";
}

$validate_user=array("welefen","welefen");//這里的welefen分別為用戶名、密碼
mysql_query("call validateuser('$validate_user[0]',@a)");
$Pwd=mysql_query("select @a");
$result=mysql_fetch_array($Pwd);
if ($result[0]==md5($validate_user[1])){
echo "用戶$validate_user[0]驗證正確<br>";
}else {
echo "用戶$validate_user[0]驗證錯誤<br>";
}

$modify_Pwd=array("welefen","weilefeng"); //welefen為用戶名weilefeng為新密碼
if (mysql_query("call modifyPwd('$modify_Pwd[0]','$modify_Pwd[1]')")){
echo "用戶$modigy_Pwd[0]的密碼修改成功<br>";
}else {
echo "用戶$modigy_Pwd[0]的密碼修改失敗<br>";
}

$delete_user=array("welefen"); //welefen為用戶名
if (mysql_query("call deleteuser('$delete_user[0]')")){
echo "用戶$delete_user[0]刪除成功<br>";
}else {
echo "用戶$delete_user[0]刪除失敗<br>";
}
?

程序運行的結果:

執行結果
添加用戶welefen 成功
用戶welefen 驗證正確
用戶welefen 的密碼修改成功
用戶welefen 刪除成功

以上的這個程序簡單的說明了Mysql 中的存儲過程結合PHP 的應用,當然在實際應用要比這個
復雜的多。

驗證角谷猜想

角谷猜想:給定一個整數x,若x%2=1,則x=3*x+1,否則x=x/2,如此循環下去,經過有限步驟必
能得到1。
例 如 : 初 始 整 數 為 9 , 則
9->28->14->7->22->11->34->17->52->26->13->40->20->10->5->16->8->4->2->1

為了說明存儲過程中一些語法的應用,我們通過存儲過程來實現它:

執行結果
mysql> delimiter //
mysql> create procere jgguess(in number int)
-> begin
-> declare param1 int default 1;
-> set @a=concat(number);
-> jiaogu:loop #循環開始
-> set param1=number%2;
-> if param1=1 then set number=number*3+1; #number 為奇數,將它乘3加 1
-> else set number=number/2;
-> end if;
-> set @a=concat(@a,'->',number);
-> if number>1 then iterate jiaogu; #number 不為 1,繼續循環
-> end if;
-> leave jiaogu; #退出循環
-> end loop jiaogu;
-> end
-> //
Query OK, 0 rows affected (0.00 sec)

mysql> call jgguess(11);
-> //
Query OK, 0 rows affected (0.00 sec)

mysql> select @a//
+-------------------------------------------------------+
| @a |
+-------------------------------------------------------+
| 11->34->17->52->26->13->40->20->10->5->16->8->4->2->1 |
+-------------------------------------------------------+
1 row in set (0.02 sec)

在這個存儲過程中,你傳入的參數不能超過int 型數據的范圍,否則就會報錯。

觸發器

觸發器是與表有關的命名資料庫對象,當表上出現特定事件時,將激活該對象。例如當我們向
某個表插入一行數據時發生一個事件或者刪除某個記錄時觸發某個事件。
語法:
CREATE TRIGGER trigger_Name trigger_time trigger_event
ON tbl_Name FOR EACHROW trigger_stmt
trigger_time 是觸發器的動作時間。它可以是 BEFORE 或 AFTER ,以指明觸發器是在激活它的
語句之前或之後觸發。
trigger_event 指明了激活觸發器的語句的類型。trigger_event 可以是下述值之一:
INSERT:將新行插入表時激活觸發器,例如,通過 INSERT、LOADDATA 和 REPLACE 語句;
UPDATE:更改某一行時激活觸發器,例如,通過UPDATE語句;
DELETE:從表中刪除某一行時激活觸發器,例如,通過 DELETE 和 REPLACE 語句。

例如當我們向上面的user 表中增加一個用戶名為「welefen 」時,我們把記錄用戶數的表的值增
加 1;

代碼片段
Create table numuser(
Num int not null default 0
);

Delimiter //
Create trigger testnum after insert on welefen.user for each row
Begin
Update welefen.numuser set Num=Num+1;
End
//

視圖

當我們想得到數據表中某些欄位的信息,並想把他們保存時我們就可以用視圖。

語法:
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_Name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]

例如我們想對上面的用戶表使用視圖,可以這樣:
Create viewwelefen.userview as select * fromwelefen.user;
查看視圖的信息可以使用:
Select * fromwelfen.userview;

③ mysql存儲過程 in 怎麼用

out 表示輸出的參數,存儲過程調用 代碼 需要獲得此參數值。
in 表示輸入參數,默認為in

例1、一個簡單存儲過程游標實例

復制代碼代碼如下:

DELIMITER $$
DROP PROCEDURE IF EXISTS getUserInfo $$
CREATE PROCEDURE getUserInfo(in date_day datetime)
--
-- 實例
-- 存儲過程名為:getUserInfo
-- 參數為:date_day日期格式:2008-03-08
--
BEGIN
declare _userName varchar(12); -- 用戶名
declare _chinese int ; -- 語文
declare _math int ; -- 數學
declare done int;
-- 定義游標
DECLARE rs_cursor CURSOR FOR SELECT username,chinese,math from userInfo where datediff(createDate, date_day)=0;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
-- 獲取昨天的日期
if date_day is null then
set date_day = date_add(now(),interval -1 day);
end if;
open rs_cursor;
cursor_loop:loop
FETCH rs_cursor into _userName, _chinese, _math; -- 取數據

if done=1 then
leave cursor_loop;
end if;
-- 更新表
update infoSum set total=_chinese+_math where UserName=_userName;
end loop cursor_loop;
close rs_cursor;

END$$
DELIMITER ;

例2、存儲過程游標循環跳出現
在MySQL的存儲過程中,游標操作時,需要執行一個conitnue的操作.眾所周知,MySQL中的游標循環操作常用的有三種,LOOP,REPEAT,WHILE.三種循環,方式大同小異.以前從沒用過,所以記下來,方便以後查閱.
1.REPEAT

復制代碼代碼如下:

REPEAT
Statements;
UNTIL expression
END REPEAT
demo
DECLARE num INT;
DECLARE my_string VARCHAR(255);
REPEAT
SET my_string =CONCAT(my_string,num,',');
SET num = num +1;
UNTIL num <5
END REPEAT;

2.WHILE

復制代碼代碼如下:

WHILE expression DO
Statements;
END WHILE
demo
DECLARE num INT;
DECLARE my_string VARCHAR(255);
SET num =1;
SET str ='';
WHILE num < span>10DO
SET my_string =CONCAT(my_string,num,',');
SET num = num +1;
END WHILE;
3.LOOP(這裡面有非常重要的ITERATE,LEAVE)
代碼如下 復制代碼
DECLARE num INT;
DECLARE str VARCHAR(255);
SET num =1;
SET my_string ='';
loop_label: LOOP
IF num <10THEN
LEAVE loop_label;
ENDIF;
SET num = num +1;
IF(num mod3)THEN
ITERATE loop_label;
ELSE
SET my_string =CONCAT(my_string,num,',');
ENDIF;
END LOOP;

PS:可以這樣理解ITERATE就是我們程序中常用的contiune,而ITERATE就是break.當然在MySQL存儲過程,需要循環結構有個名稱,其他都是一樣的.
例3,mysql 存儲過程中使用多游標

先創建一張表,插入一些測試數據:

復制代碼代碼如下:

DROP TABLE IF EXISTS netingcn_proc_test;
CREATE TABLE `netingcn_proc_test` (
`id` INTEGER(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20),
`password` VARCHAR(20),
PRIMARY KEY (`id`)
)ENGINE=InnoDB;
insert into netingcn_proc_test(name, password) values
('procere1', 'pass1'),
('procere2', 'pass2'),
('procere3', 'pass3'),
('procere4', 'pass4');下面就是一個簡單存儲過程的例子:
drop procere IF EXISTS test_proc;
delimiter //
create procere test_proc()
begin
-- 聲明一個標志done, 用來判斷游標是否遍歷完成
DECLARE done INT DEFAULT 0;
-- 聲明一個變數,用來存放從游標中提取的數據
-- 特別注意這里的名字不能與由游標中使用的列明相同,否則得到的數據都是NULL
DECLARE tname varchar(50) DEFAULT NULL;
DECLARE tpass varchar(50) DEFAULT NULL;
-- 聲明游標對應的 SQL 語句
DECLARE cur CURSOR FOR
select name, password from netingcn_proc_test;
-- 在游標循環到最後會將 done 設置為 1
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
-- 執行查詢
open cur;
-- 遍歷游標每一行
REPEAT
-- 把一行的信息存放在對應的變數中
FETCH cur INTO tname, tpass;
if not done then
-- 這里就可以使用 tname, tpass 對應的信息了
select tname, tpass;
end if;
UNTIL done END REPEAT;
CLOSE cur;
end
//
delimiter ;
-- 執行存儲過程
call test_proc();

需要注意的是變數的聲明、游標的聲明和HANDLER聲明的順序不能搞錯,必須是先聲明變數,再申明游標,最後聲明HANDLER。上述存儲過程的例子中只使用了一個游標,那麼如果要使用兩個或者更多游標怎麼辦,其實很簡單,可以這么說,一個怎麼用兩個就是怎麼用的。例子如下:

復制代碼代碼如下:

drop procere IF EXISTS test_proc_1;
delimiter //
create procere test_proc_1()
begin
DECLARE done INT DEFAULT 0;
DECLARE tid int(11) DEFAULT 0;
DECLARE tname varchar(50) DEFAULT NULL;
DECLARE tpass varchar(50) DEFAULT NULL;
DECLARE cur_1 CURSOR FOR
select name, password from netingcn_proc_test;
DECLARE cur_2 CURSOR FOR
select id, name from netingcn_proc_test;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
open cur_1;
REPEAT
FETCH cur_1 INTO tname, tpass;
if not done then
select tname, tpass;
end if;
UNTIL done END REPEAT;
CLOSE cur_1;
-- 注意這里,一定要重置done的值為 0
set done = 0;
open cur_2;
REPEAT
FETCH cur_2 INTO tid, tname;
if not done then
select tid, tname;
end if;
UNTIL done END REPEAT;
CLOSE cur_2;
end
//
delimiter ;
call test_proc_1();

上述代碼和第一個例子中基本一樣,就是多了一個游標聲明和遍歷游標。這里需要注意的是,在遍歷第二個游標前使用了set done = 0,因為當第一個游標遍歷玩後其值被handler設置為1了,如果不用set把它設置為 0 ,那麼第二個游標就不會遍歷了。當然好習慣是在每個打開游標的操作前都用該語句,確保游標能真正遍歷。當然還可以使用begin語句塊嵌套的方式來處理多個游標,例如:

復制代碼代碼如下:

drop procere IF EXISTS test_proc_2;
delimiter //
create procere test_proc_2()
begin
DECLARE done INT DEFAULT 0;
DECLARE tname varchar(50) DEFAULT NULL;
DECLARE tpass varchar(50) DEFAULT NULL;
DECLARE cur_1 CURSOR FOR
select name, password from netingcn_proc_test;
DECLARE cur_2 CURSOR FOR
select id, name from netingcn_proc_test;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
open cur_1;
REPEAT
FETCH cur_1 INTO tname, tpass;
if not done then
select tname, tpass;
end if;
UNTIL done END REPEAT;
CLOSE cur_1;
begin
DECLARE done INT DEFAULT 0;
DECLARE tid int(11) DEFAULT 0;
DECLARE tname varchar(50) DEFAULT NULL;
DECLARE cur_2 CURSOR FOR
select id, name from netingcn_proc_test;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
open cur_2;
REPEAT
FETCH cur_2 INTO tid, tname;
if not done then
select tid, tname;
end if;
UNTIL done END REPEAT;
CLOSE cur_2;
end;
end
//
delimiter ;
call test_proc_2();

④ mysql中的函數和存儲過程的區別

1、通常,函數要明確地返回一個結果值;而過程不用。
然而,事實上可以通過OUTPUT參數來返回多個值

*2、函數不會改變系統的狀態(及數據),而過程可能會改變。
即相同的參數值傳入,函數返回的結果每次都是相同的;但過程並不一定。

因此,
3、函數中,不能使用會改變系統狀態及數據的語句,如DELETE、UPDATE、INSERT、ALTER

⑤ 資料庫中存儲過程的數據怎麼顯示出來

//定義一個函數利用存儲過程從資料庫中讀出數據.當然也可以不用存儲過程
public
static
system.data.datarow
chaxun1(string
name,string
type)
{
system.data.sqlclient.sqlconnection
cn
=
new
sqlconnection(connectionstring.connection.connectionstring);
sqldataadapter
da
=
new
sqldataadapter();
sqlcommand
cmd
=
new
sqlcommand();
da.selectcommand
=
cmd;
cmd.connection
=
cn;
cmd.commandtype
=
commandtype.storedprocere;
cmd.commandtext
=
"cheng1";
sqlparameter
name
=
new
sqlparameter("@名稱",
sqldbtype.nvarchar);
sqlparameter
type
=
new
sqlparameter("@型號",
sqldbtype.nvarchar);
name.value
=
name;
cmd.parameters.add(name);
type.value
=
type;
cmd.parameters.add(type);
dataset
ds
=
new
dataset();
da.fill(ds,
"mytable");
datatable
dtable
=
ds.tables[0];
datarow
dtrow
=
dtable.rows[0];
return
dtrow;//返回讀取的這一行數據
}
//調用函數,將值賦給要顯示它的控制項
this.label6.text
=
chaxun1(combobox1.text,combobox2.text)["數量"].tostring();

⑥ mysql 存儲過程怎麼進行性能優化

在資料庫的開發過程中,經常會遇到復雜的業務邏輯和對資料庫的操作,這個時候就會用存儲過程來封裝資料庫操作。如果項目的存儲過程較多,書寫又沒有一定的規范,將會影響以後的系統維護困難和大存儲過程邏輯的難以理解,另外如果資料庫的數據量大或者項目對存儲過程的性能要求很,就會遇到優化的問題,否則速度有可能很慢,經過親身經驗,一個經過優化過的存儲過程要比一個性能差的存儲過程的效率甚至高幾百倍。下面介紹某一個MySQL存儲過程優化的整個過程。
在本文中,需要被優化的存儲過程如下:
drop procere if exists pr_dealtestnum;
delimiter //

create procere pr_dealtestnum
(
in p_boxnumber varchar(30)
)
pr_dealtestnum_label:begin

insert into tb_testnum select boxnumber,usertype from tb_testnum_tmp where boxnumber= p_boxnumber;

leave pr_dealtestnum_label;
end;
//
delimiter ;
select 'create procere pr_dealtestnumok';
在存儲過程中使用到的表tb_testnum結構如下:
drop table if exists tb_testnum;

create table tb_testnum
(
boxnumber varchar(30) not null,
usertype int not null
);
create unique index idx1_tb_testnum ontb_testnum(boxnumber);
在存儲過程中使用到的另外一張表tb_testnum_tmp結構如下:
drop table if exists tb_testnum_tmp;

create table tb_testnum_tmp
(
boxnumber varchar(30) not null,
usertype int not null
);
create unique index idx1_tb_testnum_tmp ontb_testnum_tmp(boxnumber);
從兩個表的結構可以看出,tb_testnum和tb_testnum_tmp所包含的欄位完全相同,存儲過程pr_dealtestnum的作用是根據輸入參數將tb_testnum_tmp表的數據插入到tb_testnum表中。
很明顯,雖然能夠實現預期的功能,但存儲過程pr_dealtestnum的代碼還有改進的地方。
下面,我們一步一步來對其進行優化。
優化一
存儲過程pr_dealtestnum的主體是一條insert語句,但這條insert語句裡面又包含了select語句,這樣的編寫是不規范的。因此,我們要把這條insert語句拆分成兩條語句,即先把數據從tb_testnum_tmp表中查找出來,再插入到tb_testnum表中。修改之後的存儲過程如下:
drop procere if exists pr_dealtestnum;
delimiter //

create procere pr_dealtestnum
(
in p_boxnumber varchar(30)
)
pr_dealtestnum_label:begin
declare p_usertype int;

select usertype into p_usertype from tb_testnum_tmp where boxnumber=p_boxnumber;

insert into tb_testnum values(p_boxnumber,p_usertype);

leave pr_dealtestnum_label;
end;
//
delimiter ;
select 'create procere pr_dealtestnum ok';
優化二
在向tb_testnum表插入數據之前,要判斷該條數據在表中是否已經存在了,如果存在,則不再插入數據。同理,在從tb_testnum_tmp表中查詢數據之前,要先判斷該條數據在表中是否存在,如果存在,才能從表中查找數據。修改之後的存儲過程如下:
drop procere if exists pr_dealtestnum;
delimiter //

create procere pr_dealtestnum
(
in p_boxnumber varchar(30)
)
pr_dealtestnum_label:begin
declare p_usertype int;
declare p_datacount int;

select count(*) into p_datacount from tb_testnum_tmp where boxnumber=p_boxnumber;
if p_datacount > 0 then
begin
select usertype into p_usertype fromtb_testnum_tmp where boxnumber=p_boxnumber;
end;
else
begin
leave pr_dealtestnum_label;
end;
end if;

select count(*) into p_datacount from tb_testnum where boxnumber=p_boxnumber;
if p_datacount = 0 then
begin
insert into tb_testnum values(p_boxnumber,p_usertype);
leave pr_dealtestnum_label;
end;
else
begin
leave pr_dealtestnum_label;
end;
end if;
end;
//
delimiter ;
select 'create procere pr_dealtestnum ok';
優化三
不管向tb_testnum表插入數據的操作執行成功與否,都應該有一個標識值來表示執行的結果,這樣也方便開發人員對程序流程的追蹤和調試。也就是說,在每條leave語句之前,都應該有一個返回值,我們為此定義一個輸出參數。修改之後的存儲過程如下:
drop procere if exists pr_dealtestnum;
delimiter //

create procere pr_dealtestnum
(
in p_boxnumber varchar(30),
out p_result int -- 0-succ, other-fail
)
pr_dealtestnum_label:begin
declare p_usertype int;
declare p_datacount int;

select count(*) into p_datacount from tb_testnum_tmp where boxnumber=p_boxnumber;
if p_datacount > 0 then
begin
select usertype into p_usertype from tb_testnum_tmp where boxnumber=p_boxnumber;
end;
else
begin
set p_result = 1;
leave pr_dealtestnum_label;
end;
end if;

select count(*) into p_datacount from tb_testnum where boxnumber=p_boxnumber;
if p_datacount = 0 then
begin
insert into tb_testnum values(p_boxnumber,p_usertype);
set p_result = 0;
leave pr_dealtestnum_label;
end;
else
begin
set p_result = 2;
leave pr_dealtestnum_label;
end;
end if;
end;
//
delimiter ;
select 'create procere pr_dealtestnum ok';
優化四
我們注意到「insert into tb_testnum values(p_boxnumber,p_usertype);」語句中,tb_testnum表之後沒有列出具體的欄位名,這個也是不規范的。如果在以後的軟體版本中,tb_testnum表中新增了欄位,那麼這條insert語句極有可能會報錯。因此,規范的寫法是無論tb_testnum表中有多少欄位,在執行insert操作時,都要列出具體的欄位名。修改之後的存儲過程如下:
drop procere if exists pr_dealtestnum;
delimiter //

create procere pr_dealtestnum
(
in p_boxnumber varchar(30),
out p_result int -- 0-succ, other-fail
)
pr_dealtestnum_label:begin
declare p_usertype int;
declare p_datacount int;

select count(*) into p_datacount from tb_testnum_tmp where boxnumber=p_boxnumber;
if p_datacount > 0 then
begin
select usertype into p_usertype from tb_testnum_tmp where boxnumber=p_boxnumber;
end;
else
begin
set p_result = 1;
leave pr_dealtestnum_label;
end;
end if;

select count(*) into p_datacount from tb_testnum where boxnumber=p_boxnumber;
if p_datacount = 0 then
begin
insert into tb_testnum(boxnumber,usertype) values(p_boxnumber,p_usertype);
set p_result = 0;
leave pr_dealtestnum_label;
end;
else
begin
set p_result = 2;
leave pr_dealtestnum_label;
end;
end if;
end;
//
delimiter ;
select 'create procere pr_dealtestnum ok';
優化五
在執行insert語句之後,要用MySQL中自帶的@error_count參數來判斷插入數據是否成功,方便開發人員跟蹤執行結果。如果該參數的值不為0,表示插入失敗,那麼我們就用一個返回參數值來表示操作失敗。修改之後的存儲過程如下:
drop procere if exists pr_dealtestnum;
delimiter //

create procere pr_dealtestnum
(
in p_boxnumber varchar(30),
out p_result int -- 0-succ, other-fail
)
pr_dealtestnum_label:begin
declare p_usertype int;
declare p_datacount int;

select count(*) into p_datacount from tb_testnum_tmp where boxnumber=p_boxnumber;
if p_datacount> 0 then
begin
select usertype into p_usertype from tb_testnum_tmp where boxnumber=p_boxnumber;
end;
else
begin
set p_result = 1;
leave pr_dealtestnum_label;
end;
end if;

select count(*) into p_datacount from tb_testnum where boxnumber=p_boxnumber;
if p_datacount = 0then
begin
insert into tb_testnum(boxnumber,usertype) values(p_boxnumber,p_usertype);
if @error_count<>0 then
begin
set p_result= 3;
end;
else
begin
set p_result= 0;
end;
end if;
end;
else
begin
set p_result = 2;
end;
end if;

leave pr_dealtestnum_label;
end;
//
delimiter ;
select 'create procere pr_dealtestnum ok';

⑦ mssql 存儲過程中循環如何寫,在循環中用什麼語句跳出循環呢,在線等

給你個例子:

for loop是這樣的:
createprocere pro
begin
declare aintdefault1;
label1: loop
if a<6then
selecta;
seta=a+1;
iterate label1;
endif;
leave label1;跳出循環
endloop label1;
end

while是這樣的:
createprocere pro
begin
declare aintdefault4;
while a<10 do
selecta;
seta=a+1;
endwhile;
end

⑧ 如何用vss 和 toad 控制資料庫中存儲過程的版本

VSS 的全稱為 Visual Source Safe 。作為 Microsoft Visual Studio 的一名成員,它主要任務就是負責項目文件的管理,幾乎可以適用任何軟體項目。

源代碼版本控制機制是現代軟體開發中必不可少的管理機制之一,通常藉助版本控制軟體即Source Code Management(SCM) systems或者Version Control systems來實現。版本控制在軟體開發中的重要作用如下:

1)作為代碼倉庫有效的管理軟體開發中各個不同版本的源代碼和文檔,佔用空間小並且方便各個版本代碼和文檔的獲取。

2)對開發小組中對源代碼的訪問進行有效的協調(不同的版本控制軟體採取不同的協調策略)。

常用的版本控制軟體有Clearcase, CVS, PVCS和Microsoft公司的Visual SourceSafe (VSS)。下面對Windows平台開發最常用的Visual SourceSafe 6.0進行簡單介紹。

運行環境

Windows平台下使用VSS開發的典型環境是基於C/S架構的,即開發小組的每個開發者在各自的Windows平台下利用開發工具(比如VC)開發項目中的各個模塊,而配有專門的伺服器集中控制開發過程中的文檔和代碼。伺服器和開發人員的客戶機分別裝有VSS的伺服器和客戶端程序。

安裝

VSS6.0伺服器的安裝

第一步,將Visual Studio6.0的CD1放入CD-ROM,自動進入安裝程序,選擇第二項「Server Applications and Tools(Add Only)」;

第二步,然後在「Server Setups」的「Server Components」中選擇「Visua l Source Safe Server」,按「Install」按鈕後,根據提示放入CD2;

第三步,根據Installation Wizard的提示,繼續安裝過程,選擇安裝路徑,直至提示你重啟以使新安裝的程序生效,重啟計算機。

VSS6.0客戶端的安裝

在VSS6.0伺服器安裝完畢後,就可以在VSS管理員的指導下安裝客戶端的軟體。由於我們是在一個Windows環境的子網內,每台PC客戶機均可通過網上鄰居來訪問VSS伺服器。在VSS管理員為用戶指明VSS客戶端軟體的安裝程序「Netsetup.exe」的位置(VSS伺服器安裝目錄內)後,用戶可以直接通過資源管理器「Explorer」在網上鄰居中找到該程序,並雙擊以運行它。 Netsetup.exe被啟動後進入VSS客戶端的安裝,在提示框中輸入用戶名和工作組名,選擇VSS的安裝路徑後,點擊安裝圖標,進入實際安裝步驟,以後的工作將由系統自動完成。

使用說明

VSS使用過程中要遵循的是lock-modify-unlock流程而不是 -modify-merge流程(比如CVS),即開發人員首先將自己要修改源代碼和文檔從VSS伺服器主備份文件上checkout到本地同時鎖定伺服器上的源代碼和文檔(multi - checkout情況除外),修改完成後checkout到伺服器上同時解除伺服器上文件的鎖定。伺服器集中控制所有的源程序和文檔。

VSS使用中涉及到的概念

1) 項目(project),所謂的項目是一組存在VSS中的文件(任何類型),可以在項目中或是項目之間進行文件的添加、刪除、編輯和共享。一個項目與操作系統的文件夾有很多的相似之處,但它更好地支持文件合並、歷史和版本控制。所有的文件存在VSS資料庫的項目中,開發組成員不能在VSS中的伺服器主備份文件上工作(除了檢查和版本比對等特殊情況外)而是VSS為每個成員在各自的工作目錄(workfolder)下提供一個拷貝以供工作。盡管在沒有工作目錄的情況下也可以查看某個文件,但如要真正在VSS管理下工作,就必須要創建一個工作目錄。

2) 工作目錄(workfolder)是用戶真正對項目文件進行調試修改的地方,當用戶checkout文件時,VSS將就將文件拷貝到用戶的工作目錄下,當用戶修改了該文件並將其checkin時,VSS再將它從用戶的工作目錄拷回到VSS 的資料庫中。在用戶作checkout時,VSS將會自動管理他的工作目錄,諸如創建必要的子目錄。而且工作目錄可以隨時創建或修改。

3) 版本跟蹤。VSS提供版本控制和歷史服務,而且老版本程序和文檔能夠被重新得到以便進行bug跟蹤或其他目的。VSS用日期/時間戳來記錄文件是何時被checkout或是何時被修改的,它主要有三種方法來跟蹤文件和項目的版本:

版本號:這是由VSS維護的內部數碼,用戶對它沒有控制權。每個文件和項目的每個版本都有一個版本號,這些版本號總是一個整數且是遞增的。

標簽(label):這些是用戶賦給某個項目或文件的某個版本的一個字元串,可以是任何格式的長度不超過31字元的字元串。推薦使用。

日期/時間戳:它給出了一個文件何時最後被修改的信息,或者是一個文件何時被checkin。VSS同時支持 12小時和24小時的時間格式。

VSS6.0伺服器的配置和管理

在VSS6.0伺服器安裝完畢後,就可以針對開發項目進行VSS伺服器的配置和管理,這些工作均需由VSS管理員來完成。

第一步,為整個項目創建一個VSS資料庫(在VSS伺服器安裝時,系統已經創建了一個預設資料庫Common),啟動Visual SourceSafe6.0 Admin(Start/Programs/Microsoft Visual Studio6.0/Microsoft Visual SourceSafe/Visual Sou rceSafe6.0 Admin),跳出對話窗口,點擊下拉菜單Tools中的Create Database ...菜單項,將出現對話窗口,選擇新資料庫的路徑,例如創建MyApp資料庫,然後點擊OK按鈕,系統將完成創建工作。

第二步,為新創建的資料庫(例如MyApp)建立用戶,首先需要打開該資料庫,點擊下拉菜單Users/Open SourceSafe Database...,然後選擇資料庫MyApp並打開。再選擇菜單項Add User...,輸入用戶名和口令。然後依次創建其他的用戶。可以為不同的用戶設置針對不同項目文件夾的不同存取許可權,存在兩種方法:1)使用VSS提供的功能。選中Tools/Options…對話框中Porject Security屬性頁的Enable Project Security復選框並選擇Tools/Rights by Project…或者Tools/Rights Assignments for User…進行設置;2)使用windows操作系統的cacls命令。

第三步,在該新建的資料庫中創建項目Project。啟動Microsoft Visual SourceSafe6.0(Start/Programs/Microsoft Visual Studio6.0/Microsoft Visual SourceSafe/Microsoft Visual SourceSafe6.0),出現對話窗口,點擊下拉菜單File中Open SourceSafe Database...,跳出對話框,選擇一個資料庫(例如MyApp),雙擊它或按Open按鈕打開該資料庫;一個項目Project是一組相關的文檔或者是一個文件的集合,VSS允許你以任何的層次結構來存貯和組織你的項目。在VSS資料庫中,你可以創建一個或者多個項目。點擊菜單File中的命令Create Project...,創建一個項目,例如MyProject;創建完項目MyProject後,需要向MyProject中添加文件,點擊File中Add Files命令,將跳出對話框,選擇相應文件或目錄,點擊Add按鈕,將它們添加到MyProject中去。

至此VSS伺服器的配置到此基本上已經完成了,創建了資料庫和項目,並為它們建立了相應的用戶,這樣用戶在客戶端就可以直接登錄到VSS伺服器上,進行在VSS控制管理下的開發工作。

注意:關於伺服器主備份文件的目錄結構應該在項目開發前確定並徵得全體開發人員得同意。實際使用過程中,如果發生伺服器主備份文件目錄結構不合理或者需要臨時增加刪除一些文件的情況,VSS管理員有責任集中進行處理。

VSS6.0客戶端的使用

下面以實驗室數據倉庫項目具體實例說明VSS客戶端使用步驟。

第一步,登錄到VSS伺服器。啟動Microsoft Visual SourceSafe6.0客戶端(Start/Programs/Microsoft Visual Studio6.0/Microsoft Visual SourceSafe/Microsoft Visual SourceSafe6.0),出現如下登錄窗口;

點擊Browse…按鈕,出現下面對話框;

再點擊Browse…按鈕,選擇下圖所示的目錄(DBGROUP伺服器上的共享目錄,如提示輸入DBGROUP伺服器帳號密碼則分別填寫vss/vss);

單擊打開按鈕並在隨後出現的兩個對話框上單擊OK和Open;

重新回到登錄對話框;

輸入管理員指定的用戶名和密碼,即登錄到了VSS伺服器上。

注意:不同得用戶和密碼設置對不同目錄(project)有不同的訪問許可權。

第二步,如果是第一次登錄到VSS伺服器,還需要先設定工作目錄,否則無法進行checkout操作。

工作目錄的設定如下圖所示,選中自己相關模塊的文件夾,單擊右鍵,選擇Set Working Folder…;

在彈出的對話框中選擇自己所設定的工作目錄並單擊OK;

注意:工作目錄設定完成後,伺服器上的文件checkout後均放到該工作目錄中,所以本地機器上的工作目錄應收到保護不能隨意刪除移動。

第三步,checkout文件到本地工作目錄中。選中相關的文件夾,單擊右鍵並選擇Check Out…;

系統彈出checkout對話框如下,單擊OK後該目錄下所有文件和子文件夾即checkout到了本地工作目錄同時伺服器上的文件被鎖定呈紅色,其他用戶不可以再checkout該文件夾(伺服器設置為不允許multicheckout)。

注意:一定要選中Recursive復選框以保證所有子文件夾被checkout。

第四步,對本地工作目錄當中的文件進行修改調試。

第五步,將工作目錄中的文件checkin。如果不將修改後的文件checkin則第四步中對文件的修改無法反映到伺服器上項目文件的主備份中,而且極有可能導致下次checkout後本地文件被舊版本文件覆蓋的情況。在VSS客戶端窗口中選中要checkin的文件夾單擊右鍵選擇Check in…,彈出checkin對話框,單擊OK則本地工作目錄中的文件checkin到了伺服器上同時伺服器上的文件解除鎖定(變黑)。

注意:一定要選中Recursive復選框以保證所有子文件夾被checkin。

建議1

在實際使用過程中,開發人員或者管理員有責任對伺服器上的源程序和文檔定期或不定期的做相應Label,以方便源程序和文檔歷史版本的管理。VSS可以方便的根據Label獲取各個歷史版本(有其他獲取歷史版本的方式,本文推薦使用Label方法)。

添加Label。選中要添加Label的目錄(project)單擊右鍵選中Label…;

設置Label對話框中填入Label名稱和相關Comment,如下圖所示;

如果要獲取某一歷史版本,選中相應的目錄(project)並選擇Show History…,如下圖所示選擇相應復選框並單擊OK;

VSS彈出下面對話框,其中列出了所有管理員所作的Label,選中相應的Label,然後單擊Get按鈕則做Label的相應版本就會checkout到本地工作目錄中。其他按鈕的使用參見幫助;

建議2

開發人員請不要隨意變更VSS伺服器上的目錄(project)結構,不要在目錄(project)中隨便增加刪除文件,不要隨便訪問他人目錄(project)及文件。如伺服器上目錄(project)結構確實需要變化請與管理員聯系。

建議3

嚴格遵守VSS的使用規程,防止因誤操作導致程序或者文檔的丟失。如遇兩人需同時修改統一目錄(project)或文件的情況,請串列處理而非multicheckout方式處理以減少出錯幾率。

⑨ c# label顯示存儲過程查詢結果!!

將查詢結果轉化成String類型,賦給label.text 就可以了

熱點內容
我的世界網易版伺服器空島製作 發布:2025-01-10 05:11:35 瀏覽:845
微信怎麼設置微信密碼忘了怎麼辦啊 發布:2025-01-10 05:09:17 瀏覽:571
凈網密碼是什麼 發布:2025-01-10 05:04:31 瀏覽:821
C語言醉酒 發布:2025-01-10 05:02:07 瀏覽:759
淘寶上傳寶貝品牌怎麼填寫 發布:2025-01-10 04:27:26 瀏覽:552
在計算機的存儲單元中存儲的 發布:2025-01-10 04:26:37 瀏覽:733
壓縮表qb 發布:2025-01-10 04:24:55 瀏覽:999
linuxhttpd訪問 發布:2025-01-10 04:17:57 瀏覽:405
java實時監控 發布:2025-01-10 04:11:46 瀏覽:363
c語言程序試題 發布:2025-01-10 04:05:17 瀏覽:793