Oracle pl/sql 游标 - "combining records" 或等效项
Oracle pl/sql cursor - "combining records" or an equivalent
我有 PHP class A 和 class B。它们独立存在,并且对于每个我都有等效的 Oracle PL/SQL 定义,即
type cursorA is ref cursor return recordA;
type cursorB is ref cursor return recordB;
允许 return 多个数据行以在单个数据库调用中创建多个 A 或 B PHP 对象。到目前为止一切顺利...
在某些情况下,我需要单个查询 return在单个 A+B 游标中组合记录 A 和记录 B 字段。
我可以通过创建一个新的单个 recordC 组合 recordsA 和 recordsB 的所有字段,然后执行 cursorC 来实现 return 逻辑 "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 中实现一些等价物,允许 re-use/combining 的 recordA 和 recordB 定义而不是要求 recordC 中的 recordA 和 recordB 字段重复。
需要说明的是,这不是 "Union data from cursors into one" 的副本。这是构建 1 个游标的单个查询,其 return 列是 recordC。 "splitting" 将查询分成 2 个单独的查询会对性能产生重大负面影响,这不是我要找的功能。
没有。 PL/SQL 不支持(记录或游标)类型(reflection)的 runtime/compilation 时间操作,但数据类型非常静态(和准系统)。在某些地区PL/SQL有点老套和冗长的语言。
最 PL/SQlish 合并记录的方法很简单:
type recordC is record(
a recordA
,b recordB
);
但是 PL/SQL 的主要功能是 SQL 部分,所以如果您可以调整 select
语句,您可以考虑以下选项,其中两者的数据A
和 B
(分别为 foo
和 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的评论中收集到的其他可能选项:
- Union data from cursors into one
- 问汤姆:Can Ref Cursors be concatenated?
- 问汤姆:Pipelined functions
我有 PHP class A 和 class B。它们独立存在,并且对于每个我都有等效的 Oracle PL/SQL 定义,即
type cursorA is ref cursor return recordA;
type cursorB is ref cursor return recordB;
允许 return 多个数据行以在单个数据库调用中创建多个 A 或 B PHP 对象。到目前为止一切顺利...
在某些情况下,我需要单个查询 return在单个 A+B 游标中组合记录 A 和记录 B 字段。
我可以通过创建一个新的单个 recordC 组合 recordsA 和 recordsB 的所有字段,然后执行 cursorC 来实现 return 逻辑 "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 中实现一些等价物,允许 re-use/combining 的 recordA 和 recordB 定义而不是要求 recordC 中的 recordA 和 recordB 字段重复。
需要说明的是,这不是 "Union data from cursors into one" 的副本。这是构建 1 个游标的单个查询,其 return 列是 recordC。 "splitting" 将查询分成 2 个单独的查询会对性能产生重大负面影响,这不是我要找的功能。
没有。 PL/SQL 不支持(记录或游标)类型(reflection)的 runtime/compilation 时间操作,但数据类型非常静态(和准系统)。在某些地区PL/SQL有点老套和冗长的语言。
最 PL/SQlish 合并记录的方法很简单:
type recordC is record(
a recordA
,b recordB
);
但是 PL/SQL 的主要功能是 SQL 部分,所以如果您可以调整 select
语句,您可以考虑以下选项,其中两者的数据A
和 B
(分别为 foo
和 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的评论中收集到的其他可能选项:
- Union data from cursors into one
- 问汤姆:Can Ref Cursors be concatenated?
- 问汤姆:Pipelined functions