2017-02-15 27 views
1

我想在更新之前保存日誌表我的db數據。另外,爲了記錄日誌,我想保存更新日期和時間。但是,甲骨文給了我「ORA-00947:沒有足夠的價值」的錯誤。儘管列和值匹配,Oracle給我錯誤ORA-00947

我在Google上搜索了這個錯誤,但是所有的答案都提到了數值和列數不匹配的情況。在我的情況下,他們匹配。 我錯在哪裏?

INSERT INTO db.eee_log (process_date, process_time, id, name, type) 
     VALUES(trunc(sysdate), 
      TO_CHAR(SYSTIMESTAMP,'HH24:MI:SS.FF5'), 
      (select p.id, p.name, p.type 
       from db.eee p 
       where id = 22 
       and name = 'xxx' 
       and type = 'xx')); 
+2

不能使用一個select語句在'insert'語句中指定你使用它的方式多列提供值。您需要決定僅使用'values()'子句還是僅使用'select'語句重寫您的查詢。 –

+0

爲什麼你在單獨的列中存儲日期和時間?您似乎也插入了您要過濾的相同值,所以您實際上是否需要按「eee」表,或者您是否可以直接插入過濾器值? –

回答

3

值的數量與列數不匹配。您在values子句中執行的子查詢被視爲單列表達式,而不是您期望的三個表達式。要使用這樣的子查詢,它將不得不返回一個單一的值,這將會進入一個列。

您可以從源表生成的所有值,而不是用在所有的子查詢或值子句:

INSERT INTO db.eee_log (process_date, process_time, id, name, type) 
SELECT trunc(sysdate),TO_CHAR(SYSTIMESTAMP,'HH24:MI:SS.FF5'),p.id, p.name, p.type 
from db.eee p 
where p.id = 22 
and p.name = 'xxx' 
and p.type = 'xx'; 

你舉的例子可能過於簡單,但如果那是你是真的做的和總有eee只有一行爲你提供,你可以用你目前的值子句中過濾直接代替文字值:

INSERT INTO db.eee_log (process_date, process_time, id, name, type) 
VALUES (trunc(sysdate),TO_CHAR(SYSTIMESTAMP,'HH24:MI:SS.FF5'), 22, 'xxx', 'xx'); 
2

你可以嘗試這樣的:

INSERT INTO db.eee_log (process_date, process_time, id, name, type) 
    select 
     trunc(sysdate), 
     TO_CHAR(SYSTIMESTAMP,'HH24:MI:SS.FF5'), 
     p.id, 
     p.name, 
     p.type 
    from db.eee p 
    where id = 22 
    and name = 'xxx' 
    and type = 'xx' 
0
INSERT INTO db.eee_log (process_date, process_time, id, name, type) 
SELECT trunc(sysdate), TO_CHAR(SYSTIMESTAMP,'HH24:MI:SS.FF5'), p.id, p.name, p.type from db.eee p 
      where id = 22 
      and name = 'xxx' 
      and type = 'xx' 
相關問題