Sql 如何为动态查询绑定日期
我正在开发一个脚本,它执行一个动态构建查询,并在其中检查日期。 这不是实际的scipt,只是一个,来说明我的问题: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;
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
。提示输入字符串是个好主意!你的解决方案很有魅力。