0

嗨,我想触发这个查询

update txnblackout
  set enddate= ''TO_DATE('25/02/2012','dd/mm/yyyy')''
  where idsequence='1'

但它不工作给出错误

ORA-00933: SQL command not properly ended

你能证明它的合理性吗?为什么会这样?

这是我用来创建查询的 java 代码:-

Map<String, String> l_script_columns = new HashMap<String, String>();
        l_script_columns.put("startdate", "'TO_DATE('"
            + txtStartDate.getText().trim() + "','"
            + FieldMapperHelper.DATE_Format + "')'");

如果您需要更多说明,请告诉我。谢谢。

4

4 回答 4

2

你为什么要逃避?

with txnblackout as 
       (select trunc(sysdate + level) enddate /* trunc drops time component */ , level idsequence
          from dual
       connect by level <= 10 /* this will generate 10 rows with an incrementing 'level' value */ )
select enddate
     , idsequence
  from txnblackout
 where enddate = to_date('20/10/2012','dd/mm/yyyy')
;

因此,您应该安全地删除额外的引号,它们不是必需的。

update txnblackout
  set enddate= TO_DATE('25/02/2012','dd/mm/yyyy')
  where idsequence=1;

(注意这假设 idsequence 是一个数字)


归根结底,如果您将一个非参数化的动态 sql 查询传递给 Oracle,您需要它看起来像这样:

"update txnblackout   
    set enddate= TO_DATE(''25/02/2012'',''dd/mm/yyyy'')  
  where idsequence=1;"

(请注意,我仍然假设 idsequence 是 NUMBER 类型而不是 varchar)

不过看看这个,尽量安全!

如果您对其进行参数化,您也不必担心转义!

在 Java 中防止 SQL 注入

于 2012-10-16T13:31:01.013 回答
1

您上面的查询要保留日期或文本,所以在第一种情况下

    update txnblackout 
        set enddate= TO_DATE('25/02/2012','dd/mm/yyyy')
      where idsequence='1'

id 序列是文本还是数字无关紧要,在第二种情况下,您要保留文本:

     update txnblackout 
        set enddate= 'TO_DATE(''25/02/2012'',''dd/mm/yyyy'')'
      where idsequence='1'

我想你想要第一个案例,请检查。最好的祝福

于 2012-10-16T13:50:06.977 回答
1

在这种情况下,你必须尝试这个:

Map<String, String> l_script_columns = new HashMap<String, String>();
        l_script_columns.put("startdate", "'||TO_DATE('"
            + txtStartDate.getText().trim() + "','"
            + FieldMapperHelper.DATE_Format + "')||'");

那么最终结果将是:

update txnblackout 
    set enddate= ''||TO_DATE('25/02/2012','dd/mm/yyyy')||''
  where idsequence='1'
于 2013-02-11T09:34:30.920 回答
0

试着把';' 在你的命令结束时......

您的命令应如下所示: update txnblackout set enddate= ''TO_DATE('25/02/2012','dd/mm/yyyy')'' where idsequence='1';

于 2013-03-18T14:21:31.597 回答