【发布时间】:2018-04-10 18:50:45
【问题描述】:
我创建了以下两个表。
CREATE TABLE DELETE_CUSTOM
(
column1 varchar2(30),
column2 varchar2(30)
)
CREATE TABLE DELETE_CUSTOM_HIST
(
column1 varchar2(30),
column2 varchar2(30),
ARCHIVAL_DATE DATE
)
我曾经像下面这样将数据插入DELETE_CUSTOM_HIST。
INSERT INTO DELETE_CUSTOM_HIST
(SELECT DE.*, to_date('12/31/2017','mm/dd/yyyy')
FROM DELETE_CUSTOM DE);
现在,我必须在两个表中添加一个新列。
ALTER TABLE DELETE_CUSTOM ADD column3 VARCHAR2(30);
ALTER TABLE DELETE_CUSTOM_HIST ADD column3 VARCHAR2(30);
如果我尝试使用以下 INSERT 语句将数据插入DELETE_CUSTOM_HIST 表,
我收到 ORA-01858 错误。
INSERT INTO DELETE_CUSTOM_HIST
(SELECT DE.*, to_date('12/31/2017','mm/dd/yyyy')
FROM DELETE_CUSTOM DE);
--ORA-01858: a non-numeric character was found when a numeric was expected.
我需要对我的 INSERT 语句进行哪些更改才能解决此问题。
注意:上面的插入语句在PLSQL包中。上面两张表其实有 许多列。我刚刚提到了几列,以简单的方式解释我的问题。
【问题讨论】:
-
为什么不在
DELETE_CUSTOM表上使用触发器而不是SELECT查询? -
这里的问题是你懒得修改你的代码来写所有的列。看起来您(或您自己)之前的某个人通过在插入的任何地方都包含
select * from来粗心地编写包/程序,现在您应该在所有这些地方进行更改。我建议您将此代码更改为一次性活动,以便您未来的工作变得更加简单,即每当添加新列时,您只需将其添加到代码中即可。这是一个更好的做法。 -
仅供参考,您可以使用
DATE'2017-12-31'(ANSI DATE 文字)代替to_date('12/31/2017','mm/dd/yyyy')