运行 plsql 块时出现无效标识符错误

Posted

技术标签:

【中文标题】运行 plsql 块时出现无效标识符错误【英文标题】:Invalid identifier error while running plsql block 【发布时间】:2017-01-10 10:10:13 【问题描述】:

由于我的学校不允许我发布代码,因此我不得不回家并举一个例子来说明我面临的问题。我的学校要求我做一个关于动态 sql 的作业以创建一个表,然后在其中插入一个虚拟记录。但是在这样做时,我面临以下问题。请在下面找到代码供您参考。谢谢你。

程序:

create or replace procedure table_creation(table_name in varchar2,col1  varchar2,col2 varchar2)
is
l_stat varchar2(3000);
v_stat varchar2(1000);
a varchar2(10):='1';
b varchar2(10):='Dummy';
begin
l_stat:='create table '||table_name||' ("'||col1||'"   varchar2(10),"'||col2||'" varchar2(10))';
execute immediate l_stat;
execute immediate 'insert into '||table_name||'('||col1||','||col2||')  values    (:x,:y)' using a,b;
end;
/

Plsql 块调用过程:

set serveroutput on;
declare
a varchar2(10);
b varchar2(10);
c varchar2(10);
begin
a:='Example';
b:='id';
c:='nm';
table_creation(a,b,c);
dbms_output.put_line('Yes');
end;
/

程序正在完美创建,在运行上述块时,我收到以下错误。

declare
*
ERROR at line 1:
ORA-00904: "NM": invalid identifier
ORA-06512: at "SYS.TABLE_CREATION", line 9
ORA-06512: at line 9

但是当我检查创建的表时。该表存在 0 条记录。表的结构如下。

 Name                                      Null?    Type
 ----------------------------------------- -------- ---------------
 ID                                                 VARCHAR2(10)
 NM                                                 VARCHAR2(10)

非常感谢您提供的任何帮助。

【问题讨论】:

可能是个愚蠢的问题,但您确定该表不存在吗? 问题看起来是围绕着这样一个事实,即您在 create table 语句中双引号引用了您的列,但在 insert 语句中,您没有。如果您要在 create table 语句中使用双引号(这会在标识符名称中强制区分大小写),那么在其他地方引用这些列时将需要使用双引号。因此,要么从你的 create table 语句中删除双引号,要么将它们添加到你的 insert 语句中。 @johnHC 如果表已经存在,他将不会收到此错误消息。 您确定要求吗?使用动态 SQL 创建表(或任何其他数据库对象)是非常不常见且糟糕的设计。通常动态 SQL 主要用于 DML(如 INSERT)或查询。 是的,这是为了让我们了解如果我们在过程中使用 ddl 语句会发生什么。 【参考方案1】:

尼克,

请注意,上述过程将创建带有双引号(“ID”,“NM”)的列,因此会发生错误。请找到更新的代码并检查问题是否已解决。

根据oracle=>

Oracle 在列名和表名中区分大小写。默认情况下,它只是将所有内容都转换为大写。但是,如果您在双引号中使用名称,您会告诉 Oracle 以您提供的确切拼写方式创建列(在 CREATE 语句中为小写)。

代码:

create or replace procedure table_creation(table_name in varchar2,col1 varchar2,col2 varchar2)
is
l_stat varchar2(3000);
v_stat varchar2(1000);
a varchar2(10):='1';
b varchar2(10):='Dummy';
begin
l_stat:='create table '||table_name||' ('||col1||' varchar2(10),'||col2||' varchar2(10))';
execute immediate l_stat;
execute immediate 'insert into '||table_name||'('||col1||','||col2||') values   (:x,:y)' using a,b;
end;
/

注意:我没有触及代码的任何其他逻辑。请尝试告诉我们结果。

唯一的变化是

发件人:

 l_stat:='create table '||table_name||' ("'||col1||'" varchar2(10),"'||col2||'" varchar2(10))';

到:

 l_stat:='create table '||table_name||' ('||col1||' varchar2(10),'||col2||' varchar2(10))';

【讨论】:

@Nickynick 请记住,不能在 plsql 块中使用 create 语句。在很多情况下,使用 create 语句会引发很多问题。尝试在网络中签出以了解相同的内容。谢谢。

以上是关于运行 plsql 块时出现无效标识符错误的主要内容,如果未能解决你的问题,请参考以下文章

ORA-00904 在 DATE 列上使用“MERGE INTO”和“SELECT FROM dual”时出现“无效标识符”错误

避免 ORA-00904 - 在 java 中进行 sql 查询时出现无效标识符错误,因为该列可能会或可能不会在数据库中预设

PL/SQL JAVA ORACLE 错误 ORA-00904: 标识符无效

运行conf.js文件时出现意外的标识符错误

尝试验证时出现 Xcode 错误

未捕获的语法错误:在 JS 文件中导入 JavaScript 时出现意外标识符