【问题标题】:Instantiating oracle object type using a type name in varchar2使用 varchar2 中的类型名称实例化 oracle 对象类型
【发布时间】:2013-10-15 16:57:02
【问题描述】:

初始情况:

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

【问题讨论】:

标签: oracle types plsql instantiation


【解决方案1】:

你已经很接近了,你的“进入 myInstance”只需要在执行立即之外......

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

【讨论】:

  • 您还可以使用 PL/SQL 执行即时语法,方法是包装在开始/结束块中并适当地使用绑定变量:execute immediate 'begin :myInstance := '||type_name||'(); end;' using out myInstance;
  • 像魅力一样工作,这正是我所需要的!非常感谢!
猜你喜欢
  • 2011-10-11
  • 2018-06-26
  • 1970-01-01
  • 2019-01-22
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多