私はANYDATAに格納されているユーザー定義のオブジェクトを処理するプロシージャを作成しています。オブジェクト型と属性名は実行時にしか知ることができないので、declareセクションでそれを定義することはできません。 Javaでは、私はそれに対処するために反射を使用することができます、私はクラス名とフィールド名を知ることができます。その後、私はリフレクションを通してフィールドにアクセスできます。そのようなPLSQLでそれを行う方法はありますか?私の頭の中では、プロシージャ内にSQL文字列を動的に作成して実行しています。しかし、それは私が正確にしたいものではありません。PLSQLのリフレクション?
たとえば、ユーザーAはADTタイプをcreate or replace type Person_type as object (fname varchar2(10), lname varchar2(10));
と定義し、オブジェクトインスタンスを作成してANYDATAに挿入します。
私の手順では、何とか私はこのオブジェクトの最初の属性であるfnameを処理する必要があることを知っています。
declare
adobject A.Person_type; -- HERE! I don't know the type yet, so I can't define adobject!
tempAnydata anydata;
rt number;
vbuffer varchar2(10);
...
begin
select somecolumn
into tempAnydata
from sometable
where something='something' for update;
rt := tempAnydata.GetObject(adobject);
vbuffer := adobject.fname; -- HERE! I don't know the attribute name is fname!
-- deal with vbuffer here
end;
だから私は動的にそれを作るために何をすべき:最初の場所でのADTの種類を知っているのであれば、私のコードは次のようになりますか?前もって感謝します。
あなたは 'tempAnydata'があることがわかっている場合は*本当に*' A.person_type'あなたはきっと(まさにこのタイプのadobjectとそうでない場合は、あなたが 'のGetObject(adobjectを行うことができませんでした)')そうであるようにその型の最初の属性が何であるかも知っています。または私は何かを逃していますか? –
A.person_typeは単なる例であり、任意のユーザー定義タイプとすることができます。それはB.anymal_typeなのかもしれません。 – icespace
静的なタイピングは大変です。 (ちょっと古いスモールトークカーがさまよって、自己に呟く:-) –