UPDATE文のWHERE句にファンクション使いたい

このQ&Aのポイント
  • UPDATE文のWHERE句で自作のユーザ関数を使用したいが、更新されない問題に直面している。
  • UPDATE文にユーザ関数を使用することはできるのか疑問がある。
  • ユーザ関数をコメントアウトして実行すると、更新が行われることが分かった。
回答を見る
  • ベストアンサー

UPDATE文のWHERE句にファンクション使いたい

[OSのVER]:WindowsXP [OracleのVER]:9i UPDATE時にWHERE句に自作のユーザ関数を使いたいと思っていますが、 更新されずに困っています。 (エラーも出ません) 例) update TG_TBL set S_YMD = '20060601', LAST_UPDATE = SYSDATE , where ID_NO = '1401001' and CHK_SIK(ID_NO) in (1,2) ←使用したいチェック関数 ちなみに、以下のように同じ関数を使用すると1件のレコードが検索されます。 select * from TG_TBL where KANRI_NO = '1401001' and CHK_SIK(ID_NO) in (1,2) 関数部分をコメントアウトして、実行すると1件更新されます。 UPDATE文にユーザ関数を使用することはできないのでしょうか? 皆様のお知恵をお貸しください。 よろしく、お願いいたします。

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

質問者が選んだベストアンサー

  • ベストアンサー
  • Kuppycat
  • ベストアンサー率50% (109/216)
回答No.1

更新されないのは、条件にあったものがないからではないでしょうか。 よく見ると、Update文の条件とSelect文の条件が違います。 ID_NO = '1401001' ではなく KANRI_NO = '1401001' なのではないですか?

juxxko
質問者

お礼

御回答、ありがとうございます。 私の不注意で、申し訳ありません。 その通りでした。

関連するQ&A

  • update文の一括発行

    お世話になります。 parent_idという親テーブルのIDを格納するフィールドと idという自分のIDを格納するフィールドと データを格納するdataというフィールドがあるtbl01というテーブルがある場合に update tbl01 set data = 'xxx' where parent_id = 1 and id = 1 update tbl01 set data = 'yyy' where parent_id = 1 and id = 2 update tbl01 set data = 'xyz' where parent_id = 1 and id = 3 ※dataに格納するデータは親テーブルとは関係ない独立したデータです。 という感じにparent_id = 1が格納されているレコードにデータを次々と更新していきたいのですが 1回のupdate文でまとめて発行するやり方はあるのでしょうか。 1回1回発行するのは時間がかかるためできれば1回でまとめて発行したいのです。 update tbl01 set data in ('xxx', 'yyy', 'xyz') where parent_id = 1 and id in(1, 2, 3) イメージとしてはこんな感じです。 よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • updateのWHERE句にサブクエリーを書く事は不可?

    同じテーブルに対し、サブクエリーを使用して 更新することは可能でしょうか? test 1 である条件にマッチしたIDに対し、 フラグを書き換えたいのですが・・動作しませんでした。 update test1 set flg = 0 WHERE test_id = ALL (SELECT test_id FROM test1 WHERE flg = 1 AND a = 0) #1093 - You can't specify target table 'test1' for update in FROM clause

    • ベストアンサー
    • MySQL
  • UPDATE文の書き方を教えて下さい。

    いつもお世話になっています。 UPDATEの書き方について教えて下さい。 以下のようなUPDATE文を作成しました。 処理的には必要な結果を返してくれていますが、もう少しシンプルには ならないでしょうか? UPDATE文がまだ理解出来ていないのですが、”WHERE EXISTS(”以降に 書いているSELECT文は、SET文の値算出時にも同じSELECT文を書いて いるのですが、それを代用することは出来ないのでしょうか? (SELECTの結果をWHERE文の中で簡単に呼び出して使えないのでしょうか?) ※うまく内容が伝わってないかもしれませんが、どうぞよろしくお願いします。 <<<更新処理>>> UPDATE TBL01 SET( TBL01_MARNO, TBL01_UPDYMD )=( SELECT TBL02_MARNO, TO_NUMBER(TO_CHAR(SYSDATE,'YYYYMMDD')) FROM (SELECT TBL02_TENCD, TBL02_REN, TBL02_MARNO, TBL02_UPDKBN, RANK () OVER (PARTITION BY TBL02_TENCD, TBL02_REN ORDER BY TBL02_YMD DESC, TBL02_DAT DESC ) WRK_RANK FROM TBL02 WHERE TBL02_OKFLG = 1 ) WHERE TBL02_TENCD = TBL01_TENCD AND TBL02_REN = TBL01_REN AND WRK_RANK = 1 AND TBL02_UPDKBN = 2 ) WHERE EXISTS( SELECT 'TRUE' FROM (SELECT TBL02_TENCD, TBL02_REN, TBL02_MARNO, TBL02_UPDKBN, RANK () OVER (PARTITION BY TBL02_TENCD, TBL02_REN ORDER BY TBL02_YMD DESC, TBL02_DAT DESC ) WRK_RANK FROM TBL02 WHERE TBL02_OKFLG = 1 ) WHERE TBL02_TENCD = TBL01_TENCD AND TBL02_REN = TBL01_REN AND TBL02_UPDKBN = 2 AND WRK_RANK = 1 );

  • Access Update文の副問い合わせ

    以下のAのSQLをAccessから実行すると「実行時エラー3073 更新可能なクエリであることが必要です。」エラーが表示されます。 一時、待避としてBのような処理をしていますが、かなり処理速度がかかります。 何とかAのような1文で処理できないでしょうか? 'A================================================ Update PV_PRINT pv Set 勉強日 = (SELECT max(日付) as 日 FROM 基本記録テーブル where 項目2 between 3011 and 3014 and pv.USER_NUM = 基本記録テーブル.ID GROUP BY ID); 'B================================================ stSQL = "SELECT max(日付) as 日, ID FROM 基本記録テーブル where 項目2 between 3011 and 3014 GROUP BY ID;" Set TBL1 = CurrentDb.OpenRecordset(stSQL) Do Until TBL1.EOF stSQL = "UPDATE PV_PRINT " stSQL = stSQL & " SET PV_PRINT.勉強会日 = " & Format(TBL1![日], "yyyymmdd") stSQL = stSQL & " WHERE PV_PRINT.USER_NUM = " & TBL1![ID] & ";" CurrentDb.Execute stSQL TBL1.MoveNext Loop Set TBL1 = Nothing

  • 複数の検索結果をSELECT条件にしたい

    SELECT KANRI_NO ,EDA_NO ,NO_S ,NO_E FROM KANRI_TBL WHERE KANRI_NO='1' ORDER BY EDA_NO; の検索結果が、 KANRI_NO ,EDA_NO ,NO_S ,NO_E 1 , 1 , 1 , 10 1 , 2 , 52 , 60 1 , 3 , 90 , 99 のような結果をVBで、 SELECT  * FROM SYOSAI_TBL WHERE BETWEEN 1 AND 10 BETWEEN 52 AND 60 BETWEEN 90 AND 99; のような形の編集しています。 これをひとつのSQL分では書けないのでしょうか? 教えてください

  • UPDATEを高速化したい

    MySQLバージョン4.1.16を使用しています。 複数の行をそれぞれの決まった値で更新したいのですが、 下のような記述の仕方だと更新する行が増えるにつれ、 それ相応に遅くなってしまいます(かといって他の記述の仕方を知りませんが・・・) なにかもっと高速になるような記述というのはあるのでしょうか? SET AUTOCOMMIT=0; START TRANSACTION; UPDATE tbl SET field = 'a' WHERE id = '1'; UPDATE tbl SET field = 'b' WHERE id = '2'; UPDATE tbl SET field = 'c' WHERE id = '3'; COMMIT; SET AUTOCOMMIT=1;

  • JOIN句への変換

    はじめまして。 「*=」をJoin句に直したいのですが、同様の結果がえられません(T.T) SQL初心者です、どうぞよろしくお願いいたします。 この式をJOIN句に直したいです。 FROM A_TBL, B_TBL as B_TBL01, B_TBL as B_TBL02, C_TBL, D_TBL WHERE A_TBL.No = B_TBL01.No AND A_TBL.No = B_TBL02.No AND A_TBL.No = C_TBL.No AND A_TBL.No *= D_TBL.No AND C_TBL.ID *= D_TBL.ID AND ↓こうしたのですが、正しい結果がえられません。 FROM (D_TBL RIGHT OUTER JOIN C_TBL ON C_TBL.ID = D_TBL.ID) RIGHT OUTER JOIN A_TBL INNER JOIN B_TBL AS B_TBL01 ON A_TBL.No = B_TBL01.No1.No INNER JOIN B_TBL AS B_TBL02 ON A_TBL.No = B_TBL02.No2.No ON A_TBL.No = D_TBL.No AND A_TBL.No = C_TBL.No どうぞ、ご教授お願いいたします。

  • UPDATE文で発生するデッドロックについて、教えてください。

    はじめまして。 SQL SERVER初心者の為、ご指導の程お願いいたします。 UPDATE文で発生するデッドロックについて教えてください。 現在、ストアドプロシージャ内で、 以下のUPDATE文を使用しています。 UPDATE テーブルA SET 更新済フラグ = '1' WHERE ロック時間 =パラメータ.ロック時間 AND ロックユーザー = パラメータ.ロックユーザー AND ID = パラメータ.ID ※Where句に使用する、ロック時間・ロックユーザー・IDは、  キー項目では無く、インデックスも使用しておりません。  ただし、対象データを一意に識別できる項目ではあります。   このストアドを含む処理を、ほぼ同時実行すると このUPDATE文で「LOCK TIMEOUT」が発生し、 デッドロックとなってしまいます。 UPDATEの対象となるデータ件数は、ともに500~600件です また、対策としましてロックのヒント文を下記のように設定し、 WHERE句に設定している、ロック時間・ロックユーザー・IDに 対して、インデックスを作成してみましたが、 同様に、デッドロックが発生してしまいます。 UPDATE テーブルA (with rowlock) SET 更新済フラグ = '1' WHERE ロック時間 = パラメータ.ロック時間 AND ロックユーザー = パラメータ.ロックユーザー AND ID = パラメータ.ID SQL Serverに詳しい方、お力になっていただければ、光栄です。 よろしくお願いいたします。

  • updateのsql文について

    mysql5.0です。 いかのsql文のなかdistrb_date項目にシステム日付を代入させたいですが書き方がわからなくて困っています。よろしくお願いします。 UPDATE file_tbl SET status = 2, distrb_date = (???), user_id = %s where file_name = %s AND file_type = %s order by file_ymd DESC

    • ベストアンサー
    • MySQL
  • SELECT文でINを使わずに検索したい

    DBはoracle10gです。 テーブル(A_TBL)は以下の4つのカラムで構成されています。 seq_no(連番),key_1(個人番号),key_2(更新日),status(状態) key_1が同一のレコードは、 最新のレコード(最新とは更新日の大きいレコード)以外のstatusを'0'から'4'にします。 例として実行前と実行後のテーブルは以下のような状態です。 【実行前】 seq_no,key_1,key_2,status 1,001,20080101,1 2,001,20080102,0 3,002,20080101,0 4,003,20080101,0 5,003,20080102,0 6,003,20080103,0 7,004,20080101,0 8,004,20080102,2 【実行後】 seq_no,key_1,key_2,status 1,001,20080101,1 2,001,20080102,0 3,002,20080101,0 4,003,20080101,4 5,003,20080102,4 6,003,20080103,0 7,004,20080101,4 8,004,20080102,2 以下のようなSQLを作成し、更新しようとしました。 update A_TBL set status = '4' where status = '0' and seq_no not in ( select wk2.seq_no from A_TBL wk2, (select max(key_2) as key_2, key_1 as key_1 from A_TBL group by key_1) wk1 where wk2.key_1 = wk1.key_1 and wk2.key_2 = wk1.key_2 and wk2.status = '0' ) このSQLはin句を使っていますが、 in句を使わずに同様の更新を実現することは出来るでしょうか?