2

初始情况:

  • 我在变量中有一个类型名:
  • 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 绝对不是我的母语,我将不胜感激任何建议 :)

4

1 回答 1

1

你非常接近,你的“进入 myInstance”只需要在执行立即之外......

declare
    type_name varchar2(20) := 'T_MY_TYPE';
    myInstance T_SUPERTYPE;  
begin
    exceute immediate 'select ' || type_name || '() from dual' into myInstance;
end;
于 2013-10-16T22:09:15.977 回答