ストアド プロシージャで結果を返す
ストアド プロシージャから結果を返す方法は 3 つあります:
1. 結果セットを返す
これは、クライアント アプリケーションが結果を返す最も一般的な方法です。結果セットは、SELECT ステートメントを使用してデータを選択することによって生成されます。結果セットは、永続テーブル、一時テーブル、またはローカル変数から生成できます。結果を別のストアド プロシージャに返すのは効率的なアプローチではありません。ストアド プロシージャは、別のストアド プロシージャによって作成された結果セットにアクセスできません。
たとえば、永続テーブルから結果セットを返します:
USE pubs
GO
CREATE PROCEDURE ap_CreateResultFromPermtable
AS
SELECT au_iname FROM authors
GO
たとえば、ローカル変数から結果セットを作成します:
USE pubs
GO
CREATE PROCEDURE ap_CreateResultFrom Variable
AS
DECLARE @au_iname char(20)
SELECT @au_iname = au_iname FROM authors
WHERE au_id = '172-32-1176'
SELECT @au_id
GO
2 OUTPUTパラメータの値を設定します
2.パラメーターは、ストアド プロシージャからデータを抽出して結果を取得するためによく使用されます。パラメーターがストアド プロシージャに転送されるときに OUTPUT として定義されている場合、パラメーターへの変更はストレージを終了した後も有効になります。
例:
USE pubs
GO
CREATE PROCEDURE ap_SetOutputVar @count integer OUTPUT
AS
SELECT @count = count(*) FROM authors
GO
出力パラメータから値を取得します:
USE pubs
GO
CREATE PROCEDURE ap_GetOutputVar
AS
DECLARE @num integer
EXECUTE ap_SetOutputVar @num OUTPUT
PRINT “カウントは”+convert(char,@num)
GO
· カーソルを OUTPUT パラメータとして使用します。カーソルは OUTPUT (出力) パラメーターを使用できますが、入力パラメーターとして使用することはできません。つまり、結果としてカーソルを返すことはできますが、プロシージャに転送することはできません。カーソルをパラメータとして使用する場合は、OUTPUT および VARYING として修飾する必要があります。 VARYING キーワードは、結果セットが出力パラメータをサポートするために使用されることを示します。これにより、呼び出し元のプロシージャに結果セットを返す機能が提供されます。
例:
pubs
GO
CREATE PROCEDURE GetTitleCount @count_cursor CURSOR VARYING OUTPUT
AS
SET @count_cursor = CURSOR
FOR
SELECT au_id,count(*)
FROM titleauthors
GROUP BY au_id
_OPENまたは
GO
3 , RETURNパラメータでステータスを返します
ストアドプロシージャからエラーコードを返す方法です。ストアド プロシージャは常にステータス値を返します。ユーザーは RETURN ステートメントを使用して独自のステータスを返すこともできます。
例:
USE pubs
GO
CREATE PROCEDURE ap_SetReturnStatus
AS
DECLARE @count integer
SELECT @count = count(*) FROM authors
IF @count = 0
RETURN(1)
ELSE
RETURN (0)
GO
たとえば、返されたステータスを取得します:
USE pubs
GO
CREATE PROCEDURE ap_GetReturnStatus
AS
DECLARE @status integer
EXECUTE @status = ap_SetReturnStatus
IF @status = 1
PRINT “No rows found”
ELSE
PRINT “ suc "cessful"
GO
ストアド プロシージャでのエラー処理
他のプログラムと同様、ストアド プロシージャでのエラー処理は非常に重要です。システムの変更 @@error は、各 Transact SQL ステートメントの実行後に値を取得します。実行が成功した場合、@@error の値は 0 です。エラーが発生した場合、@@error にはエラー情報が含まれます。 @@error システム変数は、ストアド プロシージャのエラー処理にとって非常に重要です。
注: エラーを防ぐために、@@error で設定できる値は sysmessages テーブルの「error」に反映されます。
ストアド プロシージャには 2 種類のエラーがあります:
1. データベース関連のエラー
これらのエラーは、データベース内の不整合によって発生します。システムは、特定のデータベースの問題を示すために 0 以外の @@error 値を使用します。 Transact SQL の実行後、発生したエラーは @@error を通じて取得できます。 @@error がゼロ以外であることが判明した場合は、必要なアクションを実行する必要があり、ほとんどの場合、ストアはそれ以上の処理を行わずに戻ります。次の例は、データベース エラーが発生する一般的な方法を示しています。このプロシージャは、呼び出し側プログラムからアクセスできるように、エラー コードを出力変数に配置します。
pubs を使用
GO
CREATE PROCEDURE ap_TrapDatabaseError @return_code integer OUTPUT
AS
UPDATE authors SET au_iname = "Jackson"
WHERE au_iname = "Smith"
IF @@error <> SELECT @return_code = @ @エラー
Return
end
else
@Return_Code = 0
Go
2、ビジネス ロジック エラー
これらのエラーはビジネス ルール違反によって発生します。これらのエラーを取得するには、まずビジネス ルールを定義し、そのルールに基づいて必要なエラー検出コードをストアド プロシージャに追加する必要があります。これらのエラーを報告するには、RAISERROR ステートメントがよく使用されます。 RAISERROR は、ユーザー定義のエラーを返し、@@error 変数をユーザー定義のエラー番号に設定する機能を提供します。エラー メッセージは動的に作成することも、エラー番号に基づいて「sysmessages」テーブルから取得することもできます。エラーが発生すると、そのエラーはサーバー エラー メッセージの形式でクライアントに返されます。 RAISERROR コマンドの構文は次のとおりです:
RAISERROR (msg_id | msg_str, severity, state
[, argument ][,...n]])
[WITH options]
Msg_id はユーザー定義メッセージの ID を指定します。 、システム テーブルの「sysmessages」に保存されます。
Msg_str は、メッセージを動的に作成するために使用されるメッセージ文字列です。これは、C 言語の「printf」に非常に似ています。
重大度は、ユーザーによって割り当てられたエラー メッセージの重大度を定義します。
State は 1 ~ 127 の任意の整数値で、誤った通話ステータス情報を表します。負の状態値はデフォルトで 1 になります。
OPTIONS は、間違ったカスタマイズ オプションを示します。 OPTIONS の有効な値は次のとおりです:
1) LOG。
エラーをサーバー エラー ログと NT イベント ログに記録します。このオプションには、重大度 19 ~ 25 のメッセージが必要です。このようなメッセージを発行できるのはシステム管理者だけです。
2) ちょっと待ってください。
クライアントサーバーにメッセージを即座に送信します。
3) 設定。
重大度レベルに関係なく、@@error の値を msg_id または 5000 に設定します。
リモート プロシージャ コール
SQL Server は、異なるサーバー上に存在するストアド プロシージャを呼び出す機能を提供します。このようなストアド プロシージャの呼び出しは、リモート ストアド プロシージャ呼び出しと呼ばれます。ある SQL Server から別の SQL Server に呼び出しを転送するには、2 つのサーバーが相互に有効なリモート サーバーとして定義されている必要があります。
リモート サーバーの構成を設定します。
· 特定のサーバーのグループを展開します。
サーバーを右クリックし、[プロパティ] をクリックします。
· 「他の SQL Server が RPC 経由でこの SQL サーバーにリモート接続することを許可する」オプションを設定します。
[クエリ タイムアウト] オプションの値を設定します。これは、クエリ処理からの戻りを待つ秒数を指定します。デフォルト値は 0 で、無制限の待機時間が許可されることを意味します。
· 構成オプションを設定した後、「OK」をクリックします。
· 変更はサーバーを再起動した後に有効になります。
· 他のリモート サーバーでも同じ手順を繰り返します。
リモート ストアド プロシージャを呼び出すには、サーバーの名前を指定し、その後にデータベースの名前と所有者の名前を指定する必要があります。以下は、別のサーバー (Server2) 上のストアド プロシージャを呼び出す例です。
Exec server2.pubs.dbo.myproc
Doudou のコメント:
これは、SQL Server の一般知識の表面的な紹介にすぎません。また、データベース マネージャーではなく、SQL Server データベースに基づいてアプリケーションを作成するプログラマーを対象としています。しかし、アプリケーション プログラマーにとって、データベース管理を理解することも非常に役立ちます。プログラムの最適化にも非常に役立つデータベース管理については、将来的には自分で学ぶことをお勧めします。
上記は SQL Server 7.0 入門 (8) の内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。
——————全文終了————————