2013-10-15 61 views
2

初始情況實例化Oracle對象類型:在VARCHAR2使用類型名稱

  • 我有一個可變類型名:
  • 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開發人員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是definetly不是我的母語,我會感謝任何建議:)

+0

可能的[複製](http://stackoverflow.com/questions/9362994/how-to-call-an-oracle-pl-sql-object-super-method/9364571#9364571) – tbone

回答

1

你很近,你的「成將myInstance」只需要到外面的執行直接...

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

你也可以使用PL/SQL執行即時語法,方法是在開始/結束塊中包裝並適當使用綁定變量: 'execute immediate'begin:myInstance:='|| type_name ||'();結束;'使用myInstance;' – Starfighter

+0

工程就像一個魅力,這正是我需要的!非常感謝你! – SixDoubleFiveTreeTwoOne

相關問題