初心者の憂鬱:動的 SQL について調べてみた(前編)

初心者の憂鬱

サポート部の Yama-chan です。初心者の憂鬱シリーズも始めてから、これが 4 回目の記事となります。 コロナウィルスの影響が広がる中、IT への投資も減少すると予測され、私も確実にそうなるだろうと考えていますが、PowerBuilder のユーザーにとっては決して悪い話ではありません。むしろ、今までの IT 資産を活かして、C/Sシステムを維持しながら、一つのソースでPowerServerを利用してWebシステムへ自動変換することでテレワークにも対応可能となり、PowerBuilderの強みが今後、期待されるだろうと確信している今日このごろです。


動的 SQL とは

DataWindow は PowerBuilder が誕生した時から、C / S システム開発向けの強力なコントロールとなっています。特に業務アプリの開発に関しては他の競合製品の追随を許さない絶大的な生産性を生み出す強みになっていて、数週間でマスターすることができます。どうして高い生産性が発揮できるかというと、業務アプリとなるとデータベースの操作が多くなり、それを実現するためには SQL という専門言語をマスターしなければなりません。DataWindow は SQL を使用せずにすべて自動的に行ってくれるので、開発者は SQL について意識することがなく、ビジネスロジックの開発に専念できます。その分のコーディングが不要なので生産性が高い要因でもあります。実際には DataWindow が SQL を自動生成し、データ操作のマジックボックスと言っても過言ではありません。

DataWindow がとても強力なので、はじめの頃は SQL について勉強しなくてもいいと思いました。しかしながら、PowerBuilder が記述したい埋め込み SQL 文(たとえば、DDL : データ定義言語)をサポートしていない場合、また SQL 文のパラメータや使用すべき書式がコンパイル時にはわからない場合はアプリケーション実行時に SQL 文を作成する必要があります。これを動的 SQL といいます。動的 SQL 文で使用するパラメータは、プログラムが実行される状況、またはユーザーの入力情報に応じて動的に変わります。今回から 2 回にわたって、動的 SQL について紹介します。動的 SQL を理解して利用できるようになれば、SE としてのスキルアップにもつながり、さらに柔軟に開発ができるようになります。動的 SQL ですが、大きく 4 書式があります。今回の前編では書式 1 と 2 について、説明します。書式 3 と 4 については次回の後編で紹介する予定です。


書式 1 :

最初に紹介するのは入力引数を必要とせず、結果セットも返さない動的 SQL ステートメントを発行する場合の書式です。DDL の構文を使用してテーブルの作成を行います。以下の例では SQL Anywhere の DDL 構文を使用しています。

※なお、ASE データベースに接続している場合は、CREATE 文を実行する前に AUTOCOMMIT プロパティに true を設定してください。

string lsSQL
boolean lbAutocommit
 
// 処理の前に AutoCommit の設定を退避
lbAutocommit = SQLCA.AutoCommit
SQLCA.AutoCommit = True
 
// 動的 SQL ステートメントの定義
lsSQL = "create table testtbl (id integer, name char(10));"
// 動的 SQL の実行
execute Immediate :lsSQL using sqlca;
 
// 実行結果の確認
if SQLCA.sqlcode = -1 then
           // エラーの場合はメッセージを表示
	MessageBox("SQL実行エラー!", &
	SQLCA.sqlerrtext)
end if
 
// 処理が完了後、AutoCommit の設定を戻す
SQLCA.AutoCommit = lbAutocommit

書式 2 :

つぎに説明する動的 SQL は既知の有限数のパラメータがあり、結果セットを返さない書式のものです。以下の例ではテーブルから指定条件のデータを削除する動的 SQL となっています。削除の条件として渡すパラメータは二つで、一つ目のパラメータは id = 1、二つ目のパラメータは name = ’Neko’です。この例ではハードコーディングになっていますが、実際のアプリケーションでは実行時、ユーザーの入力により取得するようになります。

// 二つの引数、id と name の定義
int li_id = 1
string ls_name = 'Neko'
 
// 動的 SQL の準備と実行
PREPARE SQLSA
  FROM "delete from testtbl where id=? and name=?";
EXECUTE SQLSA USING :li_id, :ls_name;

この例では二つの条件を指定して、データを削除する SQL となっていますが、アプリケーションでは肥大化したデータテーブルから、ユーザーが指定した日付以前のデータを消すなど利用するケースはいろいろあります。どんな処理に利用できるのか、皆さんも考えて開発の現場で役に立つことがあるでしょう。


まとめ

以上で簡単ですが、動的 SQL について例を交えて解説しました。いかがでしたか、思っているほど難しくないでしょう? 何事でもそうですが、難しいと思って手を動かすのを躊躇しがちですが、実際にやってみると思っているほど難しくないのでどんどんチャレンジして行きましょう。

以上、動的 SQL の書式 1 と 2 についての解説でした。次回は書式 3 と 4 について紹介する予定です。

Stay home ではなく... Stay tuned!

テクニカルブログ 一覧を見る
PowerBuilder マイグレーション
PowerBuilder学習、動画で始めちゃう?