質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

3956閲覧

Oracle SQLのUPDATE文で希望通りの更新が掛からない

退会済みユーザー

退会済みユーザー

総合スコア0

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2017/02/25 02:06

Oracle初心者です。

【前提】

OracleのViewのテストを行っており、Viewのデータ抽出条件に
データ更新年月日(UPDATEYMD)がSYSDATEと同じ月のものという条件を設定しています。
UPDATEYMDはデータ登録時にSYSDATEが登録される設定となっており、
またNOT NULL制約が付いています。

複数のテストデータの内、一部に対し、前月分のデータ更新年月日を持たせるため、
UPDATE文を使用して1ヶ月前の日付を登録をしようと考えています。

【使用した構文】

UPDATE TABLE_NAME SET UPDATEYMD = ADD_MONTHS(SYSDATE,-1) WHERE COL1 IN ('A','B')

【質問】

上記の構文で、UPDATEYMDの日付が1ヶ月前のものに更新出来ず、
UPDATE文発行時のSYSDATEが登録されました。

●想定データ
2017/02/24 16:50:32 ⇒ 2017/01/24 16:50:32

●実際の更新結果
2017/02/24 16:50:32 ⇒ 2017/02/24 16:52:48

他のテーブルにあるUPDATEYMD(NOT NULL制約なし)は
1ヶ月前の日付に更新出来ました。
NOT NULL制約が付いているDATE型に対する暗黙が何かあるのでしょうか。
UPDATEYMDからNOT NULL制約を外すということは出来ないので、
SQLで変更するしか方法がないです。
上記の構文以外でNOT NULL制約が付いているDATE型に「SYSDATE,-1」を
登録する方法があれば教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

NOT NULL 制約の有無は関係ありません。
該当のテーブルに、トリガーが設定されていませんか?

sql

1SELECT * 2FROM all_triggers 3WHERE owner = '<スキーマ>' 4AND table_name = '<テーブル>'

投稿2017/02/25 02:34

q1701

総合スコア274

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/02/25 02:43

回答有難うございます。 社内で別の方に確認して頂いた際に「トリガーは関係なさそう」と言っていたのですが、見落としがあったという事でしょうか。 詳細を失念しており、月曜日にならないと確認が出来ないので、即時解決とならず、すみません。 もしそのトリガーが掛かっているということは、どのようなUPDATE文を発行しても 最新のSYSDATEしか登録できないという事で認識あっていますでしょうか。
q1701

2017/02/25 07:50

NOT NULL 制約の有無で DATE 型の UPDATE 結果が変わる可能性はありませんので、 あくまで推測として、トリガーの影響を可能性の一つとして挙げました。 断定しているように見えましたら、失礼しました。 トリガーはプログラムですから、その影響はプログラムの内容次第です。 例えば以下のようなトリガーが設定されている場合、常に updateymd は 常に SYSDATE となります。 CREATE OR REPLACE TRIGGER overwrite_updateymd BEFORE UPDATE ON table_name FOR EACH ROW BEGIN :NEW.updateymd := SYSDATE; END; トリガーは、権限さえあれば別スキーマのテーブルにも作成できますので、表「TABLE_NAME」と同じスキーマに作成されているとは限りません。 上記当方回答で、owner はトリガー自体の所有者で、表の所有者ではありませんので、以下の方が良かったかもしれません。 SELECT * FROM all_triggers WHERE table_owner = '<テーブルの所有者>' AND table_name = '<テーブル>'
退会済みユーザー

退会済みユーザー

2017/02/25 08:15

ご丁寧にありがとうございます。 NOT NULL制約は関係ないのですね。 仰られているトリガーの設定が為されている可能性があります。 可能性を見いだせていなかったので、とても勉強になります。 一度、実際の環境で確認してみます。
退会済みユーザー

退会済みユーザー

2017/02/27 23:14

q1701様の仰ってた通りトリガーが設定されていました。 理由が判明しましたので解決とさせて頂きます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問