【发布时间】:2014-07-23 06:42:05
【问题描述】:
谢谢大家,我们可以借助execute immediate查询动态创建表。但是,当我们创建一个表时,它就被创建了,但是如果我想动态地创建具有动态列数的表,那么就会提出问题。实际上我已经创建了一个表,但是当我没有与表一起创建列时,就会引发很多错误。以下是我在Oracle中编写的程序代码。
declare
no_of_cols number:=&no_of_cols;
colname varchar2(20);
coldata varchar2(20);
i number;
begin
execute immediate 'create table smap1(nam varchar2(10))';
age:='age';
datf:='number'
if(no_of_cols>=2) then
for i in 2..no_of_cols loop
colname:=age;
coldata:=datf;
execute immediate 'alter table smapl add '||colname||' '||coldata;
end loop;
end if;
end;
如果 no_of_cols 为 5,则此代码使用相同类型的四列执行。然后我修改了代码并运行 plsql 程序。程序如下
declare
no_of_cols number:=&no_of_cols;
colname varchar2(20);
age varchar2(20);
datf varchar2(20);
coldata varchar2(20);
i number;
begin
execute immediate 'create table smap1(nam varchar2(10))';
if(no_of_cols>=2) then
for i in 2..no_of_cols loop
age :=&age;
datf:=&datf;
colname:=age;
coldata:=datf;
execute immediate 'alter table smapl add '||colname||' '||coldata;
end loop;
end if;
end;
以下是创建上述程序时产生的错误
[Error] Execution (13: 19): ORA-06550: line 13, column 19:
PLS-00103: Encountered the symbol ";" when expecting one of the following:
( - + case mod new not null <an identifier>
<a double-quoted delimited-identifier> <a bind variable>
continue avg count current exists max min prior sql stddev
sum variance execute forall merge time timestamp interval
date <a string literal with character set specification>
<a number> <a single-quoted SQL string> pipe
<an alternatively-quoted string literal with character set specification>
<an alternatively
我对上面的plsql做了一些修改,那么plsql代码如下
declare
no_of_cols number:=&no_of_cols;
colname varchar2(20):='&colname';
coldata varchar2(20):='&coldata';
i number;
begin
execute immediate 'create table smap1(nam varchar2(10))';
if(no_of_cols>=2) then
for i in 2..no_of_cols loop
execute immediate 'alter table smapl add '||colname||' '||coldata;
end loop;
end if;
end;
然后执行后我收到以下错误,它不会动态读取列名
[Error] Execution (1: 1): ORA-02263: need to specify the datatype for this column
ORA-06512: at line 10
【问题讨论】:
-
您正在混合使用 plsql 变量和 sql*plus 变量 (
&)。另外,您不能创建一个空表并向其添加列 - 您需要将字符串连接成一个create table (...)字符串,然后才能立即执行。 -
“引发了很多错误。”引发的错误是什么?
-
我忘记提及这些错误,现在我已经编辑了问题
-
你用什么客户端来执行这个?是 SQL*Plus 吗?
-
Toad 12c 和 oracle 11g 作为客户端