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

时间:2017-01-10 10:10:14

标签: sql oracle plsql

由于我的学校不允许我发布代码,因此我不得不回到家里并举一个例子来说明我面临的问题。我的学校让我在动态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)

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

1 个答案:

答案 0 :(得分:4)

尼克,

请注意,上述过程将创建一个带有双qoutes(“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))';