我想编写一个函数,该函数返回可以在应用程序网格中显示的表记录。我的应用程序将忽略表的结构。我希望当有人向表中添加或删除列时,它仍能正常工作。
在我的应用中,它看起来应该像这样:
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
创建SQL表类型。
我知道我可以创建类似于表的主键列的对象类型,然后在此对象上创建表类型。然后我的应用程序必须知道表的主键才能
myQuery = "select * from mytable where (key1, key2) in (select key1, key2 from table(myfunction))";
...
我更希望函数返回表行或行ID。这可能吗?
我目前仍在使用Oracle 11.2,但我也对较新版本的解决方案感兴趣。