gpt4 book ai didi

oracle - 如何在oracle中创建具有动态列名和动态数据类型的动态表,而不需要任何 View 或任何其他表类型

转载 作者:行者123 更新时间:2023-12-02 03:12:57 29 4
gpt4 key购买 nike

谢谢大家,我们可以借助执行立即查询动态创建表。但是,当我们创建一个表时,它已经创建了,但是如果我想动态创建具有动态列数的表,那么就会出现问题。实际上我已经创建了一个表,但是当我没有随表创建任何列时,会出现很多错误。以下是我在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

最佳答案

不能在 EXECUTE IMMEDIATE 中对单个语句使用分号

这里引用 documentation :

Except for multi-row queries, the dynamic string can contain any SQL statement (without the final semicolon) or any PL/SQL block (with the final semicolon).

删除EXECUTE IMMEDIATE中的分号。

execute immediate 'create table smap1(nam varchar2(10));'; -- this is your code
execute immediate 'create table smap1(nam varchar2(10))'; -- correct code, no semicolon at end

但是还有另一个问题。

您需要了解替换变量 (&variable) 的工作原理

SQL*Plus 只会提示输入替换变量一次:就在脚本编译之前、运行之前。然后在脚本中逐字替换变量,然后编译并执行。

例如,当您运行脚本时,SQL*Plus 会识别出两个未知文字(&colname&coldata),并会提示您。如果您为他们提供值“age”和“number”,SQL*Plus 将重写脚本,如下所示:

declare
-- omitted to add clarity
begin
execute immediate 'create table smap1(nam varchar2(10));';
if(no_of_cols>=2) then
for i in 2..no_of_cols loop
colname:=age;
coldata:=number;
execute immediate 'alter table smapl add '||colname||' '||coldata;
end loop;
end if;
end;

因此,如果您想要将字符串文字分配给变量,并且想要从替换变量中获取该字符串,则需要执行以下操作:

colname varchar2(30) := '&colname'; -- notice the single quotes

假设您为 colname 提供了“年龄”,SQL*Plus 很乐意将其转换为:

colname varchar2(30) := 'age';

因此,将替换变量放入循环内不会使 SQL*Plus 反复提示您输入它的值

关于oracle - 如何在oracle中创建具有动态列名和动态数据类型的动态表,而不需要任何 View 或任何其他表类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24903483/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com