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;

追加情報: すべてが 1 つのスーパータイプから継承されるいくつかのオブジェクト タイプを使用したいと考えています。すべての継承サブタイプは、単一のメソッドの実装のみが異なります。最後に、多数の varchar2 (型名) を反復処理し、すべての型をインスタンス化し、関数を呼び出す関数を作成します (すべて同じ名前ですが、実装が異なるため異なることを行います)。さまざまなサブタイプにはいくつかの便利な要素が含まれており、開発者はスーパータイプから継承することでルールに固執する必要があります。だから私はポリモーフィズムの古典的な利点を使いたいだけです。

PL/SQL は明らかに私の母国語ではないので、何か提案をいただければ幸いです :)

4

1 に答える 1

1

あなたは非常に近くにいます。あなたの「into 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 に答える