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