2009-06-30 14 views
7

Oracle Database 10gでは、パッケージまたはプロシージャの外部で連想配列型を作成できますか?私はこの結合配列型を別の型で参照できるようにこれを行うことができるようにしたいと思います。たとえば:パッケージ/プロシージャの外部でOracle結合配列型を作成することはできますか?

create type my_type_map is table of varchar2(10) index by varchar2(10); 

create type my_other_type as object ( 
    id number(15), 
    member procedure initialize(p_my_type_map my_type_map) 
) not instantiable not final; 

私が手にエラーがある:

index by varchar2(10)  

をPL/SQLであるとの創造にそれを許可doens'tする:

SQL> create type my_type_map is table of varchar2(20) index by varchar2(10); 
    2/

Warning: Type created with compilation errors. 

SQL> show errors; 
Errors for TYPE MY_TYPE_MAP: 

LINE/COL ERROR 
-------- ----------------------------------------------------------------- 
0/0  PL/SQL: Compilation unit analysis terminated 
1/21  PLS-00355: use of pl/sql table not allowed in this context 
SQL> 

は、Oracleが考えていることを思えSQL型。オラクルが実際に連想配列をパッケージ外で定義することを許可していない場合は、良い選択肢がありますか?すべての型が同じパッケージに定義されるように、パッケージ内でOracleのオブジェクトを拡張する型を作成できますか?

おかげで、 ジェフ

編集:修正されたコードサンプルは、ログを追加し、問題として可能な代替を追加しました。

+0

エラーはいつ発生しますか?私は、上記の両方のタイプをoracle、10gR2からの苦情なしで作成しました。あなたの例は、pls_integerではなく、INDEX BY VARCHAR2と言う... – DCookie

+0

詳細と修正を追加しました。ありがとう! – jlpp

答えて

5

答えはいいえ、あなたがやろうとしていることはできません。型にBOOLEAN型変数を追加するだけで、オブジェクトに追加することができます。オブジェクトの項目には、PL/SQL型ではなく、Oracle型が含まれている必要があります。

CREATE TYPE t_aa AS VARRAY(10) OF VARCHAR2(10); 

CREATE OR REPLACE TYPE t_ua AS OBJECT (ID NUMBER(15) 
            , MEMBER PROCEDURE initialize(p_aa t_aa) 
            , MEMBER PROCEDURE initialize(p_aa_i taa)) 
           NOT INSTANTIABLE NOT FINAL; 

関連する変数のペアを2つのVARRAYに格納します。アレイの最大可能サイズを知る必要があります。

+1

ありがとうDCookie。私はOracleオブジェクト型を使用することに決めず、まっすぐPL/SQLとレコード型を使用しています。 – jlpp

+1

私はOracle Objectsの大きなファンではありません。私は大きなメリットは見当たりません。これらは絶対に非標準的なものなので、データ構造は移植性がありません。 – DCookie

0

これらは、エラーが示唆しているとおり、PL/SQL型です。パッケージのパブリック仕様で宣言することを止めるものは何もありません。必要なPL/SQLコードで参照できます。

+0

は、パッケージは、オブジェクトタイプの定義を許可ようには見えません: 作成または 型my_type_mapとしてVARCHAR2の表はVARCHAR2(10)による(10)インデックスがある パッケージmy_packageを交換します。 タイプmy_other_typeオブジェクト( id番号(15)、 )メンバプロシージャの初期化(p_my_type_map number) )インスタンス化できません。 end; エラー(2,1):PLS-00707:サポートされていない構文または内部エラー[2603] エラー(5,3):PLS-00540:このコンテキストではオブジェクトがサポートされていません。 エラー(5,3):PL/SQL:宣言が無視されました 私はこれを間違った方法で行っていますか? – jlpp

+0

私は彼が言っていることは、オブジェクトとpl/sql型を互いに区別して宣言しなければならないと思います。 – moleboy

+0

PL/SQLの外で定義されたオブジェクト型は、PL/SQLでは何も参照できません。 – jlpp

関連する問題