• 締切済み

ORA-1403

質問するカテゴリが間違っていたら申し訳ありません。 oracleを使用しWEBアプリを開発しています。 DB連携を行っていて、 WEB--DB--DB処理という形になっています。 言語はWEB側が java1.5(struts1.2)コンパイルは1.4準拠 DB処理が Cです。(PRO C?) WEB側で値を格納し、DB側で入力値によって処理を 行い結果を格納するのですが、たまにORA-1403のエラーが発生し 正しく処理ができません。 例 tbl_master A001(PK), A002   , A003 ID    , linkcode , 結果 tbl_link001 A001(PK), A002  , A003 ID    , 値1  , 値2 WEB側でDB格納する際にDB接続からリリースまでのメソッドに synchronizedをかけていますが、これが影響しているのでしょうか? DBのロックではないので問題は無いとは思っているのですが・・・。 ご存知の方がいらっしゃいましたらご教授いただけますでしょうか。 お願いします。

  • Oracle
  • 回答数1
  • ありがとう数4

みんなの回答

回答No.1

ORA-01403はNO_DATA_FOUNDということで1件もレコードが ヒットしなかったときに出るエラーです。 Pro*Cの中で select col1 into host_XXX from hogehoge where col2 = host_YYY; といったようなSELECT INTO命令を実行していませんか? その場合、host_XXXに入れる値が一件も無かった場合、 (col2 = host_YYYの条件を満たすレコードが無かった場合や  そもそもhogehoge表が空の場合) ORA-01403が発生してしまいます。 「たまに」ORA-01403のエラーが発生するというのはおそらく ヒットする場合とヒットしない場合があるからだと思います。 逆に2件以上ヒットしてしまうとORA-01422(TOO_MANY_ROWS) が発生してしまいます。

参考URL:
http://dongrico.fc2web.com/hp_sozai/pl_sql/pl_sql_exception.html
jtakato
質問者

お礼

ご回答ありがとうございます。 確認して再度実行してみます。

関連するQ&A

  • VB.NET ORA-12170

    http://okwave.jp/qa/q8420174.html ↑ VB.NETで作成したアプリでこちらの質問で無事解決し、違う環境で試したところORA-12170の タイムアウトエラーが発生しました。 SQL*Plusからの接続は問題ありません。 わからないのはWEBアプリの方は接続できるのに、コンソールアプリの方がこのエラーになってしまいます。 どちらのアプリの接続文字列も同じData Sourceを指定してます。 「db1」がTNSNAMES.ORAに記述している識別子になります。 WEBアプリ側 (Web.configに記述) <connectionStrings> <add name="oracle" connectionString="Provider=OraOLEDB.Oracle;Data Source=db1;Password=pass1;User ID=user1" providerName="System.Data.OleDb" /> </connectionStrings> コンソールアプリ側 (INIファイルに記述) ConnectionString=Provider=OraOLEDB.Oracle;Data Source=db1;Password=pass1;User ID=user1 一般的にはDBサーバにネットワークがつながってないなど単純な理由のようですが、 WEBアプリは接続できるので、そういうことはあり得ないと思います。 コンソールアプリの問題と思うのですが、どんな原因が考えられるでしょうか?

  • リスナーが起動しているのに「ORA-12541 : TNS: リスナーがありません」と怒られる

    同じ LAN 内にサーバーが3つあります。 すべて別々のデータベースが入っている DB サーバーです。 サーバーの状態は、順番に以下の通りとなっています。 A:DB サーバー(参照されるサーバー) B:A に対して接続可能。 C:A に対して接続できない。 B → A、C → A に対して DBLink を貼っているのですが、 B → A だけが成功し、C → A が失敗します。 失敗のエラー内容が、上記の「リスナーがありません」というエラーなのですが、 B → A の接続が成功しているのでリスナーは存在して正常に動作しているはずです。 A に対する接続情報(tnsnames.ora)は、B も C もまったく同じです。 A 側のリスナーのポートも同じで、同じユーザー/パスで接続テストをしています。 自分はサブシステム担当なので A サーバーの設定情報を見ることはできないのですが、 考えられるのは A 側で参照を許可する制御をしているくらいです。 でも、A 側で「B からの参照は許可するが C の参照は不可」と言った制御はできるものでしょうか? もしくは、ほかに考えられる原因はありますでしょうか? お手数ですが、よろしくお願いします。

  • MYSQLを用いた集計について

    MySQLを用いた、クロス集計(?)のデータについてどこを探しても見つからなかったので、投稿します。 DBAとDBB、DBCをLEFT JOINを行って、DBCの複数条件の全てのに適合する、DBBの件数をAのID単位で取得したいと思っています。 <テーブル構成> DB:A ---- id PK B_id FK flag ---- DB:B ---- id PK C_id FK flag ---- DB:B ---- id PK flag ---- そこで色々試行錯誤してみたのですが、良い方法が見つからず、現在は確認を兼ねて、以下の様な形で抽出するリストを構築する所 までは行いました。 --- SELECT *,count(DB_B.id) FROM (DB_A LEFT JOIN DB_B on DB_A.B_id = DB_B.id) JOIN DB_C on DB_B.C_id = DB_C.id WHERE DB_A.flag = 100 AND (DB_C.flag = 1 OR DB_C.flag = 2 OR DB_C.flag = 3) GROUP BY DB_B.id HAVING count(DB_C.id) = 3 --- ここで抽出されるリストをDB_Aのid別に件数を取得するにはどうすればよろしいでしょうか? もちろん、上のコードでは無理だろうと予測はついているのですが、ここから先に進めず…。 ちなみに、環境は以下のとおりです。 MySQL:4.0.27 PHP:4.4.4 ※ちなみに、同じような形式でDB_Dの複合条件、DB_Eの複合条件を掛け合わせていく形もあり得るため、それに準じた方法・知恵をご教授いただけると幸いです。 よろしくお願致します。

  • カーソルで値取得

    あるテーブルから頭から10件分 カーソルで値を取得するようにしていましたが、 元々下記のようだったものを… CURSOR cursor_name IS SELECT TBL_A.E_ID,TBL_A.C_ID FROM (SELECT E_ID,C_ID,ROW_NUMBER() OVER( ORDER BY E_ID ) RN  FROM TBL_A) TBL_A WHERE RN BETWEEN 1 AND 10;     ↓ CURSOR cursor_name IS SELECT TBL_A.E_ID, TBL_M.S_ID, TBL_M.S_NAME, TBL_U.USER_ID FROM ((TBL_A INNER JOIN TBL_EU ON TBL_A.E_ID = TBL_EU.E_ID) INNER JOIN TBL_U ON TBL_EU.S_ID = TBL_U.S_ID) INNER JOIN TBL_M ON TBL_EU.S_ID = TBL_M.S_ID WHERE (((TBL_EU.DIVISION)="2")); というように取得する値をふやしたいのですが、元にあった (SELECT E_ID,C_ID,ROW_NUMBER() OVER( ORDER BY E_ID ) RN  FROM TBL_A) TBL_A WHERE RN BETWEEN 1 AND 10; をどこに組み込んでいいのかわらず困っております。 どなかた教えて頂けないでしょうか?お願いいたします。

  • 【access】型の異なるTBLへの登録方法

    access2010を使用しツールを作成しております。 以下の処理順でTBLに値を登録したいです。 (1) テキストファイル(.txt)を一時格納TBLに登録 (2) 一時格納TBLの値を正規TBLに登録 一時格納TBLの型は仕様上、全てテキスト型を指定。 正規TBLの型は正しいものを指定したいのですが、insertやupdateでは上手くいきません。 ※この点は理解して上記仕様にしております 処理の流れとして以下を考えていますが、 他に良い手段がある場合はご教示頂けないでしょうか。 (1) テキストファイル(.txt)を一時格納TBLに登録 [一時格納TBLは全てテキスト型] (2) 一時格納TBLの値を正規TBLに登録 [正規TBLは全てテキスト型] (3) ALTER TABLEで必要に応じ正規TBLの型を修正する   ex)テキスト型→日付型、テキスト型→長整数型 ※ このやり方だと、正規TBLの型を書き直してしまうため都度型指定をやり直さなければならず現実的な処理ではない。 またALTER TABLEの本来の使い方ではないと思っている。 詳しい方、良い手段をご教示ください。

  • ora-01017エラーについて

    現在、C#とoracle10gを使ってデータベースに接続しようとしておりますが、ora-01017エラーがでます。 SQLコマンドラインで接続は出来るのですが、C#側からのログインができません。 C#ではこのように書いております。 public Meal() { InitializeComponent(); this.m_oDbconn = new OleDbConnection(); } private void Meal_Load(object sender, EventArgs e) { this.m_oDbconn.ConnectionString = "Provider=OraOLEDB.Oracle;" + "Data Sorce=xe;" + "User Id =aaa;" +"Password = aaa;"; this.m_oDbconn.Open(); } よろしくお願いします。

  • ora-01017エラーについて

    現在、C#とoracle10gを使ってデータベースに接続しようとしておりますが、ora-01017エラーがでます。 SQLコマンドラインで接続は出来るのですが、C#側からのログインができません。 C#ではこのように書いております。 public Meal() { InitializeComponent(); this.m_oDbconn = new OleDbConnection(); } private void Meal_Load(object sender, EventArgs e) { this.m_oDbconn.ConnectionString = "Provider=OraOLEDB.Oracle;" + "Data Sorce=xe;" + "User Id =aaa;" +"Password = aaa;"; this.m_oDbconn.Open(); } よろしくお願いします。

  • オラクル 名称をコードに変換

    DB初心者です。 オラクルDBでエクセルの置換処理のようなことをDB上で任意のタイミングでやりたい のですがどのような方法がありますでしょうか? ○詳細内容 変換前(※コードといいながら名称が入っている) TBL 製造 日付         コード          数量    3/1          品目A          50  TBL 品目 コード 名前 10001     品目A 10002     品目A  -------->製造TBLのコードと品目TBL名称が同じ物を抽出し、 10003     品目A         品目TBLのコードのMAXの値に変換 10004     品目B 変換後 TBL 製造 日付         コード          数量    3/1          10003          50 

  • カーソルオープンでエラー(ORA-01012)

    Pro*cの質問です。 CONNECTは成功したのですが、カーソルのオープンでエラーになります。 (ORA-01012:ログオンされていません。) 環境に問題があると考え、いろいろと調べているのですが、全く解りません。 自分側か、DB側の問題なのかどうかも、判断できていない状況です。 非常に困っております。どなたか御存知の方、御教授ください。 以下が動作環境になります。 WIN版: Windows2000,VC,Pro*C(8i),Net8,マルチスレッド UNIX版: Solaris8:ForteC,Pro*C(9i),Net8,64Bit,マルチスレッド 以上、情報が不足しているかも知れませんが、宜しくお願い致します。

  • PHP+MySQL 内部結合(INNER_JOIN)がうまく行きません。

    以下の文で「client_master」テーブルと「jobmaster0717」テーブルを内部結合させようとしているのですが、うまく行きません。どこがおかしいのでしょうか? <?php  // データベースサーバへの接続・データベースの選択  $db = mysql_connect('localhost','test','password');  $db_name = 'test';  mysql_select_db($db_name,$db);  // 処理対象テーブル  $tbl_name1 = "client_master";  $tbl_name2 = "jobmaster0717";    // 内部結合(INNER JOIN句)  $str_sql1 = "SELECT * FROM {$tbl_name1}"       . " INNER JOIN {$tbl_name2}"       . " ON {$tbl_name1}.company_ID"       . "  = {$tbl_name2}.client_ID;";  $rs1 = mysql_query($str_sql1,$db);  print "\"{$str_sql1}\"<br>\n";  // 結果セットの表示  show_rs($rs1,$db);  print "<br>\n";  // 結果セット(結果ID)の開放  mysql_free_result($rs1);    // データベースサーバの切断  mysql_close($db); ?>