【发布时间】:2015-07-24 20:27:24
【问题描述】:
我有 PHP A 类和 B 类。它们是独立存在的,对于每个我都有等效的 Oracle PL/SQL 定义,即。
type cursorA is ref cursor return recordA;
type cursorB is ref cursor return recordB;
允许返回多个数据行以在单个数据库调用中创建多个 A 或 B PHP 对象。到目前为止一切顺利...
在某些情况下,我需要在单个 A+B 游标中返回组合记录 A 和记录 B 字段的单个查询。
我可以通过创建一个新的单个 recordC 来实现这一点,它结合了 recordsA 和 recordsB 中的所有字段,然后执行 cursorC 以返回逻辑“A+B”信息,但是这实际上复制了 A 和 B 记录定义,我更愿意通过执行以下操作来避免这种情况:
type recordC is record (recordA plus recordB);
type cursorC is refcursor return recordC;
或
type cursorC is ref cursor return recordA plus recordB;
上述语句似乎不起作用,但我感兴趣的是是否有可能在 PL/SQL 中实现一些等效项,从而允许重新使用/组合 recordA 和 recordB 定义,而不是要求 recordA 和 recordB recordC 中的字段重复。
需要明确的是,这不是“将游标中的数据合并为一个”的副本。这是一个构建 1 个游标的单个查询,其返回列是 recordC。将查询“拆分”为 2 个单独的查询会对性能产生显着的负面影响,这不是我想要的功能。
【问题讨论】:
-
我相信这取决于您如何将 pl/sql 字段映射到 php 类属性。
-
嗨@sebas - 谢谢,PHP 组件可能有点误导,因为这个问题都是关于 Oracle 的;具体来说,Oracle 能够将“大于 1”的记录定义组合成一个“超级记录”定义,从而允许记录定义重复使用。 (请注意,这与 Oracle“嵌套记录”不同,因为我不想要字段的父子关系,只是组合字段的平面列表)......我不得不说,从我读过的这似乎不可能,但我希望有人可能对我缺少一些见解。
-
为什么不创建一个包含两个表中所有字段类型的单一记录类型,并在第三个游标中使用它,定义为包含所需所有字段的显式选择?你的意思是通过自动“添加”两个游标的结果来动态地做到这一点?
-
@sebas - 感谢您的建议。这是一种可能性,但也是一种我并不真正偏爱的可能性,因为它没有提供我想要的 A 和 B 级别的封装。仅作为背景,我合并到 C 的原因是性能和简单性。 IE。因此数据可以在单个 SQL 查询和单个游标中从 DB 中返回,然后拆分为 Web 环境中的各种 PHP 客户端类。这种方法甚至可能需要在一次调用中为超过 2 个类(都具有 1:1 关系)提供数据。
标签: oracle plsql cursor record oracle11gr2