如何在oracle中创建具有动态列名和动态数据类型的动态表,无需任何视图或任何其他表类型

2023-12-07

谢谢大家,我们可以在以下的帮助下动态创建一个表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

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

这是来自文档:

除多行查询外,动态字符串可以包含任何 SQL 语句(没有最后的分号) 或任何 PL/SQL 块(最后带有分号)。

删除分号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) works

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

例如,当您运行脚本时,SQL*Plus 会识别出有两个未知文字 (&colname and &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

假设您提供的“年龄”为colnameSQL*Plus 很乐意将其转换为:

colname varchar2(30) := 'age';

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在oracle中创建具有动态列名和动态数据类型的动态表,无需任何视图或任何其他表类型 的相关文章

随机推荐

  • 通过 preg_replace 使用文本中的电话号码

    我可以使用 preg replace 在文本中查找电话号码 text preg replace d s 8 25 0 9 d strong 1 strong text 但是 我正在开发一个小功能 其中电话号码将被混淆 因此我需要实际的电话号
  • 是否有适用于 iphone sdk 的谷歌日历 api?

    有没有适用于 iphone sdk 的谷歌日历 api 目前我开发了一个 iphone 日历本机应用程序 在此应用程序中 我想从两侧与谷歌日历同步 所以我想知道是否有任何谷歌日历 API 可以完成这项工作 I found iphone gc
  • 上下文菜单的 SwiftUI 自定义视图

    我想在视图上长按手势时实现相同的自定义弹出视图 如照片 来自 Tweeter 应用程序 所示 这样我就可以同时显示自定义视图和上下文菜单 您需要进行定制ContextMenu using UIContextMenu from UIKit s
  • 我的 getJSON 调用随机返回结果,而不是它们被调用的顺序

    我需要制作多个getJSON请求将数据写入 HTML 文件 此示例显示了 3 个请求 但我将以相同的格式添加最多 6 个请求 可能更多 我的问题是结果以随机顺序返回 而不是按调用顺序返回 我怀疑它们是按照请求完成的顺序返回的 我每次都必须以
  • SQL 中的空字符文字是什么?

    我想知道 a 的字面意思是什么空字符 例如 0 在 SQL 中 Note 不是 NULL 字段值 而是空字符 see link 我有一列混合了典型字符和空字符 我正在尝试用不同的值替换空字符 我本以为以下内容会起作用 但没有成功 selec
  • 如何在 Swift 中按长度反向/降序对字符串数组进行排序?

    我想根据长度按降序排列字符串集合 首先 我不确定是否应该使用集合或数组 因为集合是无序事物的集合 并且我不需要集合中的元素必须位于有序集合中 我遇到了sorted 方法和sorted by 方法 但无法弄清楚如何按长度降序排列 仅按字母顺序
  • 使 WPF 数据网格中的行不可聚焦

    我试图弄清楚如何使以下 WPF DataGrid 中的行不可聚焦 正如你所看到的 我尝试添加一个
  • Unity C#,如何从另一个脚本调用函数来启动动画?

    using UnityEngine using System Collections public class ClickToMoveScript MonoBehaviour public string Chopping Chopping
  • 加载图像时出现内存不足异常

    我使用以下代码将图像作为缩略图加载到 FlowLayoutPanel 控件 不幸的是我遇到了 OutOfMemory 异常 正如您已经猜测的那样 内存泄漏是在该行发现的 Pedit Image System Drawing Image Fr
  • 使用流畅的 nhibernate 自动映射 IDictionary

    我有一个简单的类 如下所示 public class Item some properties public virtual IDictionary
  • 在我的 flutter 应用程序中使用 Agora rtc 引擎时出现问题

    我在使用 agora rtc 引擎时遇到问题 每次启动项目时我都会收到此错误消息 https pastebin com DuniUQYd 我不知道问题是什么 因为错误消息对我来说不是很清楚 在代码中 我还发布了我正在使用的频道名称应用程序
  • 为什么 ostream_iterator 没有按预期工作?

    不用多说 就是下面的代码 include
  • Android 上的 OpenCV - 标头;没有该文件/目录

    所以我对使用 Android 的 JNI 很陌生 如果这是愚蠢的事情 请提前抱歉 我已经安装了 SDK 并在 Eclipse 中将其添加为项目的库 完成所有操作后 我尝试运行 ndk build 函数 但出现此错误 Compile thum
  • Java 套接字。服务器-客户端通信

    我正在尝试将带有 gui 的客户端与没有 gui 的服务器连接 连接正在完成 但我看不到这两个应用程序之间的任何消息 我应该在客户端中获取 SERVER HERE 在服务器中获取 CLIENT HERE 客户端连接代码 Override p
  • .NET Reactive Framework 的良好介绍[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 除了 Microsoft 文档之外 是否有关于 Microsoft Reactive Rx 框架的良好介绍和教程 另外 反应式使使用传统异步编码技术难以解决的编程问题变得更容易的一个
  • 自动为 Qt 配置套件

    SO 假设我对 QtCreator 中的新套件有许多设置 GCC 编译器 9 3 0 从源代码构建 因为我必须使用的发行版有一个非常旧的版本 以及环境设置 我已经成功地设置了一个用于编译和执行已编译二进制文件的环境 并制作了一个脚本以使其工
  • 如何在 devstack 中管理用户/密码?

    我已经安装了devstack到一个干净的 Ubuntu 机器 我可以访问 OpenStack 仪表板 http localhost auth login 但是 我不知道如何管理用户或我的初始凭据是什么 此信息保存在哪里 该信息保存在 Key
  • SQLAlchemy与association_proxy的关系问题

    我一直在浏览许多网站 试图了解正在发生的事情 但我确实需要一些直接的帮助 如果我错过了文档中明显的内容 我很抱歉 这就是我想要做的 我已经删除了除了基本代码之外的所有内容 Base declarative base class User B
  • 使用默认文本填充 FILE 字段

    我正在尝试重新利用生成 FILE 字段的代码 以便在将某些内容添加到数据库时使用 并在编辑或详细查看相关项目时使数据库中已有的数据变灰 并禁用 但是 我似乎无法让文本填充该字段 我正在使用这个 echo
  • 如何在oracle中创建具有动态列名和动态数据类型的动态表,无需任何视图或任何其他表类型

    谢谢大家 我们可以在以下的帮助下动态创建一个表execute immediate询问 但是 当我们创建一个表时 它已经创建了 但是如果我想动态创建具有动态列数的表 那么就会出现问题 实际上我已经创建了一个表 但是当我没有随表创建任何列时 会