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 

编辑
这里就是我试图做
我想比较两个表,如果有任何区别返回行。所以,我认为输出应该是表格格式。由于每个表格都有不同的列名,所以我认为如果我可以制作通用函数将会很好。

+1

'EXECUTE IMMEDIATE'可能是你的朋友。 [文档在这里](http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/dynamic.htm#LNPLS01115)。分享并享受。 – 2014-10-09 16:59:42

+0

尽管如此,所有对该类型的引用都必须是动态的。动态创建数据库对象通常不是一个好主意。你不能使用尚未创建的表类型作为函数的返回类型,除非你动态创建它,这意味着它的调用必须是动态的,等等。听起来不是一条好路下。什么是调用函数,它将如何使用结果;也许一个引用光标会起作用呢? – 2014-10-09 17:34:12

+2

你可以使用动态SQL来创建你的对象类型并创建你的表类型。然后你可以编写一个动态的PL/SQL块来声明新的表类型的实例并通过你的'BULK COLLECT'来填充它。但是你不能从你的函数中返回一个新的表类型的实例(只是将它转换为'SYS.ANYDATA',然后尝试在调用者中编写一些东西,以某种方式知道如何处理这个有用的东西。强烈建议退后一步,因为这种解决方案很快会进入杂草 – 2014-10-09 17:36:03

如果您试图比较两个不同表格中的数据,那么您几乎肯定会想要使用dbms_comparison package而不是写你自己的。这填充了通用结构,而不是为每个表创建新类型。