由于我的学校不允许我发布代码,因此我不得不回到家里并举一个例子来说明我面临的问题。我的学校让我在动态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;
/
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)
非常感谢您提供的任何帮助。
答案 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))';