sybase存儲過程-----不定時更新


1.創建存儲過程

  create procedure [procedure_name]
  as begin
         SQL_statements [return]
   end

在存儲過程中可以包含SQL語句,但是不能包含:use, create view, create rule, create default, create proc, create trigger

2.執行存儲過程

exec [procedure_name] [參數]

3.查看自建的存儲過程

select name from sysobjects where type="P"
go

4.查看創建的存儲過程源代碼

 sp_helptext [procedure_name] 

5.創建帶參數的存儲過程 例:

create proc sp_show_stu1 (@sno char(7)) as 
begin 
    select * from STUDENT where SNO = @sno return
end
go

exec sp_show_stu1 @sno='9302303'
go
drop proc sp_show_stu
go

參數可缺省,設置默認值,執行時若沒傳入值則按缺省值執行

5.帶有返回參數的存儲過程

if exists ( select 1 from sysobjects where name = 'test_proc' )
drop proc test_proc
go
 
if exists ( select 1 from sysobjects where name = 't123')
drop table t123
go
 
create table t123(id int primary key, col2 varchar(32) not null)
insert into t123 values(1, 'iihero')
insert into t123 values(2, 'Sybase')
insert into t123 values(3, 'ASE')
go
 
create proc test_proc (@id_min int, @num_t123 int output) with recompile
as
select @num_t123 = count( a.id ) from t123 a where a.id > = @id_min   //計算id大於等於參數@id_min的id數量存入參數@num_123中返回
go 


調用:

1> declare @num_t123 int
2> exec test_proc 1, @num_t123 output
3> go
(return status = 0)

Return parameters:

             
 ----------- 
           3 
(1 row affected)
use pubs2
go

create proc proc_num_sales (@book_id char(6) = null/* 輸入參數 */,
@tot_sales int output/* 輸出參數 */)
as
begin
/* 過程將返回對於給定書號的書的總銷售量 */
 select @tot_sales = sum(qty) 
  from salesdetail 
  where title_id = @book_id 
 return 
end
go


調用:
1> declare @tot_sales int 
2> exec proc_num_sales 'TC7777', @tot_sales output
3> go

6 存儲過程返回狀態值

create proc procedure_name ( …… ) 
as begin 
    SQL_statements 
    return [ integer ] 
end

integer為一整數。如果不指定,系統將自動返回一個 整數值。系統使用0表示該過程執行成功;-1至¨C14 表示該 過程執行有錯,-15至 -99為系統保留值。
用戶一般使用大於 0的整數,或小於 -100的負整數。

7.局部變量,全局變量

局部變量由用戶定義 初值為null

DECLARE @var_name data_type [, @var_name data_type] …… 舉例 declare @msg varchar(40) declare @myqty int, @myid char(4)
使用SELECT語句將指定值賦給局部變量。 
語法
select @var = expression [,@var = expression ] [from… [where…]… 舉例 declare @var1 int select @var1=99
/*
  在一個賦值給局部變量的select 語句中, 可以使用常數、 從表中取值、或使用表達式給局部變量賦值。
  不能使用同一SELECT 語句既給局部變量賦值,又檢索 數據返回給客戶。 — 一個賦值給局部變量的SELECT 語句,不向用戶顯示任 何值。
*/

局部變量必須先用DECLARE定義,再用SELECT語句賦值后才能使用。 局部變量只能使用在T-SQL語句中使用常量的地方。 局部變量不能使用在表名、列名、其它數據庫對象名、保留字使用的地方。 局部變量是標量,它們擁有一個確切的值。 賦值給局部變量的SELECT語句應該返回單個值。如果賦值的SELECT語句沒有返 回值,則該局部變量的值保持不變;如果賦值的SELECT語句返回多個值,則該局 部變量取最后一個返回的值。

8.全局變量

全局變量由sql server系統提供並賦值,用戶不能創建或賦值,由@@開頭

可使用系統存儲過程sp_monitor顯示當前全局變量的值。

常用全局變量  

@@error :由最近一個語句產生的錯誤號

@@rowcount : 被最近一個語句影響的行數 

@@version : sql server版本號

@@max_connections : 允許最大用戶連接量

@@Servername : 該sql_server的名字

select @@version declare @book_price money select @book_price = price from titles where title_id = 'BU1032' if @@rowcount = 0 print 'no such title_id' else begin print 'title_id exists with' select 'price of' = @book_price end

9. 存儲過程流程控制

IF ELSE:
部分語法(ASE) if boolean_expression statement [else [if boolean_expression1] statement1 ] 部分語法(IQ) if boolean_expression then statement [else [if boolean_expression1] statement1 ] End if
IF EXISTS 和 IF NOT EXISTS
語法(ASE)  
if [not] exists (select statement) statement block

 舉例(ASE) 舉例 /* 是否存在姓“Smith”的作者 */ 
declare @lname varchar(40) 
select @lname = 'Smith' if exists ( select * from authors where au_lname = @lname)
select 'here is a ' + @lname else select 'here is no author called'+@lname
BEGIN ... END
功能 當需要將一個以上的SQL 語句作為一組語句對待時, 可以 使用BEGIN 和END 將它們括起來形成一個SQL 語句塊。從 語法上看,一個SQL 語句塊相當於一個SQL 語句。在流控制 語言中, 允許用一個SQL 語句塊替代單個SQL 語句出現的地 方。
語法 BEGIN statement block END
statement block 為一個以上的sql語句
WHILE
語法(ASE) 語法 
while boolean exprission statement block 
語法(IQ) 語法 
while boolean exprission loop statement block end loop

例:
while (select avg(price) from titles) < $40 
begin 
select title_id, price from titles where price > $20 update titles set price = price + $2 
end 
select title_id, price from titles 
print "Too much for the market to bear"

10.嵌套事務

 嵌套事務 是指在存儲過程中的事務的間接嵌套, 即嵌套事務的形成是因為調用 含有事務的過程。@@trancount 記錄了事務嵌套級次。@@trancount在第一個 begin tran語句后值為1,以后每遇到一個 begin tran 語句,不論是否在嵌套 過程中,@@trancount的值增加1;每遇到 一個commit,@@trancount的值就減少 1。若@@trancount的 值 等於 零,表示當前沒有事務;若@@trancount的值不等 於零,其值 假定為i,表明當前處於第 i 級嵌套事務中。對於嵌套事務,直 到 使用@@trancount 的值為零的那個 commit語句被執行,整個 事務才被提交。 select @@trancount

11.存儲過程中的游標

語法 
create proc procedure_name as SQL_statements containing cursor processing 
其中:SQL_statements containing cursor processing 
是指包含游標處理的SQL語句。

舉例

CREATE proc proc_fetch_book 
As BEGIN 
    DECLARE @book_title char(30), @book_id char(6) 
    DECLARE biz_book CURSOR for SECLET title, title_id from titles WHERE type = "business" OPEN biz_book FETCH biz_book INTO @book_title, @book_id …… -- 在這里做某些處理 
CLOSE biz_book DEALLOCATE CURSOR biz_book 
RETURN 
END    

12.帶參數的函數

create function func_test(@id_min int)
returns int
as
begin
    declare @num_t123 int
    select @num_t123 = count( a.id ) from t123 a where a.id > = @id_min
    return @num_t123
end
go

1> select dbo.func_test(1)
2> go
             
 ----------- 
           5

 12.@@error

語句執行成功時 @@error值為0;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM