そのため、インストーラーがデータベースに接続してテーブルを作成し、それらにデータを入力するインストーラーに取り組んでいます。特定のテーブルに行を追加しようとする場合を除いて、これのすべての側面が正しく機能します。
declare
retVal INTEGER;
rptID INTEGER;
catID INTEGER;
wsID INTEGER;
paramID INTEGER;
dtID INTEGER;
begin
select PK into catID from RPT_CATEGORY where KEYVALUE = 'ProductivityReportsCategory';
select PK into rptID from RPT_REPORT where KEYVALUE = 'ProductivitySummaryReport2';
select PK into wsID from RPT_WEBSVC where KEYVALUE = 'NotApplicable' and category_fk = catID;
データベースに入力する select ステートメントは次のようになります。
select PK into wsID from RPT_WEBSVC where KEYVALUE = 'GetMachineNameList' and category_fk = catID;
paramID := RPT_CONFIGURATION.ADD_PARAMETER( rptID, wsID, dtID, 'Machine', 'parameters.GetProductivityDataSet3.inserterid', 4, NULL, NULL, NULL, 0, 0, 0, 'Y', 'Y', 'N', 'N', 'Y' );
このように構成された 13 個の select ステートメントがあります (それらはすべて類似しており、唯一の違いはテーブルに格納される値だけであるため、追加しません)。
私の問題は、インストーラーを実行すると、完了時にログに次のエラーが表示されることです。
ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at line 30
私が知りたいのは、このエラーが発生する正確な理由と、このエラーを修正する手段は何ですか?
このトピックについていくつかの調査を行ったところ、これが私の検索の共通のテーマであることがわかりました。
1.コードにバグがあり、開発者は、複数の行が返される可能性があることに気づきませんでした。
2.API を使用せずにデータがハッキングされたため、検証が破られた。
3.ソフトウェアは問題ありません。ユーザーが行ったことは問題ありませんが、2 つの並行更新が同時に発生し、どちらも他方が行ったコミットされていない変更を確認できませんでした。したがって、正しく検証されませんでした。
#2ではないことは確かですが、他の2つの理由が正確に何を意味するのか、またはそれらを修正する方法がよくわかりません。
どんな助けや提案も大歓迎です。
ありがとう