2016-08-01 57 views
0

你好,我不知道爲什麼發生這種情況,但我想,以執行合併使用參數化查詢錯誤ORA-00904「invalide indentifier」當使用「合併到」與參數化查詢

如果我運行硬編碼值查詢查詢精運行:

MERGE INTO MyTable e 
USING (with cte(id, name,date) as 
(select * from (select 10,'Tester','2013-05-08' from dual union 
select 11,'Tester2','2015-05-08' from dual union 
select 12,'Tester3'','2015-05-09' from dual union 
select 13,'Tester4'','2015-05-09' from dual 
))select * from cte) S 
ON (e.id = S.id) 
WHEN MATCHED THEN UPDATE SET prefixName = S.name,lastModi=S.date 

然而,當我執行這個參數化查詢,當我分配相應的值我在日期1列得到一個ORA-00904錯誤

MERGE INTO MyTable e 
USING (with cte(id, name,date) as 
(select * from (select :id1,:name1,:date1 from dual union 
select :id2,:name2,:date2 from dual union 
select :id3,:name3,:date3 from dual union 
select :id4,:name4,:date4 from dual 
)) select * from cte) S 
ON (e.id = S.id) 
WHEN MATCHED THEN UPDATE SET prefixName = S.name,lastModi=S.date 

有人可以幫我解決這個問題。

感謝

+0

基於文檔,它期望在那裏的字段名稱。你可以試試我別稱那種表情嗎?或者創建更多表達式?例如:'''||:date1 as datefield'? –

回答

0

我做了一些關於這個問題的調查,它似乎是一個數據庫鏈接問題。由於某些原因,當我們將參數放入查詢中時,Oracle無法找到該表,因爲它不在正確的數據庫中。但是,查詢中的硬編碼值可以成功查找表,即使它在另一個數據庫中。所以我改變了我的代碼中的數據庫,現在它工作正常

0

我只是測試,並第一個查詢確實運行良好,它會引發同樣的錯誤。這是因爲您不能使用保留關鍵字「date」作爲列別名。將其更改爲「date_」或類似的東西,那麼它應該工作。

0

被迫使用Oracle保留關鍵字,則必須用雙引號吧:

MERGE INTO MyTable e 
USING (
    with cte(id, name,"date") as 
    (select * from (select :id1,:name1,:date1 from dual union 
    select :id2,:name2,:date2 from dual union 
    select :id3,:name3,:date3 from dual union 
    select :id4,:name4,:date4 from dual 
    ) 
) select * from cte) S 
ON (e.id = S.id) 
WHEN MATCHED THEN UPDATE SET prefixName = S.name,lastModi=S."date" 

最好是完全不使用保留的關鍵詞:the_spec_date代替date

MERGE INTO MyTable e 
USING (
    with cte(id, name,the_spec_date) as 
    (select * from (select :id1,:name1,:date1 from dual union 
    select :id2,:name2,:date2 from dual union 
    select :id3,:name3,:date3 from dual union 
    select :id4,:name4,:date4 from dual 
    ) 
) select * from cte) S 
ON (e.id = S.id) 
WHEN MATCHED THEN UPDATE SET prefixName = S.name,lastModi=S.the_spec_date