< 前へ | 次へ >

演習 6: 任意の SQL コードの実行

この演習では、EGL でより柔軟に SQL コードを処理する方法を学習します。

ここまでは、EGL ステートメントと一致する SQL ステートメントを使用するように制限されていました。例えば、get ステートメントに関連した SQL コードを編集できるにもかかわらず、その SQL コードは SELECT ステートメントに限定されていました。例えば、get ステートメントの明示的な SQL コードには、SQL DELETE ステートメントを含めることができませんでした。明示的な SQL は編集可能ですが、その SQL コードは EGL キーワードに適したものでなければなりませんでした。

それでは、直接対応する EGL キーワードがない SQL ステートメントを使用するにはどうするのでしょうか。EGL キーワードに関連付けられていない SQL コードを実行するには、ワークベンチ・ツールを直接使用するか、EGL execute ステートメントを使用します。

SQL ビルダーを使用した SQL ステートメントの作成

ワークベンチには、EGL アプリケーションの外にあるデータベースの処理に役立ついくつかのツールが用意されています。このセクションでは、SQL ビルダーを使用してサンプル・データベースをより直接的に処理します。

  1. 次のようにして、データ・パースペクティブに切り替えます。
    1. 「ウィンドウ」 > 「パースペクティブを開く」 > 「その他」の順にクリックします。
    2. 「パースペクティブを開く」ウィンドウで、「データ」をクリックします。
    3. OK」をクリックします。
    データ・パースペクティブが開き、データベースの処理に使用するビューが表示されます。大抵の作業は、「データベース・エクスプローラー」ビューで行います。
  2. 「データベース・エクスプローラー」ビューで、「接続」を展開します。 「データベース・エクスプローラー」ビューに、データベースへのプロジェクトの接続として EGLDerbyR7 が、テストで使用されるサンプルの Derby 接続と一緒に表示されます。
    EGLDerbyR7 接続を表示している「データベース・エクスプローラー」ビュー
  3. EGLDerbyR7 接続を右クリックし、「再接続」をクリックします。 これで、「データベース・エクスプローラー」ビューがデータベースに接続されたので、データ・パースペクティブでツールを使用してデータベースを処理できます。ただし、Derby は 1 回に 1 つの接続しか許可しないため、「データベース・エクスプローラー」ビューが接続されている間は、EGL プログラムはデータベースに接続できません。
  4. 「データベース許可」ウィンドウで、「OK」をクリックします。
  5. 「EGLDerbyR7」 > 「EGLDerbyR7」 > 「スキーマ」 > 「EGL」 > 「テーブル」の順に展開します。 これで、「データベース・エクスプローラー」ビューに、このチュートリアルに関係するデータベース内のテーブルがリストされます。他のテーブルはメタデータで、このチュートリアルでは重要ではありません。
    データベース内のテーブルを表示している「データベース・エクスプローラー」ビュー
  6. CUSTOMERS テーブルを右クリックして、「データ」 > 「サンプル・コンテンツ」とクリックします。 「データ出力」ビューに、CUSTOMERS テーブルのデータが表示されます。
    CUSTOMERS テーブルを表示している「データ出力」ビュー
    「データ出力」ビューは、EGL get ステートメントの背後にある暗黙 SELECT ステートメントのように、デフォルトの SELECT ステートメントを実行しています。 より直接的にデータベースを処理し、EGL プログラムに追加する前に SQL コードをテストするために、SQL ビルダーを使用して SQL コマンドを対話式に作成し、実行できます。
  7. 「データベース・エクスプローラー」ビューで、青のデータベース・アイコンで示されている EGLDerbyR7 データベースを右クリックし、「新規 SQL ステートメント」をクリックします。
    「新規 SQL ステートメント」メニュー・オプションを表示している「データベース・エクスプローラー」ビュー
  8. 「新規 SQL ステートメント」ウィンドウで、ステートメントに sqlStatements と名前を付けます。
  9. 「ステートメント・テンプレート」フィールドを SELECT に設定したままにし、「使用中のものを編集」ラジオ・ボタン・グループを「SQL ビルダー」に設定したままにします。
    「新規 SQL ステートメント」ウィンドウ
  10. OK」をクリックします。 SQL ビルダーが開きます。このエディターから、SQL ステートメントを作成し、アプリケーションに追加する前にテストできます。
  11. 例として、カスタマー・レコードのデフォルトの SQL ステートメントを SQL ビルダーに貼り付けます。 EGL エディターで 明示的な SQL からこのステートメント (またはその他のなんらかの SQL ステートメント) をコピーすることも、次のコードを使用することもできます。
    select
      EGL.CUSTOMER.CUSTOMER_ID, EGL.CUSTOMER.FIRST_NAME, 
      EGL.CUSTOMER.LAST_NAME, EGL.CUSTOMER.PASSWORD,
      EGL.CUSTOMER.PHONE, EGL.CUSTOMER.EMAIL_ADDRESS,
      EGL.CUSTOMER.STREET, EGL.CUSTOMER.APARTMENT,
      EGL.CUSTOMER.CITY, EGL.CUSTOMER."STATE", 
      EGL.CUSTOMER.POSTALCODE, EGL.CUSTOMER.DIRECTIONS
    from EGL.CUSTOMER
    order by
      EGL.CUSTOMER.CUSTOMER_ID asc
    SQL ビルダーに、SQL コードがさまざまな方法で表示されます。
    • SQL ビルダーの最上部にあるコード・エディターを使用すると、EGL エディターと同じ方法で SQL ステートメントを編集できます。ただし、このエディターには SQL ステートメント用の特別なオプションがあります。例えば、デフォルトの SQL ステートメントを EGL コードからこのエディターに貼り付ける際に、SQL エディターはステートメントを単純化し、再フォーマットします。
      編集される SQL コードを表示している SQL エディター
      また、この SQL エディターには、SQL ステートメントのためのコンテンツ・アシストが用意されています。EGL コンテンツ・アシストと同様に、Ctrl + スペースを押して、候補リストを表示できます。
    • 最上部から 2 つ目のセクションには、ステートメントに関係するテーブルとその列のグラフィック・ビューが表示されます。SELECT ステートメントから列を選択または削除するには、列の横にあるチェック・ボックスをクリアします。また、ステートメントに新規テーブルを追加するには、エディター域を右クリックし、「表の追加」をクリックします。テーブルを右クリックすると、テーブルで使用されるオプションのリストも表示できます。
      SQL ビルダーのグラフィック・ビューに示される右クリック・メニュー
    • 最下部のセクションには、ステートメントがテーブル形式のビューで表示されます。テーブルにあるテンプレートを使用して、ステートメントの編集に役立てることができます。
      SQL ビルダーのテーブル形式のステートメント・エディター域
    例えば、次のようにして、エディターで SQL ビルダー内のテーブル域を使用して、Where 文節を SELECT ステートメントに追加できます。
  12. SQL ビルダーの「条件」タブを開きます。
  13. 次のようにして、「条件」タブで新規 Where 文節をステートメントに追加します。
    1. 「条件」タブで、「列」列の空の行をクリックします。
    2. 「列」の下にあるブランクのセルで、CUSTOMER.POSTALCODE を選択します。
    3. 「演算子」で、LIKE を選択します。
    4. 「値」で、次のコードを入力します。
      1%
      % 記号 (%) は、SQL のワイルドカードです。この Where 文節により、先頭が 1 の郵便番号を持つ顧客にステートメントが制限されます。
    テーブル域では選択条件は次のように示されます。
    SQL ビルダーでの新規の選択条件
    条件の追加が完了し、フォーカスを他の場所に設定すると、SQL ビルダーによってエディター内の SELECT ステートメントのコードが更新されます。
    SQL ビルダーでの SQL ステートメントのコード
  14. SQL ビルダーの最上部にあるコード・エディターを右クリックして、「SQL の実行」をクリックします。
    SQL ビルダーのコード編集域から起動される「SQL の実行」コンテキスト・メニュー・オプション
    「データ出力」ビューに、ステートメントの結果が表示されます。この場合は、先頭が 1 の郵便番号を持つ顧客が表示されます。
    ステートメントの結果を表示している「データ出力」ビュー
    SQL に精通している場合は、独自の SQL ステートメントをここに書き込み、アプリケーションで使用する前にそれをテストできます。
  15. SQL ビルダーでの作業が完了したら、コードをファイルに保存するか破棄します。
  16. より有用な例として、次のようにして、CUSTOMER テーブルの設計をコピーして新規テーブルを作成するための SQL ステートメントを作成します。
    1. 「データベース・エクスプローラー」ビューで、CUSTOMER テーブルを右クリックしてから、「DDL の生成」をクリックします。
    2. 「DDL の生成」ウィンドウで、「CREATE ステートメント」チェック・ボックスを選択し、他のチェック・ボックスをクリアします。
      「DDL の生成」ウィンドウ
    3. 「次へ」をクリックします。
    4. 「オブジェクト」ページで、「すべて選択」をクリックします。
    5. 「次へ」をクリックします。
    6. 「フォルダー」フィールドで、EGLSQL プロジェクトを選択します。
    7. 「DDL ファイルを保管して実行」ページで、ファイルに createtable.sql と名前を付けます。
    8. 「サーバー上で DDL を実行」チェック・ボックスをクリアします。
    9. 「編集のために DDL ファイルを開く」チェック・ボックスを選択します。 「DDL を保管して実行」ページは次のようになります。
      「DDL の生成」ウィザードの最後から 2 ページ目
    10. 「次へ」をクリックします。
    11. 「終了」をクリックします。
    SQL ステートメント・エディターで、新規 SQL ステートメントが開きます。このエディターは SQL ビルダーと機能が似ていますが、コード編集域しかなく、追加のグラフィック域はありません。
  17. ステートメントを編集して、作成されるテーブル名を、CUSTOMER ではなく EGL.CUSTOMERTEMP に変更します。 編集済み 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)
      );
  18. ステートメントを保存します。
  19. 「データベース・エクスプローラー」ビューで EGLDerbyR7 データベースを右クリックし、「切断」をクリックして、データベースを切断します。
これで、データベースに新規テーブルを作成する SQL ステートメントを用意できました。しかし、EGL には SQL CREATE ステートメントと同等のステートメントがなく、また、このステートメントを get などのステートメントのための明示的な SQL に挿入することもできません。get にはデータベースからの結果セットが必要なためです。次のセクションでは、execute を使用して、この SQL ステートメントを EGL で実行します。

execute の使用

新規 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 パーツを使用せずにそこにデータを取り込みます。
  1. EGL パースペクティブに戻ります。
  2. パッケージ名 libraries 内の CustomerTableOperations.egl という名前のファイルに、新規ライブラリー・パーツを作成します。
  3. execCreateTableexecInsertIntoTable、および execDropTable という名前のライブラリーに新規関数を挿入します。各関数はパラメーターとして StatusRec レコード変数を受け取ります。
    function execCreateTable(status StatusRec inOut)
      
    end
    
    function execInsertIntoTable(status StatusRec inOut)
      
    end
    
    function execDropTable(status StatusRec inOut)
      
    end
    StatusRec レコード変数は、データベース操作の成功または失敗についての情報を記録します。
  4. パラメーターを追加する際にコンテンツ・アシストを使用しなかった場合は、次の import ステートメントをファイル上部の package ステートメントのすぐ下に追加します。
    import eglderbyr7.StatusRec;
  5. 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 関数を使用してエラーを処理します。
  6. これらのコードを追加する際にコンテンツ・アシストを使用しなかった場合は、次の import ステートメントをファイルの先頭に追加します。
    import eglderbyr7.ConditionHandlingLib;
  7. execDropTable 関数に、データベースからテーブルを削除する execute ステートメントを追加します。
    function execDropTable(status StatusRec inOut)
      try  
        execute #sql{
         DROP TABLE EGL.CUSTOMERTEMP
           } ;
        onException (exception SQLException)
          ConditionHandlingLib.HandleException(status, exception);
        end
    end
  8. 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 文節を追加して、特定のレコードのみを選択してコピーするようにできます。
  9. ライブラリーを保存して、生成します。
  10. programs パッケージにある duplicateTable.egl という名前のファイルに、新規プログラム・パーツを作成します。
  11. 新規プログラムで、新規テーブルを作成する関数を呼び出し、レコードを挿入します。
    package programs;
    
    import eglderbyr7.StatusRec;
    import libraries.CustomerTableOperations;
    
    program duplicateTable type BasicProgram {}
      
      status StatusRec;
      
      function main()
        CustomerTableOperations.execCreateTable(status);
        CustomerTableOperations.execInsertIntoTable(status);
      end
      
    end
  12. プログラムを生成し、実行します。
  13. データ・パースペクティブに戻り、「データベース・エクスプローラー」ビューでデータベースに再接続します。
  14. 前のセクションで行ったように、新規テーブルでデータのプレビューを表示し、新規テーブルとデータを確認します。
    1. 「EGLDerbyR7」 > 「EGLDerbyR7」 > 「スキーマ」 > 「EGL」 > 「テーブル」の順に展開します。
    2. CUSTOMERTEMP テーブルを右クリックして、「データ」 > 「サンプル・コンテンツ」とクリックします。
これで、新規テーブルのデータを表示できます。
新規テーブルを表示している「データ出力」ビュー
ここで、他のステートメントを作成して新規テーブルを処理したり、execDropTable 関数を呼び出してそれらのテーブルをデータベースから削除したりできます。例えば、CREATE TABLE ステートメントと一緒に作成された ALTER TABLE および CREATE INDEX ステートメントを実行することができます。しかし、この場合に、Derby では主キー制約のために重複した名前は許可されないため、制約とインデックスの名前を変更する必要があります。「データベース・エクスプローラー」ビューでデータベースを切断してから、データベースにアクセスする EGL コードを実行することを忘れないでください。

これで、この演習で使用した 2 つのファイルのコードが完成しました。いずれかのファイル内に赤い X 記号がマークされたエラーが表示される場合は、 ご使用のコードが次のコード 演習 6 で完成した CustomerTableOperations.egl および duplicateTable.egl ファイル と一致するか確認してください。

演習のチェックポイント

この演習では、ワークベンチに用意されているいくつかのデータベース管理ツールについて学習し、また、それらのツールを execute ステートメントと組み合わせて、EGL アプリケーション内でさまざまな SQL ステートメントを実行する方法を学習しました。

ワークベンチに用意されているデータ・アクセス・ツールについて詳しくは、「SQL ステートメントの処理」を参照してください。execute ステートメントについて詳しくは、「execute」を参照してください。