Я хочу написать функцию, которая возвращает записи таблицы, которые я могу показать в сетке моего приложения. Мое приложение не должно учитывать структуру таблицы. Я хочу, чтобы он все еще работал, когда кто-то добавляет столбцы в таблицу или удаляет их.
В моем приложении это будет выглядеть примерно так:
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
также не разрешен.
Итак, есть ли способ достичь именно того, чего я хочу?
В качестве альтернативы я подумал о работе с идентификаторами. Это заставило бы код моего приложения выглядеть примерно так:
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
не допускается. Также не создается тип таблицы SQL с CREATE TYPE table_of_rowids IS TABLE OF UROWID
.
Я знаю, что мог бы создать тип объекта, похожий на столбцы первичного ключа таблицы, а затем создать тип таблицы для этого объекта. Тогда мое приложение должно знать первичный ключ таблицы, чтобы
myQuery = "select * from mytable where (key1, key2) in (select key1, key2 from table(myfunction))";
...
Я бы предпочел, чтобы моя функция возвращала строки таблицы или строки. Это возможно?
В настоящее время я все еще работаю над Oracle 11.2, но мне также будут интересны решения для более новых версий.