【问题标题】:Is it possible to traverse rowtype fields in Oracle?是否可以遍历 Oracle 中的行类型字段?
【发布时间】:2011-05-27 06:15:08
【问题描述】:

假设我有这样的事情:

somerecord SOMETABLE%ROWTYPE;

是否可以在不知道字段名称的情况下访问 somerecord 的字段? 像 somerecord[i] 这样的字段顺序将与表中的列顺序相同?

我看过一些使用动态 sql 的示例,但我想知道是否有更简洁的方法来执行此操作。

我想要做的是为我的表中的特定行生成/获取 DML(插入查询),但我无法找到任何关于此的内容。

如果有另一种方法,我很乐意使用,但也很想知道如何做这个问题的前一部分——它更通用。

谢谢

【问题讨论】:

  • 只是好奇,为什么不将数据转储到平面文件,然后使用 sqlldr(或数据泵)加载?可能比运行大量插入语句脚本更好。

标签: oracle plsql


【解决方案1】:

这并不能完全回答您提出的问题,但可能会得到您想要的结果...

您可以查询 USER_TAB_COLUMNS 视图(或其他类似的 *_TAB_COLUMN 视图)以获取表(或视图)中列的列名 (COLUMN_NAME)、位置 (COLUMN_ID) 和数据类型 (DATA_TYPE) 等信息) 来生成 DML。

您仍然需要使用动态 SQL 来执行生成的 DML(或至少单独生成静态 SQL)。

但是,这种方法不适用于识别任意查询中的列(除非您创建它的视图)。如果需要,您可能需要使用 DBMS_SQL(或其他工具)。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    据我所知,没有干净的方法可以通过索引引用记录字段。

    但是,如果您对同一个表有很多不同类型的更新,每个更新都有自己的列设置更新,您可能希望避免使用动态 sql 并着眼于用值静态填充记录的方向,然后发出update someTable set row = someTableRecord where someTable.id = someTableRecord.id;

    这种方法有其自身的缺点,例如,对每个甚至未更改的列进行更新,从而创建额外的重做日志数据,但我认为应该考虑它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-22
      • 2012-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      相关资源
      最近更新 更多