【问题标题】:Oracle pl/sql cursor - "combining records" or an equivalentOracle pl/sql 游标 - “组合记录”或等效项
【发布时间】: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


【解决方案1】:

没有。 PL/SQL 不支持(记录或游标)类型(reflection)的运行时/编译时操作,但数据类型是非常静态的(和准系统)。在某些领域,PL/SQL 是一种有点过时和冗长的语言。

最 PL/SQlish 组合记录的方法很简单:

type recordC is record(
  a recordA
 ,b recordB
);

但是 PL/SQL 的主要功能是 SQL 部分,因此如果您可以调整 select 语句,您可以考虑以下选项,其中 AB 的数据(@987654329 @ 和 bar) 被合并。这当然假设它们之间存在合理的关系(在此示例中为 foo.id = bar.id):

create table foo (id number, str varchar2(10));
create table bar (id number, num number);

insert all
into foo(id, str) values(1, 'foo one')
into foo(id, str) values(2, 'foo two')
into bar(id, num) values(1, 100)
into bar(id, num) values(2, 200)
select 1 from dual;

select foo.id, foo.str as foo_str, bar.num as bar_num
from foo
inner join bar on bar.id = foo.id
;

如果您愿意,这就是您的选择。

从 Typo 的评论中收集的其他可能选项:

【讨论】:

  • 谢谢 - 你能不能让光标在上面返回你的 recordC,而我做不到。代码“type cursorC is refcursor return recordC;”编译但执行失败。如果您能够让它运行,请在此处粘贴代码示例!谢谢!
猜你喜欢
  • 2015-07-01
  • 2011-01-18
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
  • 2012-02-07
  • 1970-01-01
  • 2023-04-01
  • 2019-12-25
相关资源
最近更新 更多