Sql 如何为动态查询绑定日期

Sql 如何为动态查询绑定日期,sql,plsql,Sql,Plsql,我正在开发一个脚本,它执行一个动态构建查询,并在其中检查日期。 这不是实际的scipt,只是一个,来说明我的问题: DECLARE lv_query VARCHAR2(500); lv_date DATE; BEGIN lv_date := &cutomDate; lv_query := 'select * from executionlog e where e.execution_timestamp > ' || lv_date;

我正在开发一个脚本,它执行一个动态构建查询,并在其中检查日期。 这不是实际的scipt,只是一个,来说明我的问题:

DECLARE
  lv_query VARCHAR2(500);  
  lv_date  DATE;
BEGIN
  lv_date := &cutomDate;
  lv_query := 'select * from executionlog e
           where e.execution_timestamp > ' || lv_date;
  dbms_output.put_line(lv_query);
  EXECUTE IMMEDIATE(lv_query);
END;
当我给出自定义日期时,例如:
to_date('01011987','ddmmyyyy')
我得到以下字符串作为我的查询:

从ExecutionLoge中选择* 其中e.execution\u timestamp>01-JAN-87

我得到了以下错误:

ORA-00904错误:“JAN”:标识符无效

我理解这个查询不能正确执行,因为e.execution\u timestamp是日期,01-JAN-87是Varchar2

如何将1987年1月1日转换回日期?到目前为止,我一直在玩
,但到目前为止,我还没有得到想要的结果


我无法改变查询是动态生成的事实。

我也遇到过类似的情况。不同的是,我使用的是sql server,通过openquery连接到oracle。这意味着我必须向oracle发送一个sql字符串,类似于您正在做的事情。我发现格式:

{ts 'yyyy-mm-dd hh:mm:ss'}
会有很好的效果。我编写了一个函数,返回以下内容:

select @StringOut = '{ts ''''' + convert(varchar(20), @DateIn, 20) + ''''' }';

在您的情况下,您必须使用带有适当掩码的to_char。最困难的部分可能是获得正确数量的单引号。

使用绑定变量,而不是串联:

DECLARE
  lv_query VARCHAR2(500);
  lv_date  DATE;
BEGIN
  lv_date := &cutomDate;
  lv_query := 'select * from executionlog e
           where e.execution_timestamp > :pDate';
  dbms_output.put_line(lv_query);
  EXECUTE IMMEDIATE lv_query USING lv_date;
END;
您可以在代码中提示输入字符串并注明日期,而不是让用户使用TO_DATE函数:

DECLARE
  lv_query VARCHAR2(500);
  lv_date  DATE;
BEGIN
  lv_date := TO_DATE(&cutomDate,'DDMMYYYY');
  lv_query := 'select * from executionlog e
           where e.execution_timestamp > :pDate';
  dbms_output.put_line(lv_query);
  EXECUTE IMMEDIATE lv_query USING lv_date;
END;

因此,现在用户只需在提示时键入
01011987

提示输入字符串是个好主意!你的解决方案很有魅力。