Plsql 在动态PL/SQL中创建一个表,其中包含“日期条件”

Plsql 在动态PL/SQL中创建一个表,其中包含“日期条件”,plsql,dynamic-sql,Plsql,Dynamic Sql,我被分配了以下任务 假设我们有一个由id列和日期列构成的表a。 用PL/SQL编写一个过程:将本例中的表名a和日期D作为参数,创建一个名为a_bck的备份表,其中只包含a的日期

我被分配了以下任务

假设我们有一个由id列和日期列构成的表a。 用PL/SQL编写一个过程:将本例中的表名a和日期D作为参数,创建一个名为a_bck的备份表,其中只包含a的日期 不幸的是,我得到了这个错误:

Error report -
ORA-00904: "MAY": invalid identifier
ORA-06512: at line 41
ORA-06512: at line 80
00904. 00000 -  "%s: invalid identifier"
如果我尝试在id列上使用where条件而不是在日期列上使用where条件来实现相同的结果,那么我没有问题。
错在哪里?我是否完全以错误的方式实现了它?

您遇到的问题是,在执行动态sql时,您的查询被构建为一个字符串。Oracle不知道您给出的日期实际上是一个日期,它只是被当作字符串的一部分。要解决此问题,您应该能够执行以下操作:

my|U query:=“创建表格”|表格|名称|备份| |”作为选择*从“|表格|名称| |”中选择,其中表格|日期<到|日期'| |备份|

这会帮你解决问题。作为旁注,您可能需要更改表的exists查询,因为表名都以大写形式存储,例如

从用户_表中选择COUNT*INTO table_exists,其中table_NAME=uppermy_table

编辑:评论后的进一步解释

为了解释为什么在使用整数时不会出现上述问题,请务必记住,使用executeimmediate只是将给定字符串作为SQL查询执行

例如:

declare 
  x INTEGER := 1;
  i integer;
  my_query VARCHAR2(256);
begin
  my_query := 'select 1 from dual where 1 = ' || x;
  EXECUTE IMMEDIATE my_query INTO i;
end;
上述示例中的my_查询将按以下方式执行:

从dual中选择1,其中1=1

这是非常有效的sql。然而,在您的示例中,您最终得到了如下结果:

创建表abaco_bck作为从abaco中选择*,其中表_日期<17年5月27日

由于它没有用引号括起来,也没有显式转换为日期,SQL引擎试图从27中减去MAY,但它不知道MAY是什么

另一件需要提及的事情是,对于某些操作,您可以使用绑定变量而不是引号,尽管对于DDL,您不能这样做

declare 
  lToday    DATE := SYSDATE;
  i         INTEGER;
  my_query  VARCHAR2(256);
begin
  my_query := 'select 1 from dual where sysdate = :1';
  EXECUTE IMMEDIATE my_query INTO i USING lToday;
end;

这听起来像是日期格式模型的问题。到目前为止你做了什么?外部链接可能不是每个人都可以访问的。现在一切都有意义了!因此,每当我需要创建一个动态SQL语句时,非字符串的变量必须使用转义。我错误地认为连接是自动完成工作的。但是,为什么如果变量是一个数字,我没有得到任何错误?添加了一些解释,希望能为您添加一些澄清-很好的解释。我更喜欢“where table_date