【发布时间】:2014-10-09 16:28:39
【问题描述】:
我想实现类似下面的伪代码。假设我有一个名为 T_TMP_TABLE 的表,其中包含 'hour'、'day' 和 'year' 列。表名用作 create_types_fn 函数的输入参数。假设我可以得到一个列名列表并将其存储到 column_name_array。现在,我需要使用这些列名创建“自定义类型”。原因是该函数会将表作为输出返回,并且返回的表的列将是相同的('hour'、'day' 和 '年份')
简而言之,我有一个表,我需要以具有相同列名的表格式输出。
我能做到吗?任何建议或建议将不胜感激!
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可能是你的朋友。 Docs here。分享和享受。 -
所有对该类型的引用也必须是动态的。动态创建数据库对象通常不是一个好主意。您不能将尚未创建的表类型用作函数的返回类型,除非您动态创建它,这意味着对它的调用必须是动态的,等等。听起来不是一条好路向下。什么在调用函数以及它将如何使用结果;也许一个 ref 游标可以代替?
-
您可以使用动态 SQL 来创建对象类型和表类型。然后,您可以编写一个动态 PL/SQL 块,该块将声明一个新表类型的实例并通过您的
BULK COLLECT填充它。但是你不能从你的函数中返回一个新表类型的实例(没有将它转换为SYS.ANYDATA,然后尝试在调用者中编写一些以某种方式知道如何有效处理它的东西。我会强烈建议退后一步,因为这种解决方案很快就会陷入困境 -
我不太明白您要做什么。也许您应该对此进行详细说明,以便我们可以推荐一些其他工具?至于how,我能看到的唯一用例是按照您的意图动态生成类型,即编写一些“DB 引导程序”或“安装程序”——也就是说,构建某种骨架数据库,以及然后让程序员在此基础上进行开发。
-
@SylvainLeroux 我编辑了我的问题
标签: sql plsql oracle-sqldeveloper