运行 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 查询时出现无效标识符错误,因为该列可能会或可能不会在数据库中预设