第9章ストアドプロシージャ
9.1_カーソルの使用
9.1.1_カーソルの導入と使用プロセス
行ごとに処理する必要がある場合は、カーソル(CURSOR)を使用します。カーソルは非常に便利です。カーソルは、結果セット(指定された基準に従って選択された行)を開き、結果セット内の行ごとに処理する機能を提供できます。カーソルの種類に基づいて、ロールバックまたはロールフォワードできます。
使用プロセス:
①定義
②フェッチにより設定された結果データの読み取り
③カーソルを開く
open cursor_name
④カーソルを閉じる
close cursor_name
9.1.2_カーソルの宣言
DECLAREステートメントを使用してカーソルを宣言します。カーソルを指定する方法は2つあります。
SQL-92構文:
DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR
FOR select_statement
[ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ]
--举例:
DECLARE student_cursor CURSOR FOR SELECT sno,sname FROM student
Transact-SQL拡張構文:
DECLARE cursor_name CURSOR
[ LOCAL | GLOBAL ]
[ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
[ TYPE_WARNING ]
FOR select_statement
[ FOR UPDATE [ OF column_name [ ,...n ] ] ]
9.1.3_カーソルを使用してデータを読み取る
カーソルからデータを読み取るプロセスでは、結果セットの各行を前後に移動して処理できます。
カーソル定義がスクロール可能になった場合(ステートメントSCROLLキーワードで使用)、いつでも結果セットの任意の行を削除できます。
ために非スクロールカーソル、現在の行の次の行のみを取り出すことができます。結果セットはローカル変数に取り込むことができます。Fetchコマンドの構文は次のとおりです。
FETCH [NEXT | PRIOR| FIRST | LAST | ABSOLUTE {n | @nvar} | RELATIVE {n | @nvar}]
FROM [GLOBAL] cursor_name} | cursor_variable_name}
[INTO @variable_name ][,……n]]
@@ fetch_status!= 0、読書の終わり
--举例
FETCH NEXT FROM student_cursor INTO @ID, @Name
9.1.4_例
ルーチン9.3:カーソルを定義し、学生情報テーブルのすべてのデータを返し、カーソルを開いてから、学生名「Zhang Sanfeng」のレコードが見つかり、学生IDと学生名が次のようになるまで学生情報テーブルをトラバースします。印刷されます。
--定义游标
DECLARE student_cursor CURSOR
FOR SELECT sno,sname FROM student
--定义变量
DECLARE @ID char(10), @Name char(30)
--打开游标
OPEN student_cursor
--指向集合的下一项
FETCH NEXT FROM student_cursor INTO @ID, @Name
--进入whlie循环当全局变量@@fetch_status = 0时进入循环
WHILE @@fetch_status = 0
BEGIN
IF @Name = '张三丰'
BEGIN
PRINT '找到张三丰'
PRINT @ID+@Name
BREAK
END
--指向集合中下一项
FETCH NEXT FROM student_cursor INTO @ID, @Name
END
9.2_ストアドプロシージャ
9.2.1_ストアドプロシージャの概要
手続き型SQLブロックには、名前付きブロックと匿名ブロックの2つの主要なタイプがあります。以前の紹介は匿名ブロックでした。匿名ブロックは、実行するたびにコンパイルする必要があります。データベースに格納したり、他の手続き型SQLブロックから呼び出したりすることはできません。ストアドプロシージャと関数はブロックと呼ばれます。これらはコンパイルされ、永続ストレージモジュールと呼ばれるデータベースに保存されます。これは、繰り返し呼び出して、より高速に実行できます。
(簡単に言うと、ストアドプロシージャは関数のように呼び出すことができ、この関数はデータベースに格納して、将来直接使用することができます)
ストアドプロシージャは、システムストアドプロシージャとユーザー定義のストアドプロシージャの2つのカテゴリに分類されます。
9.2.2_ストアドプロシージャの定義と実行
出力パラメーターなしのストアード・プロシージャー:
USE students--在student数据库上建立存储过程
GO
CREATE PROCEDURE procedure_name @xbbh varchar(4)--procedure_name 存储过程名,@xbbh varchar(4)传入参数及参数类型
AS
begin
--sql过程块
end
--上述中procedure可以简写为proc
出力パラメータを使用したストアドプロシージャ:
USE students--在student数据库上建立存储过程
GO
CTEATE PROCEDURE proc_testOutput
(
@p1 int ,
@p2 int OUTPUT, --输出参数
@p3 int
)
AS
BEGIN
--sql过程块
END
Transact-SQLステートメントのEXECコマンドを使用して、定義されたストアドプロシージャの構文形式を実行します。
USE students
GO
EXEC proc_name
GO
9.2.3_ストアドプロシージャを書き直します
USE students--在student数据库上建立存储过程
GO
--把create改为alter即可
alter PROCEDURE procedure_name @xbbh varchar(4)--procedure_name 存储过程名,@xbbh varchar(4)传入参数及参数类型
AS
begin
--sql过程块
end
9.2.6_ストアドプロシージャを削除する
USE students
GO
DROP PROCEDURE proc_scorepass
9.2.5_例
補足:#nameは一時的なコレクションまたは一時的なストアード・プロシージャーです
新入生の数が最も多い上位の高校を数えます(数はクエリ時に表示されます):(ストアドプロシージャを使用)
--定义游标
declare
find_cursor cursor for
select middle_school from Student group by middle_school order by COUNT(*) desc
--存储过程
use test
go
create procedure find_procedure @number int
as
begin
--定义变量
declare @count int = 0
declare @school char(50)
--打开游标
open find_cursor
--读取游标所指集合的下一项内容
fetch next from find_cursor into @school
while @count < @number
begin
set @count = @count+1
print @count
print @number
print @school
fetch next from find_cursor into @school
end
--关闭游标
close find_cursor
end
--调用存储过程
exec find_procedure 5