エラーの直接の原因は、メッセージが示すように、値が多すぎることです。つまり、values
列よりも多くの要素が句に含まれています。将来の問題や混乱を避けるために、列名を明示的にリストすることをお勧めします。実際にこれを行っています。
insert into HR (type, raised_by, complaint, date_time)
values ('request',6785,'good morning',sysdate,'YYYY/MM/DD:HH:MI:SSAM')
... sp 4 つの列がありますが、5 つの値があります。現在の日付/時刻を文字列として挿入しようとしているため、次のto_char()
関数を使用する必要があります。
insert into HR (type, raised_by, complaint, date_time)
values ('request',6785,'good morning',
to_char(sysdate,'YYYY/MM/DD:HH:MI:SSAM'))
ただし、日付 (または数値などのその他の構造化データ) を文字列として保存することはお勧めできません。ドキュメントのメモとして:
Oracle Databaseによって操作される各値には、データ型があります。値のデータ型は、プロパティの固定セットを値に関連付けます。これらのプロパティにより、Oracle はあるデータ型の値を別のデータ型の値とは異なる方法で処理します。たとえば、NUMBER データ型の値は追加できますが、RAW データ型の値は追加できません。
文字列を使用すると、無効な値を入れることができます。適切なDATE
データ型を使用すると、誤って無効な値や紛らわしい値を入れることはできません。Oracle は列の使用を最適化することもできます。安全かつ効率的に値を比較します。使用している形式はいくつかよりも優れていますが、文字列比較を使用しても、2 つの値を比較してどちらが古いかを簡単に比較することはできないためdate_time
、たとえば、列で適切に並べ替えることができません。
2013/11/15:09:00:00AM
値を含む2 つの行を挿入したとします2013/11/15:08:00:00PM
。どちらが先ですか? AM/PM マーカーを見て、最初のマーカーが早いことを認識する必要があります。8
文字列比較では、 の前にソートされるため、間違ってしまいます9
。HH24
代わりに使用してHH
それをAM
回避しますが、それでも真の日付よりも効率的ではありません。
時刻コンポーネントを含む日付を保存する必要がある場合は、秒までの精度を持つDATE
data typeを使用できます。または、小数秒も必要な場合は、を使用できますTIMESTAMP
。次に、テーブルと挿入は次のようになります。
create table HR (type varchar2 (20), raised_by number (6),
complaint varchar2 (500), date_time date);
insert into HR (type, raised_by, complaint, date_time)
values ('request',6785,'good morning',sysdate);
クエリの一部として、表示目的で必要な形式で値を取得できます。
select type, raised_by, complaint,
to_char(date_time, 'YYYY/MM/DD:HH:MI:SSAM') as date_time
from HR
order by date_time;
TYPE RAISED_BY COMPLAINT DATE_TIME
-------------------- ---------- -------------------- ---------------------
request 6785 good morning 2013/11/15:08:44:35AM
日付のみを表示用の文字列として扱います。