如何在Oracle中使用动态返回类型定义pl sql函数?

Ale*_* S. 2 oracle plsql

我有一组具有不同数据类型的表,我需要整合一种检索数据的方法.我认为使用函数是个好主意,但我不知道如何定义一个具有不同返回类型的函数.

例如,如何定义此函数以便能够对tabletype使用不同的定义.

CREATE OR REPLACE FUNCTION retrieve_info(field_id in integer)
RETURN pintegertypetable -- <-- how to change this to return a more generic record built dynamically in the code below?
AS
  r pintegertypetable := pintegertypetable ();
BEGIN
  r.extend;
  r(i) := pintegertypetable (someinteger);
  return r;
END;
Run Code Online (Sandbox Code Playgroud)

那可能吗?.有没有更好的方法来处理这个问题:最初存储在许多遗留表中的不同列,并且假设每列都有不同的数据类型,我们可以通过哪种方式检索保存原始数据类型的最新信息,而无需硬编码视图将所有内容存储在varchar2中并在客户端代码中再次投射?

Dat*_*jam 6

您可以通过使用弱类型的Ref Cursor作为返回类型来实现此目的.这在使用JDBC的客户端界面中特别容易实现,因为返回的游标类型可以像任何查询结果一样逐步执行,并且可以从ResultSet.getMetaData()中查询元数据.这是一个例子:

CREATE OR REPLACE PROCEDURE retrieve_info(field_id in integer, p_cursor in out sys_refcursor)
AS
BEGIN
  open p_cursor for 'select * from emp';
END;
Run Code Online (Sandbox Code Playgroud)

对于任意数量的列,引号中的查询可以是返回任何类型的任何内容.