< 前へ | 次へ >

演習 2: EGL での SQL の基本操作

チュートリアル「EGL の紹介 (クイック・スタート・ガイド)」を完了している場合は、リレーショナル・データベースへのアクセスに必要な EGL パーツ、およびデータベースでのデータの読み取りおよび書き込みに使用するコマンドについて既に学習しています。 この演習では、これらの概念をより詳細に説明します。

前回の演習または前のチュートリアルのいずれかでデータ・アクセス・アプリケーション・ウィザードを使用した際に、EGL により、データベース内の情報に基づいてデータ・パーツおよびロジック・パーツが作成されました。

作成された中で最も代表的なデータ・パーツは、SQLRecord パーツです。これらのレコード・パーツ内のフィールドは、データベース内の列に関連しています。このレコードに基づいて変数を作成すると、その変数を使用してデータベース内の新規行または既存行を示すことができます。データ・アクセス・アプリケーション・ウィザードで作成されたそれぞれの SQLRecord は単一テーブル内の列とのみ一致しますが、この後のチュートリアルでは、複数のテーブルから単一レコードにデータをマージする方法 (SQL では「テーブル結合」といいます) を学習します。

例えば、このチュートリアル全体を通して Customer SQLRecord を使用します。このレコードは、ファイル EGLSource/eglderbyr7/data/customer.egl にあります。
record Customer type sqlRecord { 
  tablenames=[["EGL.CUSTOMER"]],
  keyItems=[CustomerId]
  } 

  CustomerId CustomerId {column="EGL.CUSTOMER.CUSTOMER_ID"};
  FirstName FirstName {column="EGL.CUSTOMER.FIRST_NAME", 
    sqlVariableLen=yes, maxLen=30, isSqlNullable=yes};
  LastName LastName {column="EGL.CUSTOMER.LAST_NAME", 
    sqlVariableLen=yes, maxLen=30, isSqlNullable=yes};
...
  Directions Directions {column="EGL.CUSTOMER.DIRECTIONS", 
    sqlVariableLen=yes, maxLen=255, isSqlNullable=yes};
end
コード tablenames=[["EGL.CUSTOMER"]] はこのレコードと関連するデータベース内のテーブルを指定し、各フィールドの column プロパティーはフィールドと関連するテーブル内の列を指定します。コード keyItems=[CustomerId] は、CustomerId フィールド (および接続により、データベースの EGL.CUSTOMER.CUSTOMER_ID 列) が、このテーブルの主キーであることを示しています。
データ・アクセス・アプリケーション・ウィザードにより、いくつかのライブラリーも作成されました。このライブラリーは、レコードおよびレコードの配列に対し、CRUD (作成、読み取り、更新、および削除) 操作を実行します。これらのライブラリーは、EGL コマンドを使用して直接 CRUD 操作を実行するための、より洗練された方法です。 このチュートリアルでは EGL コマンドを直接使用しますが、もちろん、ロジックをライブラリーに分割して再使用するのが便利です。4 つの EGL CRUD コマンドは次のとおりです。
表 1. EGL CRUD コマンドおよびそれと同等の SQL コマンド
EGL コマンド EGL サンプル SQL コマンド
add
add myRecord;
INSERT
get
get myRecord;
SELECT
replace
replace myRecord;
UPDATE
delete
delete myRecord;
DELETE
これらのコマンドのいずれかを使用すると、EGL はそのコマンドからデフォルトの SQL ステートメントを生成します。次の add ステートメント例にして説明します。
add myCustomer;
myCustomer レコードにカーソルを置き、右クリックしてから「SQL ステートメント」 > 「追加」の順にクリックすると、EGL エディターで add ステートメントが展開され、SQL コードが明示された状態で表示されます。
SQL ステートメントを明示する方法を表示しているコンテキスト・メニュー
add myCustomer with
  #sql{
    insert into EGL.CUSTOMER
      (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)
    values
      (:myCustomer.CustomerId, :myCustomer.FirstName, 
      :myCustomer.LastName, :myCustomer.Password, 
      :myCustomer.Phone, :myCustomer.EmailAddress, 
      :myCustomer.Street, :myCustomer.Apartment, 
      :myCustomer.City, :myCustomer.State, 
      :myCustomer.Postalcode, :myCustomer.Directions)
  };
実質的な内容は全く変更されません。EGL は、add ステートメントから生成する SQL コードを開示しただけです。 コードが明示的になったので、EGL コマンドから生成されたデフォルトの SQL を編集できます。

SQL INSERT ステートメントの VALUES 節に、新規データベース行 (この場合は myCustomer レコード内のフィールド) に挿入する値がリストされます。#sql ブロック内の各値の前にはコロン :) があり、値が SQL の値ではなく EGL の値であることを示しています。明示的な SQL コードで使用されるこれらの EGL 値は、「ホスト変数」と呼ばれます。

次に、ホスト変数のもう 1 つの例として、get ステートメントを使用して、データベースから一連のレコードを削除する関数を挙げます。
function getCustFromState(customerState CHAR(2) in, 
  customers Customer[] out)

  get customers with
    #sql{
      select *
      from EGL.CUSTOMER
      where EGL.CUSTOMER."STATE" like :customerState
    };

end
この関数は、2 バイトの CHAR 型パラメーターを受け取り、そのパラメーターをホスト変数として使用して、これらの 2 つの文字に一致する STATE フィールドを持つレコードを取得します。EGL を明示的な SQL コードと一緒に機能させるためには、ホスト変数を慎重に使用する必要があります。

CRUD 操作の復習

このセクションでは、getaddreplace、および delete を使用して、EGL を使用した基本データベース操作を実行します。このセクションはオプションです。4 つの基本 EGL データ・アクセス・ステートメントおよびそれと同等の SQL ステートメントを問題なく使用できる場合は、スキップしてかまいません。

  1. CRUDTest.egl という名前の新規 EGL プログラムを作成します。
    1. 「プロジェクト・エクスプローラー」ビューで、EGLSQL プロジェクトを右クリックして、「新規」 > 「プログラム」とクリックします。 「新規 EGL プログラム・パーツ」ウィンドウが開きます。
    2. 「パッケージ」フィールドに、名前 programs を入力します。
    3. 「EGL ソース・ファイル名」フィールドに、名前 CRUDTest を入力します。
    4. 「終了」をクリックします。
    新規 EGL プログラムが作成されてエディターで開きます。
  2. デフォルトの EGL コードを次のコードで置換します。
    package programs;
    
    import eglderbyr7.data.*;
    
    program CRUDTest type BasicProgram {}
      
      function main()
        
        try
          // Print the starting records in the database.
          SysLib.writeStdout("Contents of database before any SQL operations:");
          printAllCustomers();
          
        // What to do if an error happens.
        onException (exception SQLException)
          handleDBException(exception);
        end
        
      end
      
      // This function prints out the contents of the CUSTOMER
      // table in the database.
      function printAllCustomers()
        
        allCustomers Customer[0];
    
        get allCustomers;
        for (counter int from 1 to allcustomers.getSize())
          SysLib.writeStdout(allCustomers[counter].CustomerId::" "::
            allCustomers[counter].FirstName::" "::
            allCustomers[counter].LastName);
        end
        SysLib.writeStdout("¥n");
    
      end
      
      //This function responds to errors accessing the database.
      function handleDBException(exception SQLException)
        SysLib.writeStdout("Error accessing database. "::
          "See Troubleshooting section");
        SysLib.writeStdout(exception.message);
      end
      
    end

    この時点で、このプログラムが出力するのは、データベース内の顧客の完全なリストのみです。また、プログラムには、データベースの処理中に EGL に生じたすべて問題を処理する handleDBException という名前の関数も含まれています。(エラー処理については、この後のチュートリアルで学習します。) このプログラムを今すぐ実行して、変更前のデータベースの外観を表示できます。

  3. プログラムを保存して、生成します。
  4. 次のようにして、プログラムを実行します。
    1. 「プロジェクト・エクスプローラー」ビューで、EGLSQL/JavaSource/programs を展開します。
    2. CRUDTest.java ファイルを右クリックし、「実行」 > 「Java アプリケーション」の順にクリックします。
    プログラムが実行され、エラーが出なかった場合は、「コンソール」ビューにデータベースの内容が表示されます。「コンソール」ビュー内の結果は次のようになります。
    Contents of database before any SQL operations:
    1 Fred Filibuster
    2 Andy Lundquist
    3 Billie Kingman
    4 Francine Liebowitz
    5 Ornette Coleman
    6 Ellen Springsteen
    7 Martin St. Louis
    8 Sergey Sharov
    9 Melodie Hudak
    コンソール内の結果にエラーがある場合は、プログラムを正確にコピーしたことを確認してから、トラブルシューティングを参照してください。
  5. 新規行をデータベースに挿入する関数を、最後の end ステートメントの前に追加します。
    function addCustomer()
      customerToAdd Customer;
      customerToAdd.CustomerId = 50;
      customerToAdd.FirstName = "John";
      customerToAdd.LastName = "Doe";
      
      // Insert the record into the database
      try
        add customerToAdd;
        SysLib.writeStdout("Contents of database after adding a new record:");
        printAllCustomers();
      onException(exception SQLException)
        handleDBException(exception);
      end
      
    end
    この関数は、add を使用してレコードをデータベースに挿入します。add ステートメントの背後にある暗黙 SQL コードを表示するには、行 add customerToAdd; のキーワード customerToAdd に直接カーソルを置いて右クリックし、「SQL ステートメント」 > 「追加」の順にクリックします。 これで、ステートメントは次のようになります。
    try
      add customerToAdd with
        #sql{
          insert into EGL.CUSTOMER
            (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)
          values
            (:customerToAdd.CustomerId, :customerToAdd.FirstName, 
            :customerToAdd.LastName, :customerToAdd.Password, 
            :customerToAdd.Phone, :customerToAdd.EmailAddress, 
            :customerToAdd.Street, :customerToAdd.Apartment, 
            :customerToAdd.City, :customerToAdd.State, 
            :customerToAdd.Postalcode, :customerToAdd.Directions)
        };
    また、レコード変数に直接カーソルを置き、右クリックして「SQL ステートメント」 > 「表示」とクリックすると、SQL コードを明示せずにプレビューできます。このように EGL コード内で SQL コードを処理するには、EGL エディターのカーソルをステートメント内のどこかに置く必要があります。
  6. 次に示すように、新規関数をプログラムの main() 関数から呼び出します。
    function main()
      
      // Print the starting records in the database.
      SysLib.writeStdout("Contents of database before any SQL operations:");
      printAllCustomers();
      
      // Add a record.
      addCustomer();
      
    end
  7. プログラムを保存し、生成して実行します。 出力には、レコードをプログラムに追加する前と後のテーブルの内容が示されます。
    Contents of database before any SQL operations:
    1 Fred Filibuster
    2 Andy Lundquist
    3 Billie Kingman
    4 Francine Liebowitz
    5 Ornette Coleman
    6 Ellen Springsteen
    7 Martin St. Louis
    8 Sergey Sharov
    9 Melodie Hudak
    
    
    Contents of database after adding a new record:
    1 Fred Filibuster
    2 Andy Lundquist
    3 Billie Kingman
    4 Francine Liebowitz
    5 Ornette Coleman
    6 Ellen Springsteen
    7 Martin St. Louis
    8 Sergey Sharov
    9 Melodie Hudak
    50 John Doe
  8. データベースからレコードを削除する関数を、最後の end ステートメントの前に追加します。
    function deleteCustomer()
      customerToDelete Customer;
      customerToDelete.CustomerId = 50;
      
      // Delete the record.
      try
        delete customerToDelete noCursor;
        SysLib.writeStdout("Contents of database after deleting the record:");
        printAllCustomers();
      onException(exception SQLException)
        handleDBException(exception);
      end
      
    end
  9. main() 関数で、レコードを追加する関数への呼び出しを、レコードを削除する関数への呼び出しで置換します。 CUSTOMER_ID 列はテーブルの主キーであり、また、テーブルの CUSTOMER_ID の行が既に 50 に設定されているため、レコードを再度追加しようとするとエラーが発生します。
    function main()
      
      // Print the starting records in the database.
      SysLib.writeStdout("Contents of database before any SQL operations:");
      printAllCustomers();
      
      // Delete a record.
      deleteCustomer();
      
    end
  10. プログラムを保存し、生成して実行します。 出力には、レコードを削除する前と後のテーブルの内容が示されます。
    Contents of database before any SQL operations:
    1 Fred Filibuster
    2 Andy Lundquist
    3 Billie Kingman
    4 Francine Liebowitz
    5 Ornette Coleman
    6 Ellen Springsteen
    7 Martin St. Louis
    8 Sergey Sharov
    9 Melodie Hudak
    50 John Doe
    
    
    Contents of database after deleting the record:
    1 Fred Filibuster
    2 Andy Lundquist
    3 Billie Kingman
    4 Francine Liebowitz
    5 Ornette Coleman
    6 Ellen Springsteen
    7 Martin St. Louis
    8 Sergey Sharov
    9 Melodie Hudak
  11. データベース内のレコードを取得して更新する関数を、最後の end ステートメントの前に追加します。
    function updateCustomer()
      customerToUpdate Customer;
      customerToUpdate.CustomerId = 50;
      
      // Retrieve the row.
      get customerToUpdate;
      
      // Change values in the record variable.
      customerToUpdate.FirstName = "Johnny";
      customerToUpdate.LastName = "Five";
      
      // Update the row in the database.
      try
        replace customerToUpdate noCursor;
        SysLib.writeStdout("Contents of database after updating the record:");
        printAllCustomers();
      onException(exception SQLException)
        handleDBException(exception);
      end
      
    end
  12. プログラムの main() 関数で、add、replace、および delete 関数をその順序で呼び出します。
    function main()
      
      // Print the starting records in the database.
      SysLib.writeStdout("Contents of database before any SQL operations:");
      printAllCustomers();
      
      // Add a record.
      addCustomer();
      
      // Update the record.
      updateCustomer();
      
      // Delete a record.
      deleteCustomer();
      
    end
  13. プログラムを保存し、生成して実行します。 出力に、プログラムの開始時、レコードを追加した後、レコードを更新した後、およびレコードを削除した後のテーブルの内容が示されます。
    Contents of database before any SQL operations:
    1 Fred Filibuster
    2 Andy Lundquist
    3 Billie Kingman
    4 Francine Liebowitz
    5 Ornette Coleman
    6 Ellen Springsteen
    7 Martin St. Louis
    8 Sergey Sharov
    9 Melodie Hudak
    
    
    Contents of database after adding a new record:
    1 Fred Filibuster
    2 Andy Lundquist
    3 Billie Kingman
    4 Francine Liebowitz
    5 Ornette Coleman
    6 Ellen Springsteen
    7 Martin St. Louis
    8 Sergey Sharov
    9 Melodie Hudak
    50 John Doe
    
    
    Contents of database after updating the record:
    1 Fred Filibuster
    2 Andy Lundquist
    3 Billie Kingman
    4 Francine Liebowitz
    5 Ornette Coleman
    6 Ellen Springsteen
    7 Martin St. Louis
    8 Sergey Sharov
    9 Melodie Hudak
    50 Johnny Five
    
    
    Contents of database after deleting the record:
    1 Fred Filibuster
    2 Andy Lundquist
    3 Billie Kingman
    4 Francine Liebowitz
    5 Ornette Coleman
    6 Ellen Springsteen
    7 Martin St. Louis
    8 Sergey Sharov
    9 Melodie Hudak
これで、CRUDTest.egl ファイルのコードが完成しました。 このファイル内にエラーがある場合 (赤の X 記号でマークされている場合) は、演習 2 で完成した CRUDTest.egl ファイルに記載されているファイルのコードと、作成したコードが一致していることを確認してください。

演習のチェックポイント

この演習では、EGL および SQL を使用したリレーショナル・データベースへのアクセスの基礎を復習しました。

次の概念を学習しました。
  • SQLRecord パーツ、およびそれらのパーツとデータベース・テーブルとの関係
  • データベース操作を実行する 4 つの基本 EGL ステートメント
  • 明示的な SQL
  • ホスト変数
4 つの基本 EGL データ・アクセス・ステートメントの詳細については、次のヘルプ・トピックを参照してください。
< 前へ | 次へ >