Embedded FireBird 2.0プログラムからの利用方法




ストアドプロシージャーを利用する場合


ストアドプロシージャーというのは、データベースエンジン上で動作する関数にあたるものです。

プログラム側で処理するから、ストアドプロシージャなんかいらないのではという意見もありますが、

必ずしもそうとはいえません。それは、データベースエンジン内に格納されているデータを利用して、

演算し、その結果のみがほしい場合があります。この場合、データベースエンジンとプログラムの間で

大量のデータのやり取りがある場合には、演算よりもこのデータのやり取りの時間が大きくなってしまいます。

このような場合は、ストアドプロシージャーを利用し、演算結果のみを取得するほうが結果的に

演算結果を高速に取得することができます。


ここでは、先のプログラムに、ストアドプロシージャを利用する処理を追加します。

今までは、ループ処理で100万行のレコード追加を行っていましたが、ここでは、

ストアドプロシージャを利用することにより、1回の呼び出しで、100万行を

追加するように変更します。


主な流れは、以下のとおりです。


1.ストアドプロシージャを作成する。

ストアドプロシージャを利用する。


簡単に書くとこのとおりなのですが、もう少し具体的に書くと...


1.フォーム上に「TButton」を貼り付け、Nameプロパティを「cmdStoredProcMake」に変更します。

.フォーム上に「TButton」を貼り付け、Nameプロパティを「cmdExecStoredProc」に変更します。

3.「cmdStoredProcMake 」をダブルクリックし、以下の@のようにします。

4.「 cmdExecStoredProc 」をダブルクリックし、以下のAのようにします。


---ここから @---

void __fastcall TfrmMain::cmdStoredProcMakeClick(TObject *Sender)

{

try

{

if(IBDatabase_Test->Connected==true){

IBDatabase_Test->Connected=false;

}

IBDatabase_Test->Params->Clear();

IBDatabase_Test->DatabaseName="";

IBDatabase_Test->DatabaseName=strProgramPath + "\\..\\DB\\Test.gds";

IBDatabase_Test->Params->Add("USER_NAME=SYSDBA");

IBDatabase_Test->Params->Add("PASSWORD=masterkey");

IBDatabase_Test->Connected=true;

IBTransaction_Test->StartTransaction();

IBQuery_Test->ParamCheck=false;

IBQuery_Test->SQL->Text="";

IBQuery_Test->SQL->Add("CREATE PROCEDURE INSERT_TESTTABLE (COUNT_MAX NUMERIC(8,0))");

IBQuery_Test->SQL->Add("AS");

IBQuery_Test->SQL->Add("DECLARE VARIABLE TMP_COUNTER NUMERIC(8,0);");

IBQuery_Test->SQL->Add("BEGIN");

IBQuery_Test->SQL->Add("TMP_COUNTER=1;");


IBQuery_Test->SQL->Add("WHILE(TMP_COUNTER<= :COUNT_MAX) ");

IBQuery_Test->SQL->Add("DO");

IBQuery_Test->SQL->Add("BEGIN");

IBQuery_Test->SQL->Add("Insert Into TestTable (TestTableID, TestNumber, TestName,deletedate) values ((SELECT NEXT VALUE FOR seq_TestTableID FROM RDB$DATABASE),123,'テストです','01/01/2000');");

IBQuery_Test->SQL->Add("TMP_COUNTER = TMP_COUNTER + 1;");

IBQuery_Test->SQL->Add("END");

IBQuery_Test->SQL->Add("SUSPEND;");

IBQuery_Test->SQL->Add("END");

IBQuery_Test->ExecSQL();

IBTransaction_Test->Commit();

IBQuery_Test->ParamCheck=true;


//100万行の更新を実施する

//for(long i=1;i<1000000;i++){

// IBQuery_Test->SQL->Text="Update TestTable set TestNumber=" + AnsiString(i)+", TestName='321' ,deletedate='01/01/2002' where TestTableID=" + AnsiString(i);

// IBQuery_Test->ExecSQL();

//}

//IBTransaction_Test->Commit();


}catch(const EIBInterBaseError &E){

ShowMessage(E.Message + "が発生しました。");

}

catch(const Exception &E){

ShowMessage(AnsiString(E.ClassName())+E.Message);

}


}

//---------------------------------------------------------------------------

---ここまで @---


---ここから A---

void __fastcall TfrmMain::cmdExecStoredProcClick(TObject *Sender)

{

try

{

if(IBDatabase_Test->Connected==true){

IBDatabase_Test->Connected=false;

}

IBDatabase_Test->Params->Clear();

IBDatabase_Test->DatabaseName="";

IBDatabase_Test->DatabaseName=strProgramPath + "\\..\\DB\\Test.gds";

IBDatabase_Test->Params->Add("USER_NAME=SYSDBA");

IBDatabase_Test->Params->Add("PASSWORD=masterkey");

IBDatabase_Test->Connected=true;

IBTransaction_Test->StartTransaction();

//IBQuery_Test->ParamCheck=false;

IBQuery_Test->SQL->Text="";

IBQuery_Test->SQL->Text="EXECUTE PROCEDURE INSERT_TESTTABLE(1000000)";

IBQuery_Test->ExecSQL();

IBTransaction_Test->Commit();

//IBQuery_Test->ParamCheck=true;


//100万行の更新を実施する

//for(long i=1;i<1000000;i++){

// IBQuery_Test->SQL->Text="Update TestTable set TestNumber=" + AnsiString(i)+", TestName='321' ,deletedate='01/01/2002' where TestTableID=" + AnsiString(i);

// IBQuery_Test->ExecSQL();

//}

//IBTransaction_Test->Commit();


}catch(const EIBInterBaseError &E){

ShowMessage(E.Message + "が発生しました。");

}

catch(const Exception &E){

ShowMessage(AnsiString(E.ClassName())+E.Message);

}


}

//---------------------------------------------------------------------------

---ここまで A---


cmdExecStoredProc」ボタンをクリックした際に、今まで存在していたループ処理がなくなっていることが

お分かりと思います。


以上で、ストアドプロシージャーを利用する手順は終了です。