无法访问 plsql 函数返回的对象类型

Posted

技术标签:

【中文标题】无法访问 plsql 函数返回的对象类型【英文标题】:Not able to access the object type returned by a plsql function 【发布时间】:2021-09-23 14:54:27 【问题描述】:

我创建了一个对象类型为:

Create or replace type t1 as object
 (
  Account_id varchar2(20),
  Account_date date);

并在包体 p1 中编写了一个返回此对象的函数:

Function account_details(ac_id in account_table.account_id%type)
return t1 is

v_t1 t1;

Begin
 Select t1(account_id,
           Account_date)
        Into v_t1
        From account_table
        Where account_id=ac_id;
Return v_t1;

End account_details;

包编译成功,但是当我尝试执行函数并获取它返回的值时:

Select p1.account_details(1234) from dual;

我得到的输出为:

[P1.t1]

如何获取该对象返回的值。该对象将始终只有从函数返回的一条记录。

我能在这里得到一些帮助吗?

【问题讨论】:

User-defined types documentation 如何从返回的对象中获取单个值? @Neha,我意识到您在提问但不接受任何答案。在 SO 中表示感谢的最佳方式是在显然是正确的答案时接受答案。谢谢 @Roberto 很抱歉我错过了回复。谢谢,效果很好! 【参考方案1】:

您正在取回值,只是 SQL Developer 以这种方式显示对象。您可以像这样获取属性值:

Select account_details(1234).account_id
     , account_details(1234).account_date 
 from dual;

【讨论】:

很抱歉我没有看到回复。非常感谢,效果很好!【参考方案2】:

不同的工具会有不同的显示复杂类型的方式,例如在 SQL*Plus 中:

SQL> select account_details(1) acc from dual;

ACC(ACCOUNT_ID, ACCOUNT_DATE)
-----------------------------
T1('1', '23-SEP-21')

1 row selected.

为避免依赖默认值,您需要明确指定对象属性。

您可以通过在内联视图中调用每个属性来避免重新执行该函数:

select t.acc.account_id
     , t.acc.account_date
from   ( select account_details(1) acc from dual ) t

【讨论】:

以上是关于无法访问 plsql 函数返回的对象类型的主要内容,如果未能解决你的问题,请参考以下文章

无法使用cimg访问图像中的像素强度(返回0)

无法访问从 instagram hashtag search api 返回的媒体对象

无法访问返回的结构中的指针值 [C]

使用具有不同层的 LINQ 意味着我无法访问特定类型

无法访问从 OpenCV 函数返回的 Mat 值

Firestore 交叉引用返回一个承诺对象,无法访问文档值