通过列名动态访问游标

2024-04-25

我可以动态访问游标的列吗?我的意思是名字?像这样的东西:

declare
 v_cursor := select * from emp;
begin
 FOR reg IN v_cursor LOOP
   dbms_output.put_line(**reg['column_name_as_string']**);
 end loop;
end;

我知道粗体部分is notPL/SQL,但我正在寻找类似的东西,但在任何地方都找不到它。


您可以使用该包DBMS_SQL https://docs.oracle.com/database/121/ARPLS/d_sql.htm#ARPLS68257使用动态查询创建和访问游标。

然而,通过名称访问列并不是很简单,因为DBMS_SQL包使用定位,在动态查询中我们可能在执行之前不知道列的顺序。

此外,在这个问题的上下文中,我们似乎可能不知道在编译时要显示哪一列,我们将假设我们要显示的列作为参数给出。

我们可以用DBMS_SQL.describe_columns https://docs.oracle.com/database/121/ARPLS/d_sql.htm#ARPLS68257分析 a 的列SELECT解析后查询以构建列的动态映射。我们假设所有列都可以转换为VARCHAR2因为我们想用以下方式显示它们DBMS_OUTPUT.

这是一个例子:

SQL> CREATE OR REPLACE PROCEDURE display_query_column(p_query VARCHAR2,
  2                                                   p_column VARCHAR2) IS
  3     l_cursor            INTEGER;
  4     l_dummy             NUMBER;
  5     l_description_table dbms_sql.desc_tab3;
  6     TYPE column_map_type IS TABLE OF NUMBER INDEX BY VARCHAR2(32767);
  7     l_mapping_table column_map_type;
  8     l_column_value  VARCHAR2(4000);
  9  BEGIN
 10     l_cursor := dbms_sql.open_cursor;
 11     dbms_sql.parse(l_cursor, p_query, dbms_sql.native);
 12     -- we build the column mapping
 13     dbms_sql.describe_columns3(l_cursor, l_dummy, l_description_table);
 14     FOR i IN 1 .. l_description_table.count LOOP
 15        l_mapping_table(l_description_table(i).col_name) := i;
 16        dbms_sql.define_column(l_cursor, i, l_column_value, 4000);
 17     END LOOP;
 18     -- main execution loop
 19     l_dummy := dbms_sql.execute(l_cursor);
 20     LOOP
 21        EXIT WHEN dbms_sql.fetch_rows(l_cursor) <= 0;
 22        dbms_sql.column_value(l_cursor, l_mapping_table(p_column), l_column_value);
 23        dbms_output.put_line(l_column_value);
 24     END LOOP;
 25     dbms_sql.close_cursor(l_cursor);
 26  END;
 27  /

Procedure created

我们可以使用仅在运行时已知的查询来调用此过程:

SQL> set serveroutput on
SQL> exec display_query_column('SELECT * FROM scott.emp WHERE rownum < 5', 'ENAME');
SMITH
ALLEN
WARD
JONES

PL/SQL procedure successfully completed

SQL> exec display_query_column('SELECT * FROM scott.emp WHERE rownum < 5', 'EMPNO');
7369
7499
7521
7566

PL/SQL procedure successfully completed

谨慎使用动态 SQL:它与用户具有相同的权限,因此可以执行任何 DMLand DDL语句允许此模式。

例如,上述过程可用于创建或删除表:

SQL> exec display_query_column('CREATE TABLE foo(id number)', '');
begin display_query_column('CREATE TABLE foo(id number)', ''); end;
ORA-01003: aucune instruction analysée
ORA-06512: à "SYS.DBMS_SQL", ligne 1998
ORA-06512: à "APPS.DISPLAY_QUERY_COLUMN", ligne 13
ORA-06512: à ligne 1

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

通过列名动态访问游标 的相关文章

  • Oracle:SQL查询查找属于表的所有触发器?

    我怎样才能找到属于一个表的所有触发器 以下内容将独立于您的数据库权限而工作 select from all triggers where table name YOUR TABLE 以下备用选项可能有效也可能无效 具体取决于您分配的数据库权
  • oracle中的数字格式

    Hai 我的数字格式有问题 我正在使用 oracle 我在数据库中有一个数字字段 但是当我检索它时 我需要将其视为浮点数 例如 在检索时 现在我得到的结果为 200 DR 借方的 DR 手动给出 现在我需要得到 200 00 DR 的结果
  • Oracle 连接池类

    我想在 Helper 类中为 Oracle DB 设置连接池 public class DbConnection Data source for the pooled connection private static OracleData
  • 如何找到与日期范围最重叠的时间段

    假设您有一个包含标识符 开始时间和结束时间的表 这些开始和结束时间可以是任意时间长度 开始时间始终早于结束时间 假设没有空值 什么样的查询会告诉我最 流行 的时间 即每行中的两个范围与大多数其他行重叠的位置 它的实际应用是它是一个记录用户登
  • Java - oracle.jdbc.dcn.DatabaseChangeEvent - 获取更改的行

    我正在使用 oracle jdbc dcn DatabaseChangeEvent 来从 Oracle DB 获取事件通知 public class TListener implements DatabaseChangeListener p
  • Oracle 10 中的本地临时表(适用于存储过程的范围)

    我是甲骨文新手 我需要在存储过程中处理大量数据 我正在考虑使用临时表 我正在使用连接池 并且该应用程序是多线程的 有没有一种方法可以为每次调用存储过程创建不同的表实例来创建临时表 以便来自多个存储过程调用的数据不会混淆 你说你是 Oracl
  • Oracle 求两个时间戳的平均值

    我不明白这有多难 但我似乎无法在任何地方找到解决方案 它是针对日期完成的 但我看不到让它适用于时间戳 我正在尝试做 select avg last timestmp ref timestmp as average from param 它一
  • 物化视图提交时快速刷新

    我刚刚创建了表 DEPT 和 EMP 如下所示 create table DEPT dept no number dept name varchar 32 dept desc varchar 32 CONSTRAINT dept pk Pr
  • BI Publisher 和 Excel 模板预览错误

    我正在使用 Excel 2013 并添加了 BI 发布器 我加载示例数据 并进行预览 我得到以下内容 请指教 谢谢詹姆斯 启动 Excel 预览 仅开放 false mTemplate C Users AJCENTROID AppData
  • 超时后如何重新建立 JDBC 连接?

    我有一个长时间运行的方法 它通过 EntityManager TopLink Essentials 执行大量本机 SQL 查询 每个查询只需要几毫秒即可运行 但查询数量却有数千个 这发生在单个 EJB 事务内 15 分钟后 数据库关闭连接
  • Oracle BLOB 与 VARCHAR

    我需要在表的一列中存储一个 大 SQL 查询 我想使用BLOB场地 需要明确的是 我想存储查询 而不是其结果 最好使用什么 BLOB or a VARCHAR 或者也许还有别的什么 另一种选择是 CLOB 对于文本数据 使用 CLOB 比使
  • 如何使用过程填充数据库

    我有大约 15 个不同的表 其中填充了不同的数据和不同的实体关系 我需要创建一个脚本 用这些表的内容填充我的数据库 脚本完成后 我使用 sqlplus 在 cmd 中运行它 然后使用 START文件路径 我有两个不同的 sql 文件 一个名
  • 包括 Oracle 中的等效项

    在 SQL Server 中你可以这样写 create index indx on T1 A B INCLUDE C D E 有没有办法在 Oracle 中做同样的事情 Refs http msdn microsoft com en us
  • MySQL 相当于 ORACLES 的rank()

    Oracle 有 2 个函数 rank 和dense rank 我发现它们对于某些应用程序非常有用 我现在正在 mysql 中做一些事情 想知道他们是否有与这些相同的东西 没有什么直接等效的 但你可以用一些 不是非常有效的 自连接来伪造它
  • 如何将大型 XML 字符串插入 Oracle 表中?

    我想将一个大的 XML 字符串插入到我的表中 我的表是 test id xml column XMLType 当我插入值时 它返回 字符串文字太长 错误 我上网查了一下 大家都说把数据类型改成CLOB 但我想存储相同的数据类型 XMLTyp
  • Oracle ODP.Net 与实体框架 6 - 从表视图中选择时出现 ORA-00955

    我创建了两个应用程序 第一个使用 ODP Net 另一个没有实体 效果很好 static void Main string args OracleConnection con new OracleConnection using conne
  • 如何关闭 Oracle 密码过期功能?

    我正在使用 Oracle 进行开发 我经常用于重建数据库的引导帐户的密码已过期 如何永久关闭该用户 以及所有其他用户 的密码过期功能 我使用的是 Oracle 11g 默认情况下密码会过期 要更改 Oracle 中某个用户配置文件的密码过期
  • Oracle PL/SQL - NO_DATA_FOUND 异常是否对存储过程性能不利?

    我正在编写一个需要进行大量调节的存储过程 根据 C NET 编码中的常识 异常会损害性能 因此我也始终避免在 PL SQL 中使用它们 我在此存储过程中的调节主要围绕记录是否存在 我可以通过以下两种方式之一进行 SELECT COUNT I
  • 在 JDBC PL/SQL 块中多次使用命名参数时出错

    当使用命名参数调用 PL SQL 块时出现错误 当所有命名参数仅使用一次时 我的代码工作正常 但是当我复制标有 SQL 的 SQL 时 然后所有命名参数 以冒号开头 q 都使用了两次 现在我得到一个 SQL 异常 它说 参数名称的数量与注册
  • PL/SQL select into - 如果数据存在

    仅当存在数据时 我才需要选择局部变量 SELECT column1 INTO local variable FROM table1 where column2

随机推荐

  • 使用 Spring Data JPA 选择一列

    有谁知道如何使用 Spring Data JPA 获取单个列 我在 Spring Boot 项目中创建了一个如下所示的存储库 但总是得到 cause null message PersistentEntity must not be nul
  • 我可以在没有循环的情况下清理 numpy 数组吗?

    也许没什么大不了的 但遵循以下内容让我心碎 deltas data 1 data 1 有了这个 for i in range len deltas if deltas i lt 0 deltas i 0 if deltas i gt 100
  • 我的自定义 SSL 验证逻辑处理异常 RemoteCertificateNameMismatch 的安全性如何?

    我尝试将文件上传到我的域https vault veodin com https vault veodin com 托管在 webfaction com 当您打开此网址时 浏览器会警告您名称不匹配 因为 SSL 证书是为 webfactio
  • Ruby:使用 class_eval 定义常量只能通过 const_get 找到,但不能直接通过 :: Lookup 找到

    给定一个 User 类 class User end 我想使用定义一个新常量 class eval So User class eval AVOCADO fruit 如果我尝试通过访问它User AVOCADO I get uninitia
  • 分别处理spark中的多个目录

    我在 HDFS 中有一个目录列表 每个目录包含多个文件 我的目标是将一个目录中的所有文件合并为一个文件 但每个目录分别合并 在 Spark 中执行此操作最快的方法是什么 顺序迭代所有目录太慢 所以我想并行进行 一种解决方案可能是使用线程池
  • Java 8 流过滤:IN 子句

    List
  • 自动滚动图库小部件

    我需要实现一个画廊 它一次滚动一个项目 并且可以执行 自动滚动 即每隔几秒钟 它会自动滚动到下一个项目 根据这个线程 Android 以编程方式在图库小部件中的图像之间设置动画 https stackoverflow com questio
  • Zend Framework 路由:.html 扩展名

    我知道我以前见过这样做 但我在任何地方都找不到信息 我需要能够在 Zend Framework 中使用 html 扩展名进行路由 IE controller action html 应路由到适当的控制器 操作 我们有一个想法 用 htacc
  • 形成两个列表并集的最简单方法

    将两个列表 例如 A 和 B 的元素相互比较 并且仅当 A 中不存在时才将 B 中存在的元素添加到 A 中 最简单的方法是什么 为了显示 取列表 A 1 2 3 列表 B 3 4 5 所以在 AUB 手术之后我想要 列表 A 1 2 3 4
  • 使用装箱值类型作为锁定语句的锁是否安全?

    的文档lock https learn microsoft com en us dotnet csharp language reference keywords lock statement声明非常简单 lock x Your code
  • Spring集成MQTT发布订阅多个主题

    我正在尝试构建一个订阅多个 mqtt 主题的应用程序 获取信息 处理它并形成 xml 并在处理时触发一个事件 以便这些可以发送到某个云服务器 并将成功的响应从那里发送回MQTT 通道
  • Safari 中的 CSS 动画延迟错误

    我最近在 Safari 中遇到了一些与 CSS 动画有关的奇怪行为 并且在操作 DOM 时无法更新元素位置 我拍了一些 GIF 来说明这一点 在 Chrome 中 http recordit co cCim1IwyMc http recor
  • 折叠时,条子标题从中心向左颤动

    我的目标是遵循我的设计 受到三星天气的启发 但是当您刚开始学习时 实现代码很困难 展开时标题应居中 折叠时标题应保留在左上角 到目前为止 这是我的代码和我当前的进度 棘手的部分是将标题移到中心 Scaffold backgroundColo
  • 如何为角度 2/4 中的动画状态指定类名称?

    我正在使用 4 1 3 版本的角度动画 下面是代码 Component selector my fader animations trigger visibilityChanged state true style opacity 1 tr
  • :expire_after 时间结束后,Rails 会话会发生什么?

    会话会变为零吗 更改仅在下一次请求时生效吗 我想我现在只问了三个问题 您可以尝试使用类似的设置进行探索 AppName Application config session store cookie store key session ke
  • register_shutdown_function() 仍然输出原始错误消息

    我正在尝试用自定义函数替换内置的 php shutdown function 它工作得很好 但是 它仍然在我的新错误消息上方输出原始错误 内置错误
  • ASP.NET 中的基本页面

    您是否建议在 Visual Studio 中创建的每个网站中创建一个基本页面作为父类 确切的优点 缺点是什么 如果您想重写 ASP NET 中某些内容的工作方式 将其构建到基类中比在每个页面中包含代码会更有效 我这样做的两个具体实例是 是否
  • Azure Functions 数据库连接字符串

    如何添加或访问app configAzure 函数中的文件添加数据库连接字符串 如果你不应该添加app config并且有更好的方法来访问外部数据库来执行该功能 请让我知道最佳实践 谢谢 Jan V almost钉住了它 这促使我在loca
  • Retrofit 是否在主线程上进行网络调用?

    我正在尝试在 Android 上探索 Retrofit OkHttp 这是我在网上找到的一些代码 RestAdapter restAdapter new RestAdapter Builder setExecutors executor e
  • 通过列名动态访问游标

    我可以动态访问游标的列吗 我的意思是名字 像这样的东西 declare v cursor select from emp begin FOR reg IN v cursor LOOP dbms output put line reg col