2016-08-01 54 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