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

存儲過程endif

發布時間: 2023-06-14 10:20:17

存儲過程應用語句有哪些

存儲過程與其他面向對象的程序設計語言一樣,同樣包含數據類型、流程式控制制、語句注釋、輸入和輸出與自己的函數庫。存儲過程的流程式控制制語句有ifelse、casewhenthen、while等,但沒有for循環,跟C++、java等語言的流程式控制制語句非常類似。條件語句條件語句是流程式控制制的重要組成部分,跟其他編程語言一樣,存儲過程允許使用if關鍵字來作條件判斷,除此之外,還可以使用case來實現其他更為靈活的條件控制。

1.if語句(1)if語法if語句是最普通的條件控制語句,其語法簡單易懂,在存儲過程代碼中隨處可見,也是使用頻率最高的條件判斷語句。

語法格式:if…then…elseif…then…else…endif其中,((1)if後面跟判斷條件;

(2)elseif後面跟判斷條件;

(3)then後面跟條件分支語句塊;

(4)可以有多個elseif…then語句塊,也可以沒有;(5)else表示以上條件均不滿足時會執行的語句塊;

(6)整個條件語句塊的最後面以endif表示結束。if語句的用法,以語句「ifcondition_para=1then」開始條件控制,以語句「endif」結束條件控制,中間用「elseif」「else」作條件分支控制。單個sql語句if語法語句格式:if(expr1

⑵ 道與魔:SqlServer存儲過程/函數加/解密

存儲過程 存儲函數的加密 WITH ENCRYPTION<! [if !supportLineBreakNewLine] ><! [endif] >CREATE procere dbo sp_XML_main@table_name nvarchar( )= @dirname nvarchar( )= WITH ENCRYPTIONasbegin endgo存儲過程 存儲函數的解密(以下是一位絕世高人編寫的代碼)if exists (select * from dbo sysobjects where id = object_id(N [dbo] [sp_decrypt] ) and OBJECTPROPERTY(id N IsProcere ) = )drop procere [dbo] [sp_decrypt]GO/* 破解函談氏消數 過程 觸發器 視圖 僅限於SQLSERVER 作者:J All rights reserved*//* 調用示例 解密指定存儲過程exec sp_decrypt AppSP_test 對所有的存儲過程解密declare tb cursor forselect name from sysobjects where xtype= P and status> and name<> sp_decrypt declare @name sysnameopen tbfetch next from tb into @namewhile @@fetch_status= beginprint /* 存儲過程 [ +@name+ ] */ exec sp_decrypt @namefetch next from tb into @nameendclose tbdeallocate tb */if exists (select * from dbo sysobjects where id = object_id(N [dbo] [SP_DECRYPT] ) and OBJECTPROPERTY(id N IsProcere ) = )drop procere [dbo] [SP_DECRYPT]GOCREATE PROCEDURE sp_decrypt(@objectName varchar( ))ASbeginset nocount on 破解位元組不受限制 適用於SQLSERVER 存儲過程 函數 視圖 觸發器 修正上一版視圖觸發器不能正確解密錯誤 發現有錯 請E_MAIL begin trandeclare @objectname varchar( ) @varbin varbinary( )declare @sql nvarchar( ) @sql varchar( ) @sql nvarchar( ) @sql nvarchar( )DECLARE @OrigSpText nvarchar( ) @OrigSpText nvarchar( ) @OrigSpText nvarchar( ) @resultsp nvarchar( )declare @i int @status int @type varchar( ) @parentid intdeclare @colid int @n int @q int @j int @k int @encrypted int @number int核鋒select @type=xtype @parentid=parent_obj from sysobjects where id=object_id(@ObjectName)含知create table #temp(number int colid int ctext varbinary( ) encrypted int status int)insert #temp SELECT number colid ctext encrypted status FROM sy *** ents WHERE id = object_id(@objectName)select @number=max(number) from #tempset @k= while @k<=@numberbeginif exists(select from sy *** ents where id=object_id(@objectname) and number=@k)beginif @type= P set @sql =(case when @number> then ALTER PROCEDURE + @objectName + ; +rtrim(@k)+ WITH ENCRYPTION AS else ALTER PROCEDURE + @objectName+ WITH ENCRYPTION AS end)if @type= TR begindeclare @parent_obj varchar( ) @tr_parent_xtype varchar( )select @parent_obj=parent_obj from sysobjects where id=object_id(@objectName)select @tr_parent_xtype=xtype from sysobjects where id=@parent_objif @tr_parent_xtype= V beginset @sql = ALTER TRIGGER +@objectname+ ON +OBJECT_NAME(@parentid)+ WITH ENCRYPTION INSTERD OF INSERT AS PRINT endelsebeginset @sql = ALTER TRIGGER +@objectname+ ON +OBJECT_NAME(@parentid)+ WITH ENCRYPTION FOR INSERT AS PRINT endendif @type= FN or @type= TF or @type= IF set @sql =(case @type when TF then ALTER FUNCTION + @objectName+ (@a char( )) returns @b table(a varchar( )) with encryption as begin insert @b select @a return end when FN then ALTER FUNCTION + @objectName+ (@a char( )) returns char( ) with encryption as begin return @a end when IF then ALTER FUNCTION + @objectName+ (@a char( )) returns table with encryption as return select @a as a end)if @type= V set @sql = ALTER VIEW +@objectname+ WITH ENCRYPTION AS SELECT as f set @q=len(@sql )set @sql =@sql +REPLICATE( @q)select @sql =REPLICATE( )set @sql = exec(@sql select @colid=max(colid) from #temp where number=@kset @n= while @n<=CEILING( *(@colid )/ ) and len(@sQL )<= beginset @sql =@sql + +@ set @n=@n+ endset @sql =@sql + ) exec sp_executesql @sql N @sql nvarchar( ) @ varchar( ) @sql =@sql @=@sql endset @k=@k+ endset @k= while @k<=@numberbeginif exists(select from sy *** ents where id=object_id(@objectname) and number=@k)beginselect @colid=max(colid) from #temp where number=@kset @n= while @n<=@colidbeginselect @OrigSpText =ctext @encrypted=encrypted @status=status FROM #temp WHERE colid=@n and number=@kSET @OrigSpText =(SELECT ctext FROM sy *** ents WHERE id=object_id(@objectName) and colid=@n and number=@k)if @n= beginif @type= P SET @OrigSpText =(case when @number> then CREATE PROCEDURE + @objectName + ; +rtrim(@k)+ WITH ENCRYPTION AS else CREATE PROCEDURE + @objectName + WITH ENCRYPTION AS end)if @type= FN or @type= TF or @type= IF SET @OrigSpText =(case @type when TF then CREATE FUNCTION + @objectName+ (@a char( )) returns @b table(a varchar( )) with encryption as begin insert @b select @a return end when FN then CREATE FUNCTION + @objectName+ (@a char( )) returns char( ) with encryption as begin return @a end when IF then CREATE FUNCTION + @objectName+ (@a char( )) returns table with encryption as return select @a as a end)if @type= TR beginif @tr_parent_xtype= V beginset @OrigSpText = CREATE TRIGGER +@objectname+ ON +OBJECT_NAME(@parentid)+ WITH ENCRYPTION INSTEAD OF INSERT AS PRINT endelsebeginset @OrigSpText = CREATE TRIGGER +@objectname+ ON +OBJECT_NAME(@parentid)+ WITH ENCRYPTION FOR INSERT AS PRINT endendif @type= V set @OrigSpText = CREATE VIEW +@objectname+ WITH ENCRYPTION AS SELECT as f set @q= len(@OrigSpText )set @OrigSpText =@OrigSpText +REPLICATE( @q)endelsebeginSET @OrigSpText =REPLICATE( )endSET @i= SET @resultsp = replicate(N A (datalength(@OrigSpText ) / ))WHILE @i<=datalength(@OrigSpText )/ BEGINSET @resultsp = stuff(@resultsp @i NCHAR(UNICODE(substring(@OrigSpText @i )) ^ lishixin/Article/program/SQLServer/201311/21965

⑶ SQL Server 里需要定時執行某個存儲過程,存儲過程怎麼寫

1、管理->SQL Server代理->作業(按滑鼠右鍵)->新建作業->
2、新建作業屬性(常規)->名稱[自定義本次作業的名稱]->啟用的方框內是勾號->
分類處可選擇也可用默認的[未分類(本地)]->所有者默認為登錄SQL Server用戶[也可選其它的登錄]->描述[填寫本次工作詳細描述內容];[ 創建作業分類的步驟:SQL Server代理->作業->右鍵選所有任務->添加、修改、刪除 ]
3、新建作業屬性(步驟)->新建->步驟名[自定義第一步驟名稱]->類型[Transact-SQL(TSQL)腳本]->資料庫[要操作的資料庫]->命令[ 如果是簡單的SQL直接寫進去即可,也可用打開按鈕輸入一個已寫好的*.sql文件如果要執行存儲過程,填exec p_procere_name v_parameter1,[ v_parameter2…v_parameterN]]->確定(如果有多個步驟,可以再次調用下面的新建按鈕;也可以對已有的多個步驟插入、編輯、刪除);
4、建作業屬性(調度)->新建調度->名稱[自定義調度名稱]->啟用的方框內是勾號->調度->反復出現->更改[調度時間表]->確定(如果只要保存此作業,不要定時做可以把啟用的方框內是勾號去掉);
5、建作業屬性(通知)->用默認的通知方法就好[當作業失敗時,寫入Windows應用程序系統日誌] ->確定。

⑷ js怎樣調用存儲過程

JDBC調用存儲過程:CallableStatement 在Java裡面調用存儲過程,寫法那是相當的固定: Class.forName(.... Connectionconn=DriverManager.getConnection(.... /** *p是要調用的存儲過程的名字,存儲過程的4個參數,用4個?號佔位符代替 *其餘地方寫法固定 */ CallableStatementcstmt=conn.prepareCall("{callp(?,?,?,?)}"); /** *告訴JDBC,這些個參數,哪些是輸出參數,輸出參數的類型用java.sql.Types來指定 *下面的意思是,第3個?和第4個?是輸出參數,類型是INTEGER的 *Types後面具體寫什麼類型,得看你的存儲過程參數怎麼定義的 */ cstmt.registerOutParameter(3,Types.INTEGER); cstmt.registerOutParameter(4,Types.INTEGER); /** *p是要調用的存儲過程的名字,存儲過程的4個參數,用4個?號佔位符代替 *其餘地方寫法固定 */ CallableStatementcstmt=conn.prepareCall("{callp(?,?,?,?)}"); /** *在我這里第1個?和第2個?是輸入參數,第3個是輸出參數,第4個既輸入又輸出 *下面是設置他們的值,第一個設為3,第二個設為4,第4個設置為5 *沒設第3個,因為它是輸出參數 */ cstmt.setInt(1,3); cstmt.setInt(2,4); cstmt.setInt(4,5); //執行 cstmt.execute(); //把第3個參數的值當成int類型拿出來 intthree=cstmt.getInt(3); System.out.println(three); //把第4個參數的值當成int類型拿出來 intfour=cstmt.getInt(4); System.out.println(four); //用完別忘給人家關了,後開的先關 cstmt.close(); conn.close(); JDBC調用存儲過程,掌握這一個程序足夠了. 以下是上面程序使用的存儲過程的代碼,我用的是Oracle資料庫,不過不論是什麼資料庫,對於你的程序,JDBC這一端寫法都是一樣的. createorreplaceprocerep (v_ainnumber,v_bnumber,v_retoutnumber,v_tempinoutnumber) is begin if(v_a>v_b)then v_ret:=v_a; else v_ret:=v_b; endif; v_temp:=v_temp 1; end;

⑸ SQL 存儲過程問題, 全局變數@@ROWCOUNT

if應該沒有問題。
你的insert語句沒有寫完整,從結構來看,應該是insert...select ..from..where類型,表示從某表裡查詢記錄再插入到另一張表。如果查詢出的記錄數為0(即沒有相關記錄),則@rowcount=0,但不會報錯(這是正常邏輯及語法),即@retcode=0。
所以,你的存儲過程的意思是,如果插入的記錄為0條(也即查出的記錄為0條,不包括查詢出記錄但插入失敗的情況),則返回100,否則返回錯誤。

如果還有疑問,請Hi我~

⑹ Oracle通過存儲過程如何正確返回數據集

typeFuxjResultSetisrefcursor; 還可以定義其他內容 endFuxjPackage; 再定義Oracle存儲過程: (sDMinchar,sMCinchar,pRecCurinoutFuxjPackage.FuxjResultSet)asbeginupdatefuxjExamplesetmc=sMCwheredm=sDM;ifSQL%ROWCOUNT=0thenrollback;openpRecCurfor select'0'resfromal;elsecommit;openpRecCurfor select'1'resfromal;endif;end;和 (sDMinchar,sMCinchar,pRecCurinoutFuxjPackage.FuxjResultSet)asbegininsertintoFuxjExample(dm,mc)values(sDM,sMC);commit;openpRecCurfor select*fromFuxjExample;end;二、在Delphi中調用返回數據集的Oracle存儲過程 可以通過TstoredProc或TQuery控制項來調用執行返回數據集的存儲,數據集通過TstoredProc或TQuery控制項的參數返回源碼天空 ,注意參數的DataType類型為ftCursor,而參數的ParamType類型為ptInputOutput。 使用TstoredProc執行UpdatefuxjExample的相關設置為: objectStoredProc1:TStoredProc

⑺ 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();

熱點內容
安卓如何鑒別手機真假 發布:2025-02-05 14:28:15 瀏覽:119
ffmpeglinux編譯 發布:2025-02-05 14:28:04 瀏覽:544
伺服器如何做界面 發布:2025-02-05 14:27:23 瀏覽:290
訪問學者單位推薦意見 發布:2025-02-05 14:13:05 瀏覽:853
微信密碼鎖忘了怎麼辦 發布:2025-02-05 14:11:07 瀏覽:311
web是什麼文件夾 發布:2025-02-05 14:11:05 瀏覽:235
對信訪問題調查 發布:2025-02-05 14:09:39 瀏覽:984
singlephp 發布:2025-02-05 14:09:24 瀏覽:774
資料庫的欄位命名規則 發布:2025-02-05 13:53:16 瀏覽:684
固定ip自建伺服器訪問 發布:2025-02-05 13:53:03 瀏覽:741