Oracle 我们什么时候说“让我们使用%ROWTYPE”而不是%TYPE?

Oracle 我们什么时候说“让我们使用%ROWTYPE”而不是%TYPE?,oracle,plsql,Oracle,Plsql,如果我有一个大约有15列的表myTable,并且我只想选择大约5列,那么是否值得拥有一个rec myTable%ROWTYPE,10列将根本不使用,或者只是创建一个类型rec。。。并手动创建类似col1 myTable.col1%类型的字段。。。对于所有5列 我们通常在多大程度上创建手动类型与行类型 如何为带有联接的SELECT查询声明行类型?例如,rec tableA%ROWTYPE+可能是另一个字段,或者是tableB中的2个字段,但都在1记录类型中?我是否手动创建它?如果只有PLSQL具有

如果我有一个大约有15列的表myTable,并且我只想选择大约5列,那么是否值得拥有一个rec myTable%ROWTYPE,10列将根本不使用,或者只是创建一个类型rec。。。并手动创建类似col1 myTable.col1%类型的字段。。。对于所有5列

我们通常在多大程度上创建手动类型与行类型

如何为带有联接的SELECT查询声明行类型?例如,rec tableA%ROWTYPE+可能是另一个字段,或者是tableB中的2个字段,但都在1记录类型中?我是否手动创建它?如果只有PLSQL具有类似于扩展或记录继承的功能

很抱歉问了这么长的问题,我希望我说得有道理。
提前感谢。

最好从以下文档开始:

Oracle数据库PL/SQL用户指南和参考

而不是用Steven Feuerstein的一篇文章来改进它:


我的首选是始终使用%ROWTYPE,或者更好的是使用游标FOR循环来声明变量。回到tm时代,我们曾经非常担心内存的使用,因此声明单个字段可能有意义,如果它能为我们节省一些字节的话。但是现在,依我看,当我们有以GB为单位的内存空间时,更大的代码复杂性超过了节省几个字节的价值。就执行速度而言-哦,拜托。我们所处的世界中,一些最常见的语言在虚拟机下运行。我花了好几个小时手工优化汇编程序,把最后一个奇怪的循环从紧循环中拧出来。Java让我发笑。如果我们在虚拟机下运行软件,我们要说的是,我们有太多的周期要消耗

为解决每个问题:

我更喜欢使用游标来循环几乎所有的东西。这是不断尝试回答坎宁安问题的一部分——可能可行的最简单的事情是什么?。IMO使用rowtype变量是最简单的事情。使用它们就不需要显式地处理未找到的数据和太多的行异常,所以我倾向于

FOR aRow IN (SELECT col1, col2, col3
               FROM myTable
               WHERE some_col = some_value)
LOOP
  NULL;  -- do something useful here
END LOOP;
结束

即使我知道有些东西是独一无二的——主要是因为在我工作的地方,今天独一无二的东西可以在明天变成非独一无二的,这是因为我甚至不知道某个团队中某个开发人员的突发奇想。这叫做防御性编程,如果它能让我不在凌晨2点被叫,我就是一个快乐的露营者

有人会抱怨,这样做需要在并非绝对必要的情况下打开光标的开销。在整整几年的编程中,我从未遇到过这样一种情况,即这样做会使程序速度减慢到必须重写代码才能使用独立的单例选择。我想,在数字丛林的黑暗深处,在野外的某个地方,时钟速度仍然以一位数兆赫为单位,内存以千字节为单位,这些字节只有7位,贪婪的号角兽Traal在等待联合国,这可能不适用——但在我所在的地方,相信我,这不是最前沿的,这是一个足够好的策略

我很少创建独立变量来保存选择或游标的结果,这主要是因为上面的规则1

要正确引用Obi-Wan,请使用循环的光标Luke!。说真的,他是这么说的。所有的原力都是一些重听电影导演虚构出来的垃圾。呸!。写一些像

FOR aRow IN (SELECT *
               FROM table1 t1
               INNER JOIN table2 t2 on (t2.fieldx = t1.fieldx)
               INNER JOIN table3 t3 on (t3.fieldy = t2.fieldy))
LOOP
  NULL;  -- whatever
END LOOP;
再一次,这是可能起作用的最简单的事情。越简单越好

:-


分享和享受。

哇,谢谢你,先生!这确实很有道理。但是我恐怕我们需要将每个SELECT查询包装在一个函数中,这个函数由一个主过程调用。由于这种性质,我不确定如何应用上述解决方案,因为我需要定义函数可以返回且过程知道的类型。
FOR aRow IN (SELECT *
               FROM table1 t1
               INNER JOIN table2 t2 on (t2.fieldx = t1.fieldx)
               INNER JOIN table3 t3 on (t3.fieldy = t2.fieldy))
LOOP
  NULL;  -- whatever
END LOOP;