第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

おすすめ

転載: blog.csdn.net/qq_43907296/article/details/110481551