从记录集合类型中选择数据

Posted

技术标签:

【中文标题】从记录集合类型中选择数据【英文标题】:Select data from a record collection type 【发布时间】:2009-06-30 17:46:47 【问题描述】:

我在 oracle 11g 服务器中有一个存储过程,它有一个记录的输出变量。我无法编辑此程序。我正在创建一个函数,它将调用该过程并返回记录集中的信息。我查看了这里提出的以下问题:past question

我的问题是我可以为记录创建一种表并直接在 SQL 中查询吗?还是我需要将记录转换为类型对象并创建一个表类型供其直接查询?

【问题讨论】:

您使用的是什么 RDMS?您可以在存储过程中执行的操作因平台而异。 【参考方案1】:

RECORD 是一个 PL/SQL 概念。因此,我们不能基于 RECORD 创建 TABLE TYPE 并在 SQL 语句中使用该 TYPE。 SQL 只识别在 SQL 中创建的 TYPE。

所以,如果我正确理解了您的场景,您需要在 SQL 中创建一个对象和/或嵌套表。然后您的函数可以调用该过程并将 RECORD 转换为嵌套表。然后可以返回或流水线化嵌套表。

【讨论】:

【参考方案2】:

您的链接指向的问题被标记为Oracle,所以我假设这就是您正在使用的。

最简单的方法可能是返回一个CURSOR

SQL> VAR cr_dual REFCURSOR SQL> 开始 2 打开:cr_dual FOR 3 选择 1 4 来自双 5 联合所有 6 选择 2 7 从双; 8 结束; 9 / Процедура PL/SQL успешно завершена。 SQL> 打印 cr_dual 1 ---------- 1 2

【讨论】:

【参考方案3】:

最终解决这个问题的方法是根据存储过程逻辑创建一个视图并直接从中查询。

【讨论】:

【参考方案4】:

如果您只收到一条记录并且您知道记录定义,您应该可以直接按名称访问记录的字段。

例如:

TYPE myrecord IS RECORD (
       itemA NUMBER,
       itemB myTable.columnName%TYPE
  );

当你有一个 myrecord 类型的记录时,你可以像这样引用 itemA:

CREATE OR REPLACE FUNCTION myFunction(theRecord IN myrecord%TYPE) RETURN NUMBER
IS
BEGIN    
   RETURN recordInstance.itemA;
END myFunction;

请注意,您可以在调用代码中解决此问题,只需处理原始过程返回的记录类型即可。

【讨论】:

如果我只需要记录的一部分,那会很好用,但我需要记录的多个部分。该过程返回一个邮寄地址的记录,因此它包含几个变量。城市、邮编、街道号码、街道名称、街道后缀。还有其他几个。我希望将记录转换为表,这样我就可以在 sql 语句中从中进行选择,而不是更改 40 个使用寻址的应用程序背后的代码。 @Slowbie,我明白了。您希望返回多少个字段,或者您需要地址的连接 varchar?我想看看你想要什么作为函数的返回值会很好。【参考方案5】:

你可以试试 varray。

第一 -

create or replace type addr_type
as object
(name   varchar2(20)
,city   varchar2(20)
)

并将您的可变数组创建为

create or replace type varr_addr as varray(10) of addr_type
/

现在您可以使用 varr_addr 返回工作。一个例子:

SQL> create or replace procedure ret_user_addr (p_out out varr_addr)
  2  is
  3  begin
  4    p_out := varr_addr(addr_type('NAME1','CITY1'),addr_type('NAME2','CITY2'));
  5  end;
  6  /

Procedure created.

SQL> sho err
No errors.

现在您需要从调用的位置正确配置 out 变量。您可以像往常一样从 table(VARIABLE_NAME) 中选择。

【讨论】:

以上是关于从记录集合类型中选择数据的主要内容,如果未能解决你的问题,请参考以下文章

EventBus手写实现事件通信框架 ( 订阅类-订阅方法缓存集合 | 事件类型-订阅者集合 | 订阅对象-事件类型集合 )

c++ 在运行时从集合中选择类型

好好学python·集合

好好学python·集合

面试3——java集合类总结

基于JavaSE阶段下的集合类汇总