新規 CREATE ステートメントの実行は、データ・パースペクティブでツールを用いて行うことができますが、ご使用の EGL アプリケーション内でカスタム SQL コードを実行したい場合があります。言うまでもなく、EGL アプリケーションにカスタマイズされた SQL コードを挿入する場合は必ずそれをテストし、予測どおりに機能するか確認する必要があります。
EGL
execute ステートメントを使用すると、SQLRecord 変数を扱うことなく、SQL コードを実行できます。
execute を使用して、CREATE、ALTER、および DROP TABLE、INSERT、DELETE、および UPDATE など、さまざまな SQL ステートメントを実行できます。例えば、次のようにしてテーブルをデータベースから削除できます。
execute #sql{
DROP TABLE OLD_TABLE;
}
execute ステートメントは、一部の SQL ステートメントをサポートしません。特に、SELECT と OPEN はサポートしません。execute と一緒に使用した場合に機能する SQL ステートメントと機能しない SQL ステートメントのリストは、「SQL での execute についての考慮事項」を参照してください。
execute を使用して、ストアード・プロシージャーを呼び出すこともできます。
execute #sql{
call aStoredProcedure( :parameterVar)
};
Derby は、大多数のデータベース管理システムと同じ方法ではストアード・プロシージャーをサポートしません。したがって、このチュートリアルではストアード・プロシージャーを扱っていません。
このセクションでは、その代わりに、
execute を使用して、データベース内にテーブルを作成し、SQLRecord パーツを使用せずにそこにデータを取り込みます。
- EGL パースペクティブに戻ります。
- パッケージ名 libraries 内の CustomerTableOperations.egl という名前のファイルに、新規ライブラリー・パーツを作成します。
- execCreateTable、execInsertIntoTable、および execDropTable という名前のライブラリーに新規関数を挿入します。各関数はパラメーターとして StatusRec レコード変数を受け取ります。
function execCreateTable(status StatusRec inOut)
end
function execInsertIntoTable(status StatusRec inOut)
end
function execDropTable(status StatusRec inOut)
end
StatusRec レコード変数は、データベース操作の成功または失敗についての情報を記録します。
- パラメーターを追加する際にコンテンツ・アシストを使用しなかった場合は、次の import ステートメントをファイル上部の package ステートメントのすぐ下に追加します。
import eglderbyr7.StatusRec;
- execCreateTable 関数で execute ステートメントを使用して、前のセクションで作成した CREATE TABLE ステートメントを実行します。
function execCreateTable(status StatusRec inOut)
try
execute
#sql{
CREATE TABLE EGL.CUSTOMERTEMP (
CUSTOMER_ID INTEGER NOT NULL,
FIRST_NAME VARCHAR(30),
LAST_NAME VARCHAR(30),
PASSWORD CHAR(8),
PHONE VARCHAR(14),
EMAIL_ADDRESS VARCHAR(50),
STREET VARCHAR(30),
APARTMENT VARCHAR(10),
CITY VARCHAR(30),
STATE CHAR(2),
POSTALCODE VARCHAR(10),
DIRECTIONS VARCHAR(255)
)
};
onException (exception SQLException)
ConditionHandlingLib.HandleException(status, exception);
end
end
この関数はテーブルを作成し、次に、エラーがあれば、データベースからデータ・パーツおよびロジック・パーツと一緒に作成される HandleSuccess 関数を使用してエラーを処理します。
- これらのコードを追加する際にコンテンツ・アシストを使用しなかった場合は、次の import ステートメントをファイルの先頭に追加します。
import eglderbyr7.ConditionHandlingLib;
- execDropTable 関数に、データベースからテーブルを削除する execute ステートメントを追加します。
function execDropTable(status StatusRec inOut)
try
execute #sql{
DROP TABLE EGL.CUSTOMERTEMP
} ;
onException (exception SQLException)
ConditionHandlingLib.HandleException(status, exception);
end
end
- execInsertIntoTable 関数に、CUSTOMER テーブルのレコードを CUSTOMERTEMP テーブルに移動する execute ステートメントを追加します。
function execInsertIntoTable(status StatusRec inOut)
try
execute #sql{
INSERT INTO EGL.CUSTOMERTEMP
SELECT * FROM EGL.CUSTOMER
} ;
onException (exception SQLException)
ConditionHandlingLib.HandleException(status, exception);
end
end
このコードは、CUSTOMER の各レコードを CUSTOMERTEMP テーブルにコピーするのみです。
必要があれば、Where 文節を追加して、特定のレコードのみを選択してコピーするようにできます。
- ライブラリーを保存して、生成します。
- programs パッケージにある duplicateTable.egl という名前のファイルに、新規プログラム・パーツを作成します。
- 新規プログラムで、新規テーブルを作成する関数を呼び出し、レコードを挿入します。
package programs;
import eglderbyr7.StatusRec;
import libraries.CustomerTableOperations;
program duplicateTable type BasicProgram {}
status StatusRec;
function main()
CustomerTableOperations.execCreateTable(status);
CustomerTableOperations.execInsertIntoTable(status);
end
end
- プログラムを生成し、実行します。
- データ・パースペクティブに戻り、「データベース・エクスプローラー」ビューでデータベースに再接続します。
- 前のセクションで行ったように、新規テーブルでデータのプレビューを表示し、新規テーブルとデータを確認します。
- の順に展開します。
- CUSTOMERTEMP テーブルを右クリックして、とクリックします。
これで、新規テーブルのデータを表示できます。
ここで、他のステートメントを作成して新規テーブルを処理したり、execDropTable 関数を呼び出してそれらのテーブルをデータベースから削除したりできます。例えば、CREATE TABLE ステートメントと一緒に作成された ALTER TABLE および CREATE INDEX ステートメントを実行することができます。しかし、この場合に、Derby では主キー制約のために重複した名前は許可されないため、制約とインデックスの名前を変更する必要があります。「データベース・エクスプローラー」ビューでデータベースを切断してから、データベースにアクセスする EGL コードを実行することを忘れないでください。
これで、この演習で使用した 2 つのファイルのコードが完成しました。いずれかのファイル内に赤い X 記号がマークされたエラーが表示される場合は、
ご使用のコードが次のコード 演習 6 で完成した CustomerTableOperations.egl および duplicateTable.egl ファイル と一致するか確認してください。