TOP をテンプレートにして作成
ホーム
バックアップ
一覧
検索
最終更新
ヘルプ
ログイン
開始行
[[FrontPage]]へ~
-[[リファレンスガイド]]へ~
--[[Firebird SQLリファレンス]]へ~
&br;
----
*Firebird SQLリファレンス:CREATE PROCEDURE, ALTER PROCEDU...
#contents
----
&br;
&aname(create_procedure);
*CREATE PROCEDURE [#a92dc5a5]
入出力のパラメータとアクションを定義し、ストアドプロシ−...
DSQL,isqlで使用できます。~
この文書は、公開されているIB6のSQLレファレンスを基とし...
各リリースノートにおける追加内容に関して反映・統合されて...
またSQLリファレンスの情報が少ないため、IB6 の Data Defi...
情報を元に、独自かつ大幅に補足しました。~
**構文 [#e0c24cc3]
CREATE PROCEDURE name
[(param <datatype> [, param <datatype> …])]
[RETURNS <datatype> [, param <datatype> …])]
AS <procedure_body> [terminator]
<procedure_body> = [<variable_declaration_list>] <block>
IB6/Firebird 1.0:
<variable_declaration_list> =
DECLARE VARIABLE var <datatype>;
[DECLARE VARIABLE var <datatype>; …]
Firebird 1.5以降:(初期化できるようになった)
<variable_declaration_list> =
DECLARE VARIABLE var <datatype> [{'=' | DEFAULT} val...
[DECLARE VARIABLE var <datatype> [{'=' | DEFAULT} va...
<block> =
BEGIN
<compound_statement>
[<compound_statement> …]
END
<compound_statement> = { <block> | statement; }
<datatype> = SMALLINT | INTEGER | BIGINT | FLOAT | DOUBL...
| {DECIMAL | NUMERIC} [(precision [, scale])]
| {DATE | TIME | TIMESTAMP}
| {CHAR | CHARACTER | CHARACTER VARYING | VARCHAR}
[(int)] [CHARACTER SET charname]
| {NCHAR | NATIONAL CHARACTER | NATIONAL CHAR} [VARY...
&br;
&br;
|引数|説明|h
|name|プロシージャの名前です。データベース内において、プ...
|param datatype|プログラムが呼び出すときに使用する、プロ...
|~|''param'' : 入力パラメータ名です。プロシージャ内で一意...
|~|''datatype'' : データ型の指定です。|
|RETURNS param datatype|呼び出したプログラムに、プロシー...
|~|''param'' : 出力パラメータ名です。プロシージャ内で一意...
|~|''datatype'' : データ型の指定です。|
|~|※プロシージャの処理がSUSPEND文に達した場合、その時点で...
|AS|プロシージャのヘッダと本体を分けるためのセパレータで...
|DECLARE VARIABLE var datatype|プロシージャ内で使用するロ...
|statement|処理内容を定義する、プロシージャやトリガを記述...
|terminator|SET TERMで変更した終端文字です。通常の文で使...
|~|・プロシージャ本体の終了を表します。|
|~|・isqlでのみ使用します。|
&br;
**詳細の説明 [#q97c6adb]
CREATE PROCEDURE により、新たなストアドプロシージャを定...
ストアドプロシージャは、自己完結のプロシージャ・トリガ記...
されたプログラムであり、データベースではメタデータの一部...
ストアドプロシージャは入力された値に基づいて処理を行い、...
プログラムに返します。~
&br;
プロシージャ・トリガ記述言語とは、すべての SQL データ操...
の強力な拡張がなされています。(IF … THEN … ELSE, WHILE … DO,
FOR SELECT … DO,例外やエラーハンドリングなど。
PSQLと呼ばれることもあります。)~
&br;
プロシージャには2種類のタイプがあります。
-セレクトタイプのプロシージャ。アプリケーションは、テーブ...
してSELECT文で使用できます。このタイプのプロシージャは、...
もしくはエラーを発生させなければなりません。
-実行タイプのプロシージャ。アプリケーションは、EXECUTE PR...
呼び出すことが出来ます。このタイプのプロシージャは、必ず...
ありません。
&br;
ストアドプロシージャの定義はヘッダと本体の2つで構成さ...
によって分離されています。
-ヘッダの定義内容には、以下のようなものがあります。
--ストアドプロシージャの名前。データベース内において、他...
テーブル名と重ならない、一意な名前である必要があります。
--必要ならば、呼び出したプログラムから受取る入力パラメー...
で構成されたリスト。
--RETURNSに続いて記述を行う、呼び出したプログラムが受取る...
そのデータ型で構成されたリスト。
-本体の定義には、以下のものが含まれます。
--必要ならば、ローカル変数とそのデータ型の宣言。
--BEGIN で始まり END で括られる、プロシージャ・トリガ記述...
いくつかの文で構成されるブロック。ブロック内には、別のブ...
出来ます。つまり、ブロックの多重ネストが可能となっています。
--Firebird1.5では、変数の宣言時に値を初期化出来るようにな...
&br;
''重要'' ストアドプロシージャの本体部分の記述では、終端文...
を使用します。このため、isqlによりストアドプロシージャの...
SET TERM により終端文字をセミコロン以外に変更する必要があ...
このような場合は、CREATE PROCEDURE 文を終了させた後に、終...
セミコロンに戻しましょう。~
&br;
データベースエンジンは、既存のストアドプロシージャの振...
データベースの変更を許しません。(例えば、DROP TABLE、DROP...
isqlの内部コマンド、SHOW PROCEDURES または SHOW PROCEDU...
データベースにおける、プロシージャの定義またはテキスト・...
ことが出来ます。~
&br;
&br;
&aname(psql);
プロシージャ・トリガ記述言語は、ストアドプロシージャや...
記述するためのプログラミング言語です。PSQLと呼称されてい...
のような機能を持っています。
-SQLのデータ操作文(INSERT,UPDATE,DELETE,単行SELECTなど)
-SQLの演算子や評価式。これは、ジェネレータやデータベース...
UDFなども含みます。
-拡張SQL。代入文、コントロールフロー文、コンテキスト値(ト...
イベントポスト文、例外およびエラーハンドリング文。
下表に、ストアドプロシージャのための言語拡張をまとめます。
|>| プロシージャ・トリガ用拡張言語一覧 |h
|引数|説明|h
|BEGIN … END|1つの処理のまとまりであるブロックを定義しま...
|~|・BEGINではじまり、ENDで終わります。|
|~|・共にセミコロンは不要です。|
|~|・Firebird1.5以降では、BEGIN と END の間に文がなくても...
|variable = expression|代入文です。評価式(expression)の値...
|/* comment_text */|プログラマーのコメントです。複数行に...
|EXCEPTION exception_name|指定された例外を発生させます。...
|EXECUTE PROCEDURE proc_name [var [, var …]] [RETURNING_V...
|EXIT|プロシージャ最後の END 文にジャンプします。|
|FOR select_statement DO compound_statement|select_statem...
|compound_statement|1つの文またはブロックです。ブロック...
|IF (condition) THEN compound_statement [ELSE compound_st...
|NEW.column|トリガ用です。INSERT,UPDATE操作で、新しい列値...
|OLD.column|トリガ用です。UPDATE,DELETE操作で、古い列値を...
|POST_EVENT event_name|col|イベントをポストします。event...
|SUSPEND|SELECT 用のプロシージャにおいて、|
|~|・呼び出しアプリケーションが次の FETCH を実行するまで...
|~|・呼び出しアプリケーションにその時点での値を返します。|
|~|・実行タイプのプロシージャではこの文はまったく必要とし...
|WHILE (condition) DO compound_statement|conditionがTRUE...
|~|・conditionの評価を行い、それが TRUE ならばcompound_st...
|~|・conditionがTRUE以外に成るまで、処理を繰り返します。|
|WHEN {error [, error …]|ANY} DO compound_statement|エラ...
|~|・WHEN 文は、ブロックの最後であるEND直前におきます。|
|~|・error : "EXCEPTION exception_name" または "SQLCODE e...
|~|・ANY : すべてのエラーをハンドルします。|
|>|※※※※※ 以降は、1.5で追加されたものです。 ※※※※※|
|[FOR] EXECUTE STATEMENT <string> [INTO :var1, […, :varn]...
|EXCEPTION exception_name value|機能拡張のためvalueが追加...
|LEAVE|BREAK|WHILEやFORなどのループから脱出します。ルー...
|CURRENT_CONNECTION|現在の接続を識別するシステムIDを整数...
|CURRENT_TRANSACTION|現在のトランザクションを識別するシス...
|ROW_COUNT|最後のDML(UPDATEなど)文によって影響を受けた行...
|INSERTING|トリガでのみ使用可能です。トリガ起動の元となっ...
|UPDATING|~|
|DELETING|~|
&br;
&br;
-EXIT,SUSPEND,最後のENDにより、ストアドプロシージャは処理...
ただし、SELECTにより実行したセレクトタイプのプロシージャ...
した場合は、2行目以降のデータを取得するときに、SUSPENDに...
再開されます。次表にまとめましたので参照して下さい。~
|タイプ|SUSPEND|EXIT|END|h
|セレクトタイプ|値を返して処理を一時中断し、アプリケーシ...
|実行(EXECUTE)タイプ|最後のENDにジャンプ。処理再開不可|最...
&br;
-select_statementでのSELECTの結果を受取るために、SELECT〜...
ローカル変数や出力パラメータなどが指定できますが、変数で...
コロン(:)を使用します。
WHERE節などでも変数が使用できますが、同様にコロンが必要で...
&br;
-トリガでは、2つのコンテキスト変数、NEW.〜, OLD.〜を使用...
OLD.変数は、UPDATE,DELETEされる列の現在または以前の値がセ...
NEW.変数は、INSER,UPDATEされる列の新しい値がセットされま...
NEW.はDELETEでは参照できません。これらのコンテキスト変数...
より、値変更時に新旧の値を比較して処理を制御したりするこ...
例えば、次のように使用出来ます。(new,oldが小文字になって...
SET TERM !! ;
CREATE TRIGGER SAVE_SALARY_CHANGE FOR EMPLOYEE
AFTER UPDATE AS
BEGIN
IF (old.salary <> new.salary) THEN
INSERT INTO SALARY_HISTORY (EMP_NO, CHANGE_DATE,
UPDATER_ID, OLD_SALARY, PERCENT_CHANGE)
VALUES (old.emp_no, 'now', USER, old.salary,
(new.salary - old.salary) * 100 / old.salary);
END !!
SET TERM ; !!
&br;
-EXECUTE PROCEDURE などにより、プロシージャから別のプロシ...
ことが出来ます(ネスト可能)。また、自分自身を呼び出す、...
も可能です。ただし、ネストの深さは1000までに制限されてい...
&br;
-WHENにより、エラーや例外をハンドリングできます。
--ハンドルできるものは、自プロシージャ内での例外やエラー...
プロシージャで発生したものや、操作の結果実行されたトリガ...
ハンドリングできます。
--SQLのエラーは SQLCODEにエラーリポートが設定されます。次...
ハンドルするエラーを指定します。SQLCODE -803 は、値重複の...
SET TERM !!;
CREATE PROCEDURE NUMBERPROC (A INTEGER, B INTEGER)
RETURNS (E CHAR(60)) AS
BEGIN
BEGIN
INSERT INTO TABLE1 VALUES (:A, :B);
WHEN SQLCODE -803 DO
E = 'Error Attempting to Insert in TABLE1 - Dupl...
END;
END!!
SET TERM; !!
--データベースエンジンのエラーは GDSCODE にエラーりポート...
SQLCODEと同様に、GDSCODE errorcode のような形で指定します。
--ANYの指定を行うと、すべてのエラーや例外がハンドリングさ...
--DOに続いて、実行したい単一の文もしくはブロックを記述し...
--ハンドル処理を複数記述したい場合、「WHEN〜DO〜;」を連ね...
が出来ます。例えば次のような形です。
/* Error Handling */
WHEN SQLCODE -625 DO
BEGIN
IF ((:product <> 'software') OR (:product <> 'hardware...
(:product <> 'other') OR (:product <> 'N/A')) THEN
result = 'Enter product: software, hardware, other, or...
END
WHEN SQLCODE -803 DO
result = 'Could not insert into table - Duplicate Value';
&br;
&br;
-EXCEPTIONにより、既に定義済みの例外を発生させることが出...
ハンドリングしない場合には、アプリケーションに例外を伝え...
&br;
-EXCEPTIONに関しては、Firebird1.5で機能が拡張されました。
--例外を発生させるときにメッセージを同時に定義できます。~
例1 :
EXCEPTION E_EXCEPTION_1 'Error!';
例2 :
EXCEPTION E_EXCEPTION_2 'Wrong type for record with ID='...
&br;
--例外をキャッチの処理中に、再度例外を発生させることが出...
例1 : SQLエラーをキャッチしてユーザー定義の例外として送出
BEGIN
...
WHEN SQLCODE -802 DO
EXCEPTION E_ARITH_EXCEPT;
WHEN SQLCODE -802 DO
EXCEPTION E_KEY_VIOLATION;
WHEN ANY THEN
EXCEPTION;
END
例2 : エラーのログを取得して、その例外をそのまま送出する。
WHEN ANY DO
BEGIN
INSERT INTO ERROR_LOG (...) VALUES (SQLCODE, ...);
EXCEPTION;
END
&br;
--例外処理ブロックの中で、コンテキスト変数 SQLCODE,GDSCOD...
が整数値で取得出来るようになりました。エラーメッセージ生...
できます。SQLCODEによりSQLエラー、GDSCODEによりデータベー...
が取得できます。
BEGIN
...
WHEN SQLCODE -802 DO
EXCEPTION E_EXCEPTION_1;
WHEN SQLCODE -803 DO
EXCEPTION E_EXCEPTION_2;
WHEN ANY DO
EXECUTE PROCEDURE P_ANY_EXCEPTION(SQLCODE);
END
&br;
&br;
-Firebird1.5以降では、EXECUTE STATEMENT により変数等の文...
を実行することができます。
--戻り値のない操作文(INSERT/UPDATE/DELETE)やDDL文(CREATE/...
を実行する場合は、コマンド文字列を指定するだけで実行でき...
CREATE PROCEDURE DynamicSampleOne (Pname VARCHAR(100))
AS
DECLARE VARIABLE Sql VARCHAR(1024);
DECLARE VARIABLE Par INT;
BEGIN
SELECT MIN(SomeField) FROM SomeTable INTO :Par;
Sql = 'EXECUTE PROCEDURE' || Pname || '(';
Sql = Sql || CAST(Par AS VARCHAR(20)) || ')';
EXECUTE STATEMENT Sql;
END
&br;
--戻り値を受取る必要がある SELECT では、INTO オプションを...
この場合のSELECTは、単行取得タイプのみが実行できます。
CREATE PROCEDURE DynamicSampleTwo (TableName VARCHAR(100))
AS
DECLARE VARIABLE Par INT;
BEGIN
EXECUTE STATEMENT 'SELECT MAX(CheckField) FROM' || Tab...
IF (Par > 100) THEN
EXCEPTION Ex_Overflow 'Overflow in ' || TableName;
END
&br;
--複数行の結果を受取る SELECT では、FOR オプションを使用...
DOの処理が実行されます。
CREATE PROCEDURE DynamicSampleThree (
TextField VARCHAR(100),
TableName VARCHAR(100))
RETURNS (Line VARCHAR(32000))
AS
DECLARE VARIABLE OneLine VARCHAR(100);
BEGIN
Line = ’’;
FOR EXECUTE STATEMENT
'SELECT' || TextField || ' FROM ' || TableName INTO :O...
DO
IF (OneLine IS NOT NULL) THEN
Line = Line || OneLine || ’ ’;
SUSPEND;
END
&br;
&br;
**用例 [#rfdf4bd0]
すべてisqlでの例です。そのため、SET TERM で終端文字を一...
います。
&br;
-次のプロシージャSUB_TOT_BUDGETは、入力パラメータを1つ与...
テーブルDEPARTMENTの列HEAD_DEPTがその値である行を対象にし...
結果を4つの戻り値(総計、平均、最小、最大)として返しま...
返すため、結果は1行のみとなります。SELECTのINTO節にも注...
出力パラメータを直接指定していますが、SELECTのINTO節では...
コロン(:)を使用します。
/* Compute total, average, smallest, and largest departm...
* Parameters:
* department id
* Returns:
* total budget
* average budget
* min budget
* max budget */
SET TERM !! ;
CREATE PROCEDURE SUB_TOT_BUDGET (HEAD_DEPT CHAR(3))
RETURNS (tot_budget DECIMAL(12, 2), avg_budget DECIMAL...
min_budget DECIMAL(12, 2), max_budget DECIMAL(12, 2))
AS
BEGIN
SELECT SUM(BUDGET), AVG(BUDGET), MIN(BUDGET), MAX(BU...
FROM DEPARTMENT
WHERE HEAD_DEPT = :head_dept
INTO :tot_budget, :avg_budget, :min_budget, :max_b...
EXIT;
END !!
SET TERM ; !!
&br;
-次のプロシージャ ORG_CHARTは、セレクトタイプのプロシージ...
組織表を出力します。セレクトタイプなので、結果は複数の行...
--プロシージャの定義です。ローカル変数として、mng_noとdno...
/* Display an org-chart.
*
* Parameters:
* --
* Returns:
* parent department
* department name
* department manager
* manager's job title
* number of employees in the department */
SET TERM !! ;
CREATE PROCEDURE ORG_CHART
RETURNS (HEAD_DEPT CHAR(25), DEPARTMENT CHAR(25),
MNGR_NAME CHAR(20), TITLE CHAR(5), EMP_CNT INTEGER)
AS
DECLARE VARIABLE mngr_no INTEGER;
DECLARE VARIABLE dno CHAR(3);
BEGIN
FOR SELECT H.DEPARTMENT, D.DEPARTMENT, D.MNGR_NO, D....
FROM DEPARTMENT D
LEFT OUTER JOIN DEPARTMENT H ON D.HEAD_DEPT = H.DEPT_NO
ORDER BY D.DEPT_NO
INTO :head_dept, :department, :mngr_no, :dno
DO
BEGIN
IF (:mngr_no IS NULL) THEN
BEGIN
MNGR_NAME = '--TBH--';
TITLE = '';
END
ELSE
SELECT FULL_NAME, JOB_CODE
FROM EMPLOYEE
WHERE EMP_NO = :mngr_no
INTO :mngr_name, :title;
SELECT COUNT(EMP_NO)
FROM EMPLOYEE
WHERE DEPT_NO = :dno
INTO :emp_cnt;
SUSPEND;
END
END !!
SET TERM ; !!
--ORG_CHARTを実行して結果を得たいときは、つぎのクエリを実...
SELECT * FROM ORG_CHART
これにより、例えば次のような内容が出力されます。当然の...
はテーブル(DEPARTMENT,D)の内容に依存します。またこのよう...
出力されるわけではありませんので、その点は注意して下さい。
|HEAD_DEPT|DEPARTMENT|MGR_NAME|TITLE|EMP_CNT|
|=================|=================|==============|====|==|
||Corporate Headquarters|Bender, Oliver H.|CEO|2|
|Corporate Headquarters|Sales and Marketing|MacDonald, Ma...
|Sales and Marketing|Pacific Rim Headquarters|Baldwin, Ja...
|Pacific Rim Headquarters|Field Office: Japan|Yamamoto, T...
|Pacific Rim Headquarters|Field Office: Singapore|--TBH--...
&br;
ORG_CHARTプロシージャでの全情報を得るためにはSELECTによ...
もしも EXECUTE PROCEDURE により実行を行った場合は、最初の...
終了してしまうので、最初の1行目のデータしか得ることが出...
言えば、Corporate Headquarters,Bender, Oliver H.,CEO,2 の...
ます。)~
&br;
**参照 [#n7050d94]
ALTER EXCEPTION , [[ALTER PROCEDURE>#alter_procedure]] ,
CREATE EXCEPTION , DROP EXCEPTION , [[DROP PROCEDURE>#dro...
[[EXECUTE PROCEDURE>#execute_procedure]] , [[SELECT>SELEC...
&br;
これ以上の情報が欲しい場合は、Data Definition Guideの
creating and using procedures を参照して下さい。~
&br;
&br;
----
&br;
&br;
&aname(alter_procedure);
*ALTER PROCEDURE [#q504c051]
既存のストアドプロシージャの定義を変更します。
DSQLとisqlで使用可能です。~
**構文 [#w41fb7a0]
ALTER PROCEDURE name
[(param <datatype> [, param <datatype> …])]
[RETURNS (param <datatype> [, param <datatype> …])]
AS <procedure_body> [terminator]
&br;
&br;
|引数|説明|h
|name|既存のプロシージャの名前です。|
|param datatype|入力パラメータです。詳細は[[CREATE PROCED...
|RETURNS param datatype|出力パラメータです。詳細は[[CREAT...
|procedure_body|プロシージャのボディです。以下を含みます。|
|~|・ローカル変数の定義|
|~|・プロシージャ・トリガ記述言語で記述されたステートメン...
|~|すべての詳細に関しては、[[CREATE PROCEDURE>#create_pro...
|terminator|SET TERMで変更した終端文字です。通常の文で使...
&br;
**詳細の説明 [#w7ec1e88]
ALTER PROCEDURE により、既存のストアドプロシージャの削...
内容などを変更できます。変更できるのは、入出力パラメータ...
&br;
パラメータやボディなどの定義に関しては、
[[CREATE PROCEDURE>#create_procedure]]を参照して下さい。A...
換わるだけで、構文などはまったく同一です。~
&br;
''重要'' 入出力パラメータの数や型の変更は、慎重に行って...
アプリケーションが、それらに依存している場合が多いからで...
&br;
プロシージャの定義を変更できるのは、作成者、SYSDBAユー...
管理者権限を持ったユーザーのみです。~
&br;
使用中のプロシ−ジャに変更を施そうとした場合、使用が終了...
出来ません。~
&br;
ALTER PROCEDURE による変更を行った後に変更をコミットす...
は反映されます。変更を行うことが出きれば、それを使用する...
の再コンパイルや再リンクを行わなくても、その変更は直ちに...
&br;
**用例 [#uf5acd4a]
isqlでの例です。
SET TERM !! ;
ALTER PROCEDURE GET_EMP_PROJ (EMP_NO SMALLINT)
RETURNS (PROJ_ID VARCHAR(20)) AS
BEGIN
FOR SELECT PROJ_ID
FROM EMPLOYEE_PROJECT
WHERE EMP_NO = :emp_no
INTO :proj_id
DO
SUSPEND;
END !!
SET TERM ; !!
&br;
**参照 [#p6895da4]
[[CREATE PROCEDURE>#create_procedure]] ,
[[DROP PROCEDURE>#drop_procedure]] , [[EXECUTE PROCEDURE>...
&br;
&br;
これ以上の情報が欲しい場合は、Data Definition Guideの
creating and using procedures を参照して下さい。~
&br;
&br;
----
&br;
&br;
&aname(drop_procedure);
*DROP PROCEDURE [#g1844a0c]
データベースから、既存のストアドプロシージャを削除します。
DSQL,isqlで使用できます。~
&br;
**構文 [#m7646b4b]
DROP PROCEDURE name
&br;
&br;
|引数|説明|h
|name|既存のプロシージャの名前です。|
&br;
**詳細の説明 [#e5947a2a]
DROP PROCEDURE により、既存のストアドプロシージャをデー...
出来ます。~
&br;
プロシージャが、他のプロシージャ、トリガ、ビューで使用...
削除は出来ません。また、プロシージャが現在使用中の場合も...
&br;
※ isql で SHOW PROCEDURE を実行することにより、プロシー...
プロシージャの依存関係(プロシージャ、トリガ、例外、テーブ...
出来ます。~
&br;
プロシージャを削除できるのは、作成者、SYSDBAユーザー、...
管理者権限を持ったユーザーのみです。~
&br;
**用例 [#xb252c30]
isql でプロシージャを削除する例です。
DROP PROCEDURE GET_EMP_PROJ;
&br;
**参照 [#cfba3a94]
[[ALTER PROCEDURE>#alter_procedure]] ,
[[CREATE PROCEDURE>#create_procedure]] ,
[[EXECUTE PROCEDURE>#execute_procedure]]~
&br;
&br;
----
&br;
&br;
&aname(execute_procedure);
*EXECUTE PROCEDURE [#r7ccf28c]
ストアドプロシ−ジャを呼び出します。
SQL, DSQL, isql で使用できます。~
**構文 [#g118b46d]
SQL 形式:
EXECUTE PROCEDURE [TRANSACTION transaction]
name [:param [[INDICATOR]:indicator]]
[, :param [[INDICATOR]:indicator] …]
[RETURNING_VALUES :param [[INDICATOR]:indicator]
[, :param [[INDICATOR]:indicator] …]];
&br;
DSQL 形式:
EXECUTE PROCEDURE name [param [, param …]]
[RETURNING_VALUES param [, param …]]
&br;
isql 形式:(実行結果は表示される)
EXECUTE PROCEDURE name [param [, param …]]
&br;
&br;
|引数|説明|h
|TRANSACTION transaction|指定したトランザクション下で実行...
|name|既存のプロシージャの名前です。|
|param|入出力パラメータです。ホスト変数または定数です。|
|RETURNING_VALUES :param|出力パラメータを受取るホスト変...
|[INDICATOR] :indicator|NULL値/UNKNOWNを識別する情報を受...
&br;
**詳細の説明 [#u0469797]
EXECUTE PROCEDURE により、指定したストアドプロシージャ...
そのプロシージャが入力パラメータを必要とするならば、ホス...
定数で与えることが出来ます。出力パラメータは、SQL プログ...
RETURNING_VALUE に記述したホスト言語変数に格納されます。i...
パラメータ受け取りの指定は出来ません。isqlでは結果が自動...
されます。~
※ DSQLでは、入力パラメータが必要なときは入力ディスクリプ...
出力パラメータが必要な場合は出力ディスクリプションエリア...
&br;
埋め込みSQLの場合、入力パラメータおよび戻り値の各々の値...
識別するためのインジケーター変数を付与できます。インジケ...
されるのは整数値で、対応するパラメータがNULL/UNKNOWN値で...
います。この値が0未満(負値)であれば NULL/UNKONOWN である...
逆に0以上(正値)であるならば、NULLやUNKNOWNではないことを...
&br;
※ 複数行の結果を取得するタイプのストアドプロシージャを呼...
SELECTを使用してください。詳しくは、[[CREATE PROCEDURE>#c...
を参照して下さい。~
&br;
**用例 [#l0863d6a]
-埋め込みSQLで、プロシージャを実行する例です。入力パラメ...
戻り値(出力パラメータ)は変数で受取っています。
EXEC SQL
EXECUTE PROCEDURE DEPT_BUDGET 100 RETURNING_VALUES :sumb;
&br;
-埋め込みSQLで、入出力パラメータ共に変数を使用しています。
EXEC SQL
EXECUTE PROCEDURE DEPT_BUDGET :rdno RETURNING_VALUES :...
&br;
**参照 [#gd720fd9]
[[ALTER PROCEDURE>#alter_procedure]] ,
[[CREATE PROCEDURE>#create_procedure]] ,
[[DROP PROCEDURE>#drop_procedure]]~
&br;
これ以上の情報が欲しい場合、Embedded SQL Guide の indic...
を参照して下さい。~
&br;
&br;
&br;
----
&br;
&br;
&aname(recreate_procedure);
*RECREATE PROCEDURE [#c2a8df55]
既存のストアドプロシージャを破棄せずに、同じ名前で再作...
SQL,DSQLで使用できます。~
&br;
構文は[[CREATE PROCEDURE>#create_procedure]]とまったく...
&br;
最終行:
[[FrontPage]]へ~
-[[リファレンスガイド]]へ~
--[[Firebird SQLリファレンス]]へ~
&br;
----
*Firebird SQLリファレンス:CREATE PROCEDURE, ALTER PROCEDU...
#contents
----
&br;
&aname(create_procedure);
*CREATE PROCEDURE [#a92dc5a5]
入出力のパラメータとアクションを定義し、ストアドプロシ−...
DSQL,isqlで使用できます。~
この文書は、公開されているIB6のSQLレファレンスを基とし...
各リリースノートにおける追加内容に関して反映・統合されて...
またSQLリファレンスの情報が少ないため、IB6 の Data Defi...
情報を元に、独自かつ大幅に補足しました。~
**構文 [#e0c24cc3]
CREATE PROCEDURE name
[(param <datatype> [, param <datatype> …])]
[RETURNS <datatype> [, param <datatype> …])]
AS <procedure_body> [terminator]
<procedure_body> = [<variable_declaration_list>] <block>
IB6/Firebird 1.0:
<variable_declaration_list> =
DECLARE VARIABLE var <datatype>;
[DECLARE VARIABLE var <datatype>; …]
Firebird 1.5以降:(初期化できるようになった)
<variable_declaration_list> =
DECLARE VARIABLE var <datatype> [{'=' | DEFAULT} val...
[DECLARE VARIABLE var <datatype> [{'=' | DEFAULT} va...
<block> =
BEGIN
<compound_statement>
[<compound_statement> …]
END
<compound_statement> = { <block> | statement; }
<datatype> = SMALLINT | INTEGER | BIGINT | FLOAT | DOUBL...
| {DECIMAL | NUMERIC} [(precision [, scale])]
| {DATE | TIME | TIMESTAMP}
| {CHAR | CHARACTER | CHARACTER VARYING | VARCHAR}
[(int)] [CHARACTER SET charname]
| {NCHAR | NATIONAL CHARACTER | NATIONAL CHAR} [VARY...
&br;
&br;
|引数|説明|h
|name|プロシージャの名前です。データベース内において、プ...
|param datatype|プログラムが呼び出すときに使用する、プロ...
|~|''param'' : 入力パラメータ名です。プロシージャ内で一意...
|~|''datatype'' : データ型の指定です。|
|RETURNS param datatype|呼び出したプログラムに、プロシー...
|~|''param'' : 出力パラメータ名です。プロシージャ内で一意...
|~|''datatype'' : データ型の指定です。|
|~|※プロシージャの処理がSUSPEND文に達した場合、その時点で...
|AS|プロシージャのヘッダと本体を分けるためのセパレータで...
|DECLARE VARIABLE var datatype|プロシージャ内で使用するロ...
|statement|処理内容を定義する、プロシージャやトリガを記述...
|terminator|SET TERMで変更した終端文字です。通常の文で使...
|~|・プロシージャ本体の終了を表します。|
|~|・isqlでのみ使用します。|
&br;
**詳細の説明 [#q97c6adb]
CREATE PROCEDURE により、新たなストアドプロシージャを定...
ストアドプロシージャは、自己完結のプロシージャ・トリガ記...
されたプログラムであり、データベースではメタデータの一部...
ストアドプロシージャは入力された値に基づいて処理を行い、...
プログラムに返します。~
&br;
プロシージャ・トリガ記述言語とは、すべての SQL データ操...
の強力な拡張がなされています。(IF … THEN … ELSE, WHILE … DO,
FOR SELECT … DO,例外やエラーハンドリングなど。
PSQLと呼ばれることもあります。)~
&br;
プロシージャには2種類のタイプがあります。
-セレクトタイプのプロシージャ。アプリケーションは、テーブ...
してSELECT文で使用できます。このタイプのプロシージャは、...
もしくはエラーを発生させなければなりません。
-実行タイプのプロシージャ。アプリケーションは、EXECUTE PR...
呼び出すことが出来ます。このタイプのプロシージャは、必ず...
ありません。
&br;
ストアドプロシージャの定義はヘッダと本体の2つで構成さ...
によって分離されています。
-ヘッダの定義内容には、以下のようなものがあります。
--ストアドプロシージャの名前。データベース内において、他...
テーブル名と重ならない、一意な名前である必要があります。
--必要ならば、呼び出したプログラムから受取る入力パラメー...
で構成されたリスト。
--RETURNSに続いて記述を行う、呼び出したプログラムが受取る...
そのデータ型で構成されたリスト。
-本体の定義には、以下のものが含まれます。
--必要ならば、ローカル変数とそのデータ型の宣言。
--BEGIN で始まり END で括られる、プロシージャ・トリガ記述...
いくつかの文で構成されるブロック。ブロック内には、別のブ...
出来ます。つまり、ブロックの多重ネストが可能となっています。
--Firebird1.5では、変数の宣言時に値を初期化出来るようにな...
&br;
''重要'' ストアドプロシージャの本体部分の記述では、終端文...
を使用します。このため、isqlによりストアドプロシージャの...
SET TERM により終端文字をセミコロン以外に変更する必要があ...
このような場合は、CREATE PROCEDURE 文を終了させた後に、終...
セミコロンに戻しましょう。~
&br;
データベースエンジンは、既存のストアドプロシージャの振...
データベースの変更を許しません。(例えば、DROP TABLE、DROP...
isqlの内部コマンド、SHOW PROCEDURES または SHOW PROCEDU...
データベースにおける、プロシージャの定義またはテキスト・...
ことが出来ます。~
&br;
&br;
&aname(psql);
プロシージャ・トリガ記述言語は、ストアドプロシージャや...
記述するためのプログラミング言語です。PSQLと呼称されてい...
のような機能を持っています。
-SQLのデータ操作文(INSERT,UPDATE,DELETE,単行SELECTなど)
-SQLの演算子や評価式。これは、ジェネレータやデータベース...
UDFなども含みます。
-拡張SQL。代入文、コントロールフロー文、コンテキスト値(ト...
イベントポスト文、例外およびエラーハンドリング文。
下表に、ストアドプロシージャのための言語拡張をまとめます。
|>| プロシージャ・トリガ用拡張言語一覧 |h
|引数|説明|h
|BEGIN … END|1つの処理のまとまりであるブロックを定義しま...
|~|・BEGINではじまり、ENDで終わります。|
|~|・共にセミコロンは不要です。|
|~|・Firebird1.5以降では、BEGIN と END の間に文がなくても...
|variable = expression|代入文です。評価式(expression)の値...
|/* comment_text */|プログラマーのコメントです。複数行に...
|EXCEPTION exception_name|指定された例外を発生させます。...
|EXECUTE PROCEDURE proc_name [var [, var …]] [RETURNING_V...
|EXIT|プロシージャ最後の END 文にジャンプします。|
|FOR select_statement DO compound_statement|select_statem...
|compound_statement|1つの文またはブロックです。ブロック...
|IF (condition) THEN compound_statement [ELSE compound_st...
|NEW.column|トリガ用です。INSERT,UPDATE操作で、新しい列値...
|OLD.column|トリガ用です。UPDATE,DELETE操作で、古い列値を...
|POST_EVENT event_name|col|イベントをポストします。event...
|SUSPEND|SELECT 用のプロシージャにおいて、|
|~|・呼び出しアプリケーションが次の FETCH を実行するまで...
|~|・呼び出しアプリケーションにその時点での値を返します。|
|~|・実行タイプのプロシージャではこの文はまったく必要とし...
|WHILE (condition) DO compound_statement|conditionがTRUE...
|~|・conditionの評価を行い、それが TRUE ならばcompound_st...
|~|・conditionがTRUE以外に成るまで、処理を繰り返します。|
|WHEN {error [, error …]|ANY} DO compound_statement|エラ...
|~|・WHEN 文は、ブロックの最後であるEND直前におきます。|
|~|・error : "EXCEPTION exception_name" または "SQLCODE e...
|~|・ANY : すべてのエラーをハンドルします。|
|>|※※※※※ 以降は、1.5で追加されたものです。 ※※※※※|
|[FOR] EXECUTE STATEMENT <string> [INTO :var1, […, :varn]...
|EXCEPTION exception_name value|機能拡張のためvalueが追加...
|LEAVE|BREAK|WHILEやFORなどのループから脱出します。ルー...
|CURRENT_CONNECTION|現在の接続を識別するシステムIDを整数...
|CURRENT_TRANSACTION|現在のトランザクションを識別するシス...
|ROW_COUNT|最後のDML(UPDATEなど)文によって影響を受けた行...
|INSERTING|トリガでのみ使用可能です。トリガ起動の元となっ...
|UPDATING|~|
|DELETING|~|
&br;
&br;
-EXIT,SUSPEND,最後のENDにより、ストアドプロシージャは処理...
ただし、SELECTにより実行したセレクトタイプのプロシージャ...
した場合は、2行目以降のデータを取得するときに、SUSPENDに...
再開されます。次表にまとめましたので参照して下さい。~
|タイプ|SUSPEND|EXIT|END|h
|セレクトタイプ|値を返して処理を一時中断し、アプリケーシ...
|実行(EXECUTE)タイプ|最後のENDにジャンプ。処理再開不可|最...
&br;
-select_statementでのSELECTの結果を受取るために、SELECT〜...
ローカル変数や出力パラメータなどが指定できますが、変数で...
コロン(:)を使用します。
WHERE節などでも変数が使用できますが、同様にコロンが必要で...
&br;
-トリガでは、2つのコンテキスト変数、NEW.〜, OLD.〜を使用...
OLD.変数は、UPDATE,DELETEされる列の現在または以前の値がセ...
NEW.変数は、INSER,UPDATEされる列の新しい値がセットされま...
NEW.はDELETEでは参照できません。これらのコンテキスト変数...
より、値変更時に新旧の値を比較して処理を制御したりするこ...
例えば、次のように使用出来ます。(new,oldが小文字になって...
SET TERM !! ;
CREATE TRIGGER SAVE_SALARY_CHANGE FOR EMPLOYEE
AFTER UPDATE AS
BEGIN
IF (old.salary <> new.salary) THEN
INSERT INTO SALARY_HISTORY (EMP_NO, CHANGE_DATE,
UPDATER_ID, OLD_SALARY, PERCENT_CHANGE)
VALUES (old.emp_no, 'now', USER, old.salary,
(new.salary - old.salary) * 100 / old.salary);
END !!
SET TERM ; !!
&br;
-EXECUTE PROCEDURE などにより、プロシージャから別のプロシ...
ことが出来ます(ネスト可能)。また、自分自身を呼び出す、...
も可能です。ただし、ネストの深さは1000までに制限されてい...
&br;
-WHENにより、エラーや例外をハンドリングできます。
--ハンドルできるものは、自プロシージャ内での例外やエラー...
プロシージャで発生したものや、操作の結果実行されたトリガ...
ハンドリングできます。
--SQLのエラーは SQLCODEにエラーリポートが設定されます。次...
ハンドルするエラーを指定します。SQLCODE -803 は、値重複の...
SET TERM !!;
CREATE PROCEDURE NUMBERPROC (A INTEGER, B INTEGER)
RETURNS (E CHAR(60)) AS
BEGIN
BEGIN
INSERT INTO TABLE1 VALUES (:A, :B);
WHEN SQLCODE -803 DO
E = 'Error Attempting to Insert in TABLE1 - Dupl...
END;
END!!
SET TERM; !!
--データベースエンジンのエラーは GDSCODE にエラーりポート...
SQLCODEと同様に、GDSCODE errorcode のような形で指定します。
--ANYの指定を行うと、すべてのエラーや例外がハンドリングさ...
--DOに続いて、実行したい単一の文もしくはブロックを記述し...
--ハンドル処理を複数記述したい場合、「WHEN〜DO〜;」を連ね...
が出来ます。例えば次のような形です。
/* Error Handling */
WHEN SQLCODE -625 DO
BEGIN
IF ((:product <> 'software') OR (:product <> 'hardware...
(:product <> 'other') OR (:product <> 'N/A')) THEN
result = 'Enter product: software, hardware, other, or...
END
WHEN SQLCODE -803 DO
result = 'Could not insert into table - Duplicate Value';
&br;
&br;
-EXCEPTIONにより、既に定義済みの例外を発生させることが出...
ハンドリングしない場合には、アプリケーションに例外を伝え...
&br;
-EXCEPTIONに関しては、Firebird1.5で機能が拡張されました。
--例外を発生させるときにメッセージを同時に定義できます。~
例1 :
EXCEPTION E_EXCEPTION_1 'Error!';
例2 :
EXCEPTION E_EXCEPTION_2 'Wrong type for record with ID='...
&br;
--例外をキャッチの処理中に、再度例外を発生させることが出...
例1 : SQLエラーをキャッチしてユーザー定義の例外として送出
BEGIN
...
WHEN SQLCODE -802 DO
EXCEPTION E_ARITH_EXCEPT;
WHEN SQLCODE -802 DO
EXCEPTION E_KEY_VIOLATION;
WHEN ANY THEN
EXCEPTION;
END
例2 : エラーのログを取得して、その例外をそのまま送出する。
WHEN ANY DO
BEGIN
INSERT INTO ERROR_LOG (...) VALUES (SQLCODE, ...);
EXCEPTION;
END
&br;
--例外処理ブロックの中で、コンテキスト変数 SQLCODE,GDSCOD...
が整数値で取得出来るようになりました。エラーメッセージ生...
できます。SQLCODEによりSQLエラー、GDSCODEによりデータベー...
が取得できます。
BEGIN
...
WHEN SQLCODE -802 DO
EXCEPTION E_EXCEPTION_1;
WHEN SQLCODE -803 DO
EXCEPTION E_EXCEPTION_2;
WHEN ANY DO
EXECUTE PROCEDURE P_ANY_EXCEPTION(SQLCODE);
END
&br;
&br;
-Firebird1.5以降では、EXECUTE STATEMENT により変数等の文...
を実行することができます。
--戻り値のない操作文(INSERT/UPDATE/DELETE)やDDL文(CREATE/...
を実行する場合は、コマンド文字列を指定するだけで実行でき...
CREATE PROCEDURE DynamicSampleOne (Pname VARCHAR(100))
AS
DECLARE VARIABLE Sql VARCHAR(1024);
DECLARE VARIABLE Par INT;
BEGIN
SELECT MIN(SomeField) FROM SomeTable INTO :Par;
Sql = 'EXECUTE PROCEDURE' || Pname || '(';
Sql = Sql || CAST(Par AS VARCHAR(20)) || ')';
EXECUTE STATEMENT Sql;
END
&br;
--戻り値を受取る必要がある SELECT では、INTO オプションを...
この場合のSELECTは、単行取得タイプのみが実行できます。
CREATE PROCEDURE DynamicSampleTwo (TableName VARCHAR(100))
AS
DECLARE VARIABLE Par INT;
BEGIN
EXECUTE STATEMENT 'SELECT MAX(CheckField) FROM' || Tab...
IF (Par > 100) THEN
EXCEPTION Ex_Overflow 'Overflow in ' || TableName;
END
&br;
--複数行の結果を受取る SELECT では、FOR オプションを使用...
DOの処理が実行されます。
CREATE PROCEDURE DynamicSampleThree (
TextField VARCHAR(100),
TableName VARCHAR(100))
RETURNS (Line VARCHAR(32000))
AS
DECLARE VARIABLE OneLine VARCHAR(100);
BEGIN
Line = ’’;
FOR EXECUTE STATEMENT
'SELECT' || TextField || ' FROM ' || TableName INTO :O...
DO
IF (OneLine IS NOT NULL) THEN
Line = Line || OneLine || ’ ’;
SUSPEND;
END
&br;
&br;
**用例 [#rfdf4bd0]
すべてisqlでの例です。そのため、SET TERM で終端文字を一...
います。
&br;
-次のプロシージャSUB_TOT_BUDGETは、入力パラメータを1つ与...
テーブルDEPARTMENTの列HEAD_DEPTがその値である行を対象にし...
結果を4つの戻り値(総計、平均、最小、最大)として返しま...
返すため、結果は1行のみとなります。SELECTのINTO節にも注...
出力パラメータを直接指定していますが、SELECTのINTO節では...
コロン(:)を使用します。
/* Compute total, average, smallest, and largest departm...
* Parameters:
* department id
* Returns:
* total budget
* average budget
* min budget
* max budget */
SET TERM !! ;
CREATE PROCEDURE SUB_TOT_BUDGET (HEAD_DEPT CHAR(3))
RETURNS (tot_budget DECIMAL(12, 2), avg_budget DECIMAL...
min_budget DECIMAL(12, 2), max_budget DECIMAL(12, 2))
AS
BEGIN
SELECT SUM(BUDGET), AVG(BUDGET), MIN(BUDGET), MAX(BU...
FROM DEPARTMENT
WHERE HEAD_DEPT = :head_dept
INTO :tot_budget, :avg_budget, :min_budget, :max_b...
EXIT;
END !!
SET TERM ; !!
&br;
-次のプロシージャ ORG_CHARTは、セレクトタイプのプロシージ...
組織表を出力します。セレクトタイプなので、結果は複数の行...
--プロシージャの定義です。ローカル変数として、mng_noとdno...
/* Display an org-chart.
*
* Parameters:
* --
* Returns:
* parent department
* department name
* department manager
* manager's job title
* number of employees in the department */
SET TERM !! ;
CREATE PROCEDURE ORG_CHART
RETURNS (HEAD_DEPT CHAR(25), DEPARTMENT CHAR(25),
MNGR_NAME CHAR(20), TITLE CHAR(5), EMP_CNT INTEGER)
AS
DECLARE VARIABLE mngr_no INTEGER;
DECLARE VARIABLE dno CHAR(3);
BEGIN
FOR SELECT H.DEPARTMENT, D.DEPARTMENT, D.MNGR_NO, D....
FROM DEPARTMENT D
LEFT OUTER JOIN DEPARTMENT H ON D.HEAD_DEPT = H.DEPT_NO
ORDER BY D.DEPT_NO
INTO :head_dept, :department, :mngr_no, :dno
DO
BEGIN
IF (:mngr_no IS NULL) THEN
BEGIN
MNGR_NAME = '--TBH--';
TITLE = '';
END
ELSE
SELECT FULL_NAME, JOB_CODE
FROM EMPLOYEE
WHERE EMP_NO = :mngr_no
INTO :mngr_name, :title;
SELECT COUNT(EMP_NO)
FROM EMPLOYEE
WHERE DEPT_NO = :dno
INTO :emp_cnt;
SUSPEND;
END
END !!
SET TERM ; !!
--ORG_CHARTを実行して結果を得たいときは、つぎのクエリを実...
SELECT * FROM ORG_CHART
これにより、例えば次のような内容が出力されます。当然の...
はテーブル(DEPARTMENT,D)の内容に依存します。またこのよう...
出力されるわけではありませんので、その点は注意して下さい。
|HEAD_DEPT|DEPARTMENT|MGR_NAME|TITLE|EMP_CNT|
|=================|=================|==============|====|==|
||Corporate Headquarters|Bender, Oliver H.|CEO|2|
|Corporate Headquarters|Sales and Marketing|MacDonald, Ma...
|Sales and Marketing|Pacific Rim Headquarters|Baldwin, Ja...
|Pacific Rim Headquarters|Field Office: Japan|Yamamoto, T...
|Pacific Rim Headquarters|Field Office: Singapore|--TBH--...
&br;
ORG_CHARTプロシージャでの全情報を得るためにはSELECTによ...
もしも EXECUTE PROCEDURE により実行を行った場合は、最初の...
終了してしまうので、最初の1行目のデータしか得ることが出...
言えば、Corporate Headquarters,Bender, Oliver H.,CEO,2 の...
ます。)~
&br;
**参照 [#n7050d94]
ALTER EXCEPTION , [[ALTER PROCEDURE>#alter_procedure]] ,
CREATE EXCEPTION , DROP EXCEPTION , [[DROP PROCEDURE>#dro...
[[EXECUTE PROCEDURE>#execute_procedure]] , [[SELECT>SELEC...
&br;
これ以上の情報が欲しい場合は、Data Definition Guideの
creating and using procedures を参照して下さい。~
&br;
&br;
----
&br;
&br;
&aname(alter_procedure);
*ALTER PROCEDURE [#q504c051]
既存のストアドプロシージャの定義を変更します。
DSQLとisqlで使用可能です。~
**構文 [#w41fb7a0]
ALTER PROCEDURE name
[(param <datatype> [, param <datatype> …])]
[RETURNS (param <datatype> [, param <datatype> …])]
AS <procedure_body> [terminator]
&br;
&br;
|引数|説明|h
|name|既存のプロシージャの名前です。|
|param datatype|入力パラメータです。詳細は[[CREATE PROCED...
|RETURNS param datatype|出力パラメータです。詳細は[[CREAT...
|procedure_body|プロシージャのボディです。以下を含みます。|
|~|・ローカル変数の定義|
|~|・プロシージャ・トリガ記述言語で記述されたステートメン...
|~|すべての詳細に関しては、[[CREATE PROCEDURE>#create_pro...
|terminator|SET TERMで変更した終端文字です。通常の文で使...
&br;
**詳細の説明 [#w7ec1e88]
ALTER PROCEDURE により、既存のストアドプロシージャの削...
内容などを変更できます。変更できるのは、入出力パラメータ...
&br;
パラメータやボディなどの定義に関しては、
[[CREATE PROCEDURE>#create_procedure]]を参照して下さい。A...
換わるだけで、構文などはまったく同一です。~
&br;
''重要'' 入出力パラメータの数や型の変更は、慎重に行って...
アプリケーションが、それらに依存している場合が多いからで...
&br;
プロシージャの定義を変更できるのは、作成者、SYSDBAユー...
管理者権限を持ったユーザーのみです。~
&br;
使用中のプロシ−ジャに変更を施そうとした場合、使用が終了...
出来ません。~
&br;
ALTER PROCEDURE による変更を行った後に変更をコミットす...
は反映されます。変更を行うことが出きれば、それを使用する...
の再コンパイルや再リンクを行わなくても、その変更は直ちに...
&br;
**用例 [#uf5acd4a]
isqlでの例です。
SET TERM !! ;
ALTER PROCEDURE GET_EMP_PROJ (EMP_NO SMALLINT)
RETURNS (PROJ_ID VARCHAR(20)) AS
BEGIN
FOR SELECT PROJ_ID
FROM EMPLOYEE_PROJECT
WHERE EMP_NO = :emp_no
INTO :proj_id
DO
SUSPEND;
END !!
SET TERM ; !!
&br;
**参照 [#p6895da4]
[[CREATE PROCEDURE>#create_procedure]] ,
[[DROP PROCEDURE>#drop_procedure]] , [[EXECUTE PROCEDURE>...
&br;
&br;
これ以上の情報が欲しい場合は、Data Definition Guideの
creating and using procedures を参照して下さい。~
&br;
&br;
----
&br;
&br;
&aname(drop_procedure);
*DROP PROCEDURE [#g1844a0c]
データベースから、既存のストアドプロシージャを削除します。
DSQL,isqlで使用できます。~
&br;
**構文 [#m7646b4b]
DROP PROCEDURE name
&br;
&br;
|引数|説明|h
|name|既存のプロシージャの名前です。|
&br;
**詳細の説明 [#e5947a2a]
DROP PROCEDURE により、既存のストアドプロシージャをデー...
出来ます。~
&br;
プロシージャが、他のプロシージャ、トリガ、ビューで使用...
削除は出来ません。また、プロシージャが現在使用中の場合も...
&br;
※ isql で SHOW PROCEDURE を実行することにより、プロシー...
プロシージャの依存関係(プロシージャ、トリガ、例外、テーブ...
出来ます。~
&br;
プロシージャを削除できるのは、作成者、SYSDBAユーザー、...
管理者権限を持ったユーザーのみです。~
&br;
**用例 [#xb252c30]
isql でプロシージャを削除する例です。
DROP PROCEDURE GET_EMP_PROJ;
&br;
**参照 [#cfba3a94]
[[ALTER PROCEDURE>#alter_procedure]] ,
[[CREATE PROCEDURE>#create_procedure]] ,
[[EXECUTE PROCEDURE>#execute_procedure]]~
&br;
&br;
----
&br;
&br;
&aname(execute_procedure);
*EXECUTE PROCEDURE [#r7ccf28c]
ストアドプロシ−ジャを呼び出します。
SQL, DSQL, isql で使用できます。~
**構文 [#g118b46d]
SQL 形式:
EXECUTE PROCEDURE [TRANSACTION transaction]
name [:param [[INDICATOR]:indicator]]
[, :param [[INDICATOR]:indicator] …]
[RETURNING_VALUES :param [[INDICATOR]:indicator]
[, :param [[INDICATOR]:indicator] …]];
&br;
DSQL 形式:
EXECUTE PROCEDURE name [param [, param …]]
[RETURNING_VALUES param [, param …]]
&br;
isql 形式:(実行結果は表示される)
EXECUTE PROCEDURE name [param [, param …]]
&br;
&br;
|引数|説明|h
|TRANSACTION transaction|指定したトランザクション下で実行...
|name|既存のプロシージャの名前です。|
|param|入出力パラメータです。ホスト変数または定数です。|
|RETURNING_VALUES :param|出力パラメータを受取るホスト変...
|[INDICATOR] :indicator|NULL値/UNKNOWNを識別する情報を受...
&br;
**詳細の説明 [#u0469797]
EXECUTE PROCEDURE により、指定したストアドプロシージャ...
そのプロシージャが入力パラメータを必要とするならば、ホス...
定数で与えることが出来ます。出力パラメータは、SQL プログ...
RETURNING_VALUE に記述したホスト言語変数に格納されます。i...
パラメータ受け取りの指定は出来ません。isqlでは結果が自動...
されます。~
※ DSQLでは、入力パラメータが必要なときは入力ディスクリプ...
出力パラメータが必要な場合は出力ディスクリプションエリア...
&br;
埋め込みSQLの場合、入力パラメータおよび戻り値の各々の値...
識別するためのインジケーター変数を付与できます。インジケ...
されるのは整数値で、対応するパラメータがNULL/UNKNOWN値で...
います。この値が0未満(負値)であれば NULL/UNKONOWN である...
逆に0以上(正値)であるならば、NULLやUNKNOWNではないことを...
&br;
※ 複数行の結果を取得するタイプのストアドプロシージャを呼...
SELECTを使用してください。詳しくは、[[CREATE PROCEDURE>#c...
を参照して下さい。~
&br;
**用例 [#l0863d6a]
-埋め込みSQLで、プロシージャを実行する例です。入力パラメ...
戻り値(出力パラメータ)は変数で受取っています。
EXEC SQL
EXECUTE PROCEDURE DEPT_BUDGET 100 RETURNING_VALUES :sumb;
&br;
-埋め込みSQLで、入出力パラメータ共に変数を使用しています。
EXEC SQL
EXECUTE PROCEDURE DEPT_BUDGET :rdno RETURNING_VALUES :...
&br;
**参照 [#gd720fd9]
[[ALTER PROCEDURE>#alter_procedure]] ,
[[CREATE PROCEDURE>#create_procedure]] ,
[[DROP PROCEDURE>#drop_procedure]]~
&br;
これ以上の情報が欲しい場合、Embedded SQL Guide の indic...
を参照して下さい。~
&br;
&br;
&br;
----
&br;
&br;
&aname(recreate_procedure);
*RECREATE PROCEDURE [#c2a8df55]
既存のストアドプロシージャを破棄せずに、同じ名前で再作...
SQL,DSQLで使用できます。~
&br;
構文は[[CREATE PROCEDURE>#create_procedure]]とまったく...
&br;
ページ名:
新規
名前変更
ホーム
一覧
検索
最終更新
バックアップ
ヘルプ
最終更新のRSS