在PL SQL块中的执行立即数中传递动态日期

在PL SQL块中的执行立即数中传递动态日期,sql,oracle,plsql,Sql,Oracle,Plsql,我想将日期传递给PL/SQL块中的“CREATETABLE”语句,因为我想为最后一个未处理的日子创建快照表。 我试图运行以下代码: DECLARE current_date_key NUMBER; current_date DATE; BEGIN SELECT date_key INTO current_date_key FROM tmp_periods per WHERE per.status = 'UNPROCESSED'; current_date := trun

我想将日期传递给PL/SQL块中的“CREATETABLE”语句,因为我想为最后一个未处理的日子创建快照表。 我试图运行以下代码:

DECLARE
  current_date_key NUMBER;
  current_date DATE;
BEGIN
  SELECT date_key
  INTO current_date_key
  FROM tmp_periods per WHERE per.status = 'UNPROCESSED';

  current_date := trunc(TO_DATE(current_date_keys(i), 'yyyymmdd'));
  EXECUTE IMMEDIATE 'CREATE TABLE tmp_history_snapshot AS SELECT * FROM communication_history WHERE 
  new_date = :1' using current_date;    
END;
但它返回ORA-01027错误代码


您能帮助我如何将日期传递给这种语句吗?

绑定变量在DDL中是不允许的, 连接而不是使用绑定变量

DECLARE
  current_date_key NUMBER;
  current_date DATE;
  q VARCHAR2(32767);
BEGIN
  SELECT date_key
  INTO current_date_key
  FROM tmp_periods per WHERE per.status = 'UNPROCESSED';

  current_date := trunc(TO_DATE(current_date_keys(i), 'yyyymmdd'));

  q := 'CREATE TABLE tmp_history_snapshot AS SELECT * FROM communication_history WHERE
  new_date = ' || current_date;

  EXECUTE IMMEDIATE q;
END;

您最好设置日期格式,以避免意外行为。

是的,下面的答案是最好的