PLSQL - 使用函数动态创建类型
问题描述:
我想实现类似下面的伪代码。假设我有表名为T_TMP_TABLE与列'小时','天'和'年'。该表名用作create_types_fn函数的输入参数。假设我可以获取列名称列表并将其存储到column_name_array。现在,我需要使用这些列名创建“自定义类型”。原因是,该函数将返回表作为输出,并返回表的列将是相同的(“小时”,“天”,并“年”)PLSQL - 使用函数动态创建类型
简言之,我有一个表,我需要输出为具有相同列名称的表格格式。
我能做到吗?任何建议或建议将不胜感激!
CREATE OR REPLACE FUNCTION create_types_fn (table_name in varchar2)
....
begin
array column_name_array = get_column_name_in_array_by_table_name(table_name)
CREATE OR REPLACE TYPE my_type AS OBJECT (
column_name_array(0) NUMBER,
column_name_array(1) NUMBER,
column_name_array(2) VARCHAR2(30)
);
CREATE OR REPLACE type my_table AS TABLE OF my_type ;
select * bulk collect into my_table ;
end
编辑
这里就是我试图做
我想比较两个表,如果有任何区别返回行。所以,我认为输出应该是表格格式。由于每个表格都有不同的列名,所以我认为如果我可以制作通用函数将会很好。
'EXECUTE IMMEDIATE'可能是你的朋友。 [文档在这里](http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/dynamic.htm#LNPLS01115)。分享并享受。 – 2014-10-09 16:59:42
尽管如此,所有对该类型的引用都必须是动态的。动态创建数据库对象通常不是一个好主意。你不能使用尚未创建的表类型作为函数的返回类型,除非你动态创建它,这意味着它的调用必须是动态的,等等。听起来不是一条好路下。什么是调用函数,它将如何使用结果;也许一个引用光标会起作用呢? – 2014-10-09 17:34:12
你可以使用动态SQL来创建你的对象类型并创建你的表类型。然后你可以编写一个动态的PL/SQL块来声明新的表类型的实例并通过你的'BULK COLLECT'来填充它。但是你不能从你的函数中返回一个新的表类型的实例(只是将它转换为'SYS.ANYDATA',然后尝试在调用者中编写一些东西,以某种方式知道如何处理这个有用的东西。强烈建议退后一步,因为这种解决方案很快会进入杂草 – 2014-10-09 17:36:03