使用varchar2中的类型名称实例化oracle对象类型

时间:2013-10-15 16:57:03

标签: oracle types plsql instantiation

初步情况:

  •  我在变量中有一个typename:
  •     type_name varchar2(20) := 'T_MY_TYPE';
  • T_SUPERTYPE是T_MY_TYPE的超类型
  • T_MY_TYPE会覆盖单个方法以提供特定行为。
  •  我自定义对象类型T_MY_TYPE的构造函数没有参数。
  •  我需要使用给定的变量创建一个类型实例。
  •  必须将创建的实例分配给超类型T_SUPERTYPE的变量。
  • Oracle版本:11.2.0.2.0,使用PL / SQL Developer 10.0.1进行开发

我失败的尝试:


    declare
        type_name varchar2(20) := 'T_MY_TYPE';
        myInstance T_SUPERTYPE;  
    begin
        execute immediate 'myInstance := ' || type_name || '()';
        -- Fails with ORA-00900: Invalid SQL statement
        -- tried alternative:
        exceute immediate 'select ' || type_name || '() from dual into myInstance';
        -- doesn't work either (ORA-00933: SQL command not properly ended)
    end;

其他信息: 我想使用几个都从一个超类型继承的对象类型。 所有继承子类型仅在单个方法的实现方面有所不同。 最后,我将有一个函数迭代多个varchar2(类型名称),实例化所有类型并调用函数(所有相同的名称,但由于不同的实现,做不同的事情)。 不同的子类型包含一些便利的东西,并迫使开发人员通过继承超类型来坚持规则。 所以我只想使用多态性的经典优势。

由于PL / SQL绝对不是我的母语,我将不胜感激任何建议:)

1 个答案:

答案 0 :(得分:1)

你非常接近,你的'进入myInstance'只需要立即执行......

declare
    type_name varchar2(20) := 'T_MY_TYPE';
    myInstance T_SUPERTYPE;  
begin
    exceute immediate 'select ' || type_name || '() from dual' into myInstance;
end;