Embedded FireBird 2.0プログラムからの利用方法8
ストアドプロシージャーを利用する場合
ストアドプロシージャーというのは、データベースエンジン上で動作する関数にあたるものです。
プログラム側で処理するから、ストアドプロシージャなんかいらないのではという意見もありますが、
必ずしもそうとはいえません。それは、データベースエンジン内に格納されているデータを利用して、
演算し、その結果のみがほしい場合があります。この場合、データベースエンジンとプログラムの間で
大量のデータのやり取りがある場合には、演算よりもこのデータのやり取りの時間が大きくなってしまいます。
このような場合は、ストアドプロシージャーを利用し、演算結果のみを取得するほうが結果的に
演算結果を高速に取得することができます。
ここでは、先のプログラムに、ストアドプロシージャを利用する処理を追加します。
今までは、ループ処理で100万行のレコード追加を行っていましたが、ここでは、
ストアドプロシージャを利用することにより、1回の呼び出しで、100万行を
追加するように変更します。
主な流れは、以下のとおりです。
1.ストアドプロシージャを作成する。
2.ストアドプロシージャを利用する。
簡単に書くとこのとおりなのですが、もう少し具体的に書くと...
1.フォーム上に「TButton」を貼り付け、Nameプロパティを「cmdStoredProcMake」に変更します。
2.フォーム上に「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」ボタンをクリックした際に、今まで存在していたループ処理がなくなっていることが
お分かりと思います。
以上で、ストアドプロシージャーを利用する手順は終了です。