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

发布于 2024-07-26 00:26:37 字数 275 浏览 10 评论 0原文

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

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

I have a stored proc in oracle 11g server that has an out variable of record. I cannot edit this procedure. I am creating a function that will call the procedure and return the information in the record set. I looked at the following question asked here: past question

My Question is can I create a type of table for a record and query it directly in SQL? Or do I need to convert the record to type object and create a table type for it to query directly?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

流星番茄 2024-08-02 00:26:37

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

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

RECORD is a PL/SQL concept. So we cannot create a TABLE TYPE based on a RECORD and use that TYPE in a SQL statement. SQL only recognises TYPEs which are created in SQL.

So, if I understood your scenario correctly, you need to create an object and/or a nested table in SQL. Then your function can call the procedure and translate the RECORD to the nested table. The nested table can then be returned or pipelined.

痴骨ら 2024-08-02 00:26:37

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

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

SQL> VAR cr_dual REFCURSOR

SQL> BEGIN
  2          OPEN    :cr_dual FOR
  3          SELECT  1
  4          FROM    dual
  5          UNION ALL
  6          SELECT  2
  7          FROM    dual;
  8  END;
  9  /

Процедура PL/SQL успешно завершена.

SQL> PRINT cr_dual

         1
----------
         1
         2

The question your link points to is tagged Oracle, so I'm assuming that's what you're using.

The easiest way is probably returning a CURSOR:

SQL> VAR cr_dual REFCURSOR

SQL> BEGIN
  2          OPEN    :cr_dual FOR
  3          SELECT  1
  4          FROM    dual
  5          UNION ALL
  6          SELECT  2
  7          FROM    dual;
  8  END;
  9  /

Процедура PL/SQL успешно завершена.

SQL> PRINT cr_dual

         1
----------
         1
         2
苏佲洛 2024-08-02 00:26:37

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

What ended up doing for this problem was to create a view based on the stored procedure logic and query directly from it.

狼性发作 2024-08-02 00:26:37

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

例如:

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;

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

if you are receiving only one record and you know the record definition, you should be able to the field of the record directly by name.

for example:

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

when you have a record of myrecord type, you can reference itemA in a manner like this:

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

note that you may be able to get around this in your calling code be simply handling the record type that the original procedure returns.

夢归不見 2024-08-02 00:26:37

你可以尝试一下vararray。

首先 -

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.

现在你需要从你调用的地方正确配置输出变量。你可以像你一样从表(VARIABLE_NAME)中选择。

You can try varray.

First -

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

And create your varray as

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

Now you can return work with varr_addr. An example:

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.

Now you need have the out variable configured correctly from where you call.And you can select from table(VARIABLE_NAME) as you would do.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文