如何动态创建表数据类型的变量?

2024-05-25

在以下查询中 select_string 可以返回具有任何可能数据类型的任意数量的列和行。

Execute immediate 'select_string' into v_table_variable;

例如 select_string 可以是'select name, last name from student' or 'select date, subject, address , phone from booking'等等。

有谁知道如何定义 v_table_variable 以便立即执行按我想要的方式运行?!我打算稍后创建一个循环来读取该变量的值。

非常感谢!


“完整的”动态版本将是这个(未经测试):

DECLARE  
  v_stmt_str       VARCHAR2(200);
  v_cur            INTEGER;
  v_rows_processed INTEGER;

  col_cnt     INTEGER;
  rec_tab     DBMS_SQL.DESC_TAB;
  rec         DBMS_SQL.DESC_REC;

  num_var NUMBER;
  string_var VARCHAR2(4000);
  date_var DATE;
  -- .. some more variables if needed 
BEGIN
  v_cur := DBMS_SQL.OPEN_CURSOR; -- open cursor 
  v_stmt_str := 'SELECT whatever from ....';
  DBMS_SQL.PARSE(v_cur, v_stmt_str, DBMS_SQL.NATIVE); 
  DBMS_SQL.DESCRIBE_COLUMNS(v_cur, col_cnt, rec_tab);  

  FOR c in 1..col_cnt LOOP
     rec := rec_tab(c);
     IF rec.col_type = DBMS_TYPES.TYPECODE_NUMBER THEN
         DBMS_SQL.DEFINE_COLUMN(v_cur, c, num_var); 
     ELSIF rec.col_type = DBMS_TYPES.TYPECODE_VARCHAR2 THEN
         DBMS_SQL.DEFINE_COLUMN(v_cur, c, string_var, rec.col_max_len); 
     ELSIF rec.col_type = DBMS_TYPES.TYPECODE_DATE THEN
         DBMS_SQL.DEFINE_COLUMN(v_cur, c, date_var); 
     -- .. some more data types if needed
     END IF;
  END LOOP;

  -- Execute
  v_rows_processed := DBMS_SQL.EXECUTE(v_cur);  
  LOOP 
    -- Fetch a row 
    IF DBMS_SQL.FETCH_ROWS(v_cur) > 0 THEN 
      FOR c in 1..col_cnt LOOP
        rec := rec_tab(c);
        IF rec.col_type = DBMS_TYPES.TYPECODE_NUMBER THEN
            DBMS_SQL.COLUMN_VALUE(v_cur, c, num_var); 
        ELSIF rec.col_type = DBMS_TYPES.TYPECODE_VARCHAR2 THEN
            DBMS_SQL.COLUMN_VALUE(v_cur, c, string_var); 
        ELSIF rec.col_type = DBMS_TYPES.TYPECODE_DATE THEN
            DBMS_SQL.COLUMN_VALUE(v_cur, c, date_var); 
        -- .. some more data types if needed
        END IF;
      END LOOP;
      -- Process: do something with num_var or string_var or date_var values
    ELSE
      EXIT; 
    END IF; 
  END LOOP; 
  DBMS_SQL.CLOSE_CURSOR(v_cur); -- close cursor
END;
/

但正如评论中已经指出的那样,如果您确实需要如此动态,请检查您的要求 - 可能不需要。

查看 Oracle 文档编码动态 SQL http://docs.oracle.com/cd/B19306_01/appdev.102/b14251/adfns_dynamic_sql.htm and DBMS_SQL http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_sql.htm对于其他示例。有多种方法可以提供不同“级别”的动态。

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

如何动态创建表数据类型的变量? 的相关文章

  • 实体框架与oracle数据库的连接

    我使用的是 Entity Framework 6 1 版本和 oracle 11 我是实体框架的新手 任何人都可以建议连接 oracle 的先决条件是什么 任何更改都需要在 web config 中进行 在web config中 默认它是与
  • 带触发器的物化视图?

    我可以在物化视图上创建触发器吗 我用的是甲骨文10g 是的你可以 请小心 这是什么Oracle 文档 http download oracle com docs cd B19306 01 server 102 b14200 statemen
  • C# 中强制关闭 oracle 连接

    我有一个报告窗口 显示从可能长时间运行的 Oracle 存储过程返回的结果 我的问题是 当用户关闭窗口时 与 Oracle 的连接保持打开状态 并且可能长时间运行的报告不会被取消 关闭打开的连接的唯一方法是 DBA 手动终止它们或用户退出整
  • 想要在Sql中获取两列的差异

    我想获取表的列的差异 我们的列名称为 Planned date 所以现在我想获取这两列的差异 A Planned Date of stop1 Planned Date of stop5 那么我如何编写查询来获取 A 的值 下面是我编写的示例
  • oracle查找两个表之间的差异

    我有两个结构相同的表 一个是临时的 另一个是产品的 每次都会加载整个数据集 有时该数据集会从先前的数据集中删除记录 我首先将数据集加载到临时表中 如果删除了任何记录 我也想从产品表中删除它们 那么如何找到prod中存在但temp中不存在的记
  • 是什么原因导致 Oracle tkprof 文件中 CPU 时间和运行时间之间存在差异

    在分析 Oracle tkprof 跟踪文件时 我注意到有时 cpu 时间和经过的时间之间存在很大差异 但我不知道是什么原因造成的 例如 call count cpu elapsed disk query current rows Pars
  • Oracle SQL - 如何使用 RANK() 或 DENSE_RANK() 和 ROW_NUMBER() 分析函数获取不同的行?

    我希望获得每个部门前 3 名不同的薪资 我能够使用RANK or DENSE RANK or ROW NUMBER 但我的表有一些工资相同的记录 下面提到的是我的查询及其结果 20部薪资前三名应该是6000 3000 2975 但是有 2
  • 如何找到 Oracle 视图的基础列和表名称?

    这听起来应该很简单 但事实并非如此 我找不到任何 Oracle 元数据 视图可以提供 Oracle 视图列的基础列和表名称 我发现这样做的唯一方法是解析视图源 SQL 这与精确的科学相去甚远 为了解释我想要什么 请考虑我在 SCOTT 模式
  • PL/SQL 过程成功完成但没有显示任何内容

    我有以下过程代码 create or replace PROCEDURE Ventas cliente p DNI IN CHAR IS CURSOR c pedidos clientes IS SELECT FROM Pedidos ve
  • 尝试在 Oracle 11.2.0.2.0(64 位)中获取连接时出现 java.lang.ArithmeticException

    我目前正在 Oracle 中使用 Java 存储过程 并且在尝试在 Java 代码中获取连接时看到一些奇怪的行为 我的Java被打包成jar文件 然后使用以下命令部署到Oracle中loadjava命令行实用程序 Apackage然后在数据
  • Oracle 11g OFFSET FETCH 给出错误

    我正在进行查询并尝试从数据库中获取随机数量的行 但 Oracle 一直告诉我我的命令尚未正确结束 select from random table order by random column name offset 0 rows fetc
  • ActiveRecord oracle_enhanced 适配器无法加载 ruby​​-oci8 库

    rails g scaffold失败 但 oci 脚本和 irb 数据查询有效 无法弄清楚出了什么问题 rails g scaffold table field1 integer field2 string invoke active re
  • 数百个别名/同义词与数据库表的完全限定名称

    考虑到多个模式中的数百个数据库表 在创建存储过程和视图时 您是否建议使用别名 同义词或完全限定名称 给定一些 schema table 像这样 Orders OrderHeader Production LineThroughput Sal
  • 替换 Oracle 包的一部分

    我需要修改包内的一个过程 我需要接触声明和实施 由于我正在维护每次修改的补丁文件 因此我希望更改最小化 我可以仅使用更改的过程更新包 如果是 如何更新 还是需要提供完整的包定义和实现 您需要替换整个包规范和主体 您不能仅对包的一部分进行操作
  • FROM 子句中的嵌套括号是否有效的 Oracle SQL 语法?

    此查询使用正确的 Oracle 语法吗 select from dual a where a dummy X 它可以在 11g 和 12c 中运行 但它是真正有效的语法吗 或者这只是一个编译器 错误 将来可能会修复 导致代码失败 我怀疑这是
  • Oracle:使用SQL或PL/SQL查找动态SQL中的错误位置

    如何在 PL SQL 或 SQL 中找到动态 SQL 语句中的错误位置 从 SQL Plus 中 我看到了错误的位置 例如 无效的 SQL DML 语句 SYS orcl gt SELECT 2 X 3 FROM 4 TABLEX 5 TA
  • REgex从oracle中的字符串中获取数字

    我有以下格式的字符串 阿克拉姆 88 jamesstree 20140418 阿克兰 8 约翰街 20140418 阿克兰 888 johnstreet 20140418 现在我只想检索 88 8 和 888 值 我为此编写了以下查询 SU
  • ORA-12154: TNS: 无法解析指定的连接标识符 (PLSQL Developer)

    我需要使用 PLSQL Developer 访问 oracle 数据库 当我尝试连接到数据库时出现以下错误 ORA 12154 TNS could not resolve the connect identifier specified 我
  • Delphi 5 中的 Oracle 数据库连接

    我正在使用 Delphi 5 版本 我想连接到 Oracle 数据库 我有 TDatabase 组件 我不知道如何通过 Delphi 连接到数据库 请提供连接数据库的步骤 谢谢 The TDatabase http docwiki emba
  • 在 Oracle 行的多个列上使用透视

    我在 Oracle 表中有以下示例数据 tab1 我正在尝试将行转换为列 我知道如何在某一列上使用 Oracle 数据透视表 但是否可以将其应用于多个列 样本数据 Type weight height A 50 10 A 60 12 B 4

随机推荐

  • 将 url 重定向到带有尾随点的主页

    Google 网站管理员显示一些重复的网址 他们是 www abc com index php option com toys view detail n id 148 ite www abc com index php option co
  • 用于从链接中选择文本的 xpath 表达式

    我有这样的html文件内容 a class bf title Link to book href book 229920 book name a 帮我构造 xpath 表达式来获取链接文本 书名 我尝试使用 a 但表达式计算时没有结果 如果
  • C++ 标准是否允许未初始化的 bool 导致程序崩溃?

    我知道一个 未定义的行为 C 几乎可以让编译器做任何它想做的事情 然而 我遇到了一次令我惊讶的崩溃 因为我认为代码足够安全 在这种情况下 真正的问题仅发生在使用特定编译器的特定平台上 并且仅在启用优化的情况下发生 我尝试了几种方法来重现问题
  • 在不同的活动上显示 OnItemClickListener 的结果

    我使用 OnItemClickListener 从列表视图中选择一个项目 如下所示 listView setTextFilterEnabled true final TextView disp TextView findViewById R
  • 如何从 Bootstrap CSS 的下拉列表中删除箭头?

    我正在尝试删除 Twitter Bootstrap 框架中下拉菜单中出现的箭头 有没有人想出去除箭头的方法 从链接中删除插入符类会从导航栏中删除箭头 dropdown menu before dropdown menu after bord
  • 氧图。如何将轴旁边的值格式从 1000 更改为 1k

    我正在尝试更改轴旁边的值的格式 例如从 1000 更改为 1k 或 1000000 更改为 1M 这在 LinearAxis 中可能吗 这是我的代码 m Axes Add new LinearAxis Position AxisPositi
  • 使用强制转换的可变访问器安全吗?

    我试图理解重复代码的问题 and mut在 getter 类型的函数中 我试图了解这个问题的特定解决方案是否使用内部的强制转换unsafe块将是安全的 以下是该问题的示例 它取自非常好的教程 使用太多的链表学习 Rust https rus
  • Python 的二进制字符串列表

    我有一个像这样的二进制字符串 1100011101 我想将其解析为一个列表 其中每个 1 或 0 块都是列表中的单独值 例如 1100011101 变成 11 000 111 0 1 您可以通过使用正则表达式而不是从中获得一点 次要 性能g
  • 覆盖 Bootstrap 表格边框折叠样式

    引导程序有一个table border collapse collapse border spacing 0 风格 我想覆盖它 所以我创建了一个类并将其应用到有问题的表 table FormGroupContainer border col
  • Puppeteer 错误 错误:等待选择器超时

    目前我有一个网站 其 HTML 中有此内容 我通过检查chrome开发者工具中的元素确认了这一点 div class hdp photo carousel div class photo tile photo tile large 我直观地
  • 支持 IE 中的“border-radius”

    有谁知道 Internet Explorer 是否 何时支持 border radius CSS 属性 是的 2011 年 1 月 IE9 发布时 假设您希望所有四个边均为 15px myclass border style solid b
  • 使用 rpy2 将 NULL 从 Python 转换为 R

    在 R 中经常NULL值用作默认值 使用 Python 和 RPy2 如何显式提供NULL争论 None不可兑换 NotImplementedError 字符串 NULL 只会被转换为字符串 并在执行过程中导致错误 采取以下示例 使用tsi
  • Matplotlib - 使用 plt.imshow() 时序列关闭

    我在 Jupyter 笔记本中编写了一个狗分类器 每次在图像中检测到狗时 它都应该显示该图像并打印一些描述该图像的文本 不知何故 无论我按什么顺序放置 图像总是在打印所有文本后显示plt imshow and print 有谁知道为什么会这
  • 使用 CodeIgniter 中的模板自定义错误页面

    我正在使用 CodeIgniter 的模板库 http williamsconcepts com ci codeigniter libraries template reference html http williamsconcepts
  • Java生成范围内不重复的随机数

    我想生成 1 到 4 范围内的随机数 包括 4 这是我的代码 int num r nextInt 4 1 r is instance of Random 但是 我在循环中运行上述代码 并且不想重复随机数 现在发生的事情我经常得到 1 1 1
  • 将数据类型 varchar 转换为 int 时出错

    我试图使用基于 varchar 类型的 Name 列的输入值的存储过程返回 item 表的 ItemId 列值 但是每当我将任何值传递给存储过程时 它都会返回一个错误 将数据类型 varchar 转换为 int 时出错 create pro
  • Firebase 分析和 GTM 跟踪

    这个问题是关于为什么 Google Analytics Firebase 需要 GTM 关于这个问题有一个类似的帖子 但它与HOW https stackoverflow com questions 39636030 how does th
  • 使用正确的时区将 ICS 导入 Google 日历

    我正在尝试将一个简单的 ics 文件导入 Google 日历 但是 即使我指定了时区 Google 日历仍然会导入错误的事件时间 尽管它确实说错误的时间位于正确的时区 这是我的 ics 文件的示例 BEGIN VCALENDAR BEGIN
  • 降低 Nodejs 服务器上的 CPU 利用率

    我正在研究降低 CPU 利用率的有趣方法 在 NodeJS 服务器上 在我的研究过程中 我发现了以下文章 http engineering linkedin com nodejs blazing fast nodejs 10 perform
  • 如何动态创建表数据类型的变量?

    在以下查询中 select string 可以返回具有任何可能数据类型的任意数量的列和行 Execute immediate select string into v table variable 例如 select string 可以是