我想编写一个函数来返回可以在我的应用程序网格中显示的表记录。我的应用程序将忘记表格的结构。当有人向表中添加列或删除它们时,我希望它仍然有效。
在我的应用程序中,它看起来应该是这样的:
myQuery = "select * from table(myfunction)";
...
因此,该功能应类似于:
CREATE OR REPLACE FUNCTION myfunction RETURN TABLE OF mytable%ROWTYPE AS ...
但是RETURN TABLE OF mytable%ROWTYPE
是不允许的。必须创建一种 SQL 类型。
但是CREATE TYPE table_of_mytable_rows IS TABLE OF mytable%ROWTYPE
也不允许。
那么,有没有办法实现我想要的呢?
作为替代方案,我想到了使用 ID。这将使我的应用程序的代码看起来像这样:
myQuery = "select * from mytable where rowid in (select * from table(myfunction))";
...
然后函数将是
CREATE OR REPLACE FUNCTION myfunction RETURN TABLE OF UROWID AS ...
但同样,RETURN TABLE OF UROWID
是不允许的。也不是用CREATE TYPE table_of_rowids IS TABLE OF UROWID
.
我知道我可以创建一个类似于表的主键列的对象类型,然后在这个对象上创建一个表类型。然后我的应用程序必须知道表的主键才能
myQuery = "select * from mytable where (key1, key2) in (select key1, key2 from table(myfunction))";
...
我更希望我的函数返回表行或 rowid。这可能吗?
我目前仍在使用 Oracle 11.2,但我也对较新版本的解决方案感兴趣。