4

type 属性または ANY の回避策を使用して要素の varray ストアの型を取得したい。

たとえば、私たちのタイプはこのように定義されています

CREATE TYPE "READINGS" AS VARRAY (200) OF NUMBER(21, 6);

(読み取り値は、型の要素を持つ varray ですnumber(21,6))

READINGSテーブル内の列INTERVALSです。は中央テーブルであり、SQL ストア プロシージャを実行するINTERVALSバッチ プロセスがあります。ストア プロシージャでは、 VArray 型の要素型にINTERVALSマッピングするハード コーディングされた変数宣言があります。たとえば、ストア プロシージャには次のような変数宣言があります。READINGNUMBER(21, 6)

CONSUMPTION NUMBER(21, 6);

Varray 定義が変更されるか、varray が削除され、異なるサイズと精度で再作成されるたびに、代わりに exnumber(21,6)が変更されnumber(25,9)、すべてのバッチ プロセス ストア プロシージャで変数宣言を変更する必要があります。私が探しているのは、CONSUMPTION 変数宣言を作成することだけです。VArray の要素型を参照してください。私はこのようなものが欲しい

CONSUMPTION INTERVALS.READINGS.COLUMN_TYPE%TYPE; 

(私はこのようなものが欲しい、varrayによって格納された要素のタイプを参照してください)

4

2 に答える 2

2

VARRAYそもそもなぜ列のあるテーブルを作成するのですか? READINGS一般に、行をテーブルに関連付けることができる外部キーを使用して別のテーブルを作成する方がはるかに理にかなっていINTERVALSます。その後、 type の列を簡単に宣言できますREADINGS.COLUMN_NAME%TYPE

コレクションは、PL/SQL で非常に役立ちます。データ モデリングに対する標準的な正規化されたアプローチを改善したケースは見たことがありません。コレクションをデータ モデルに組み込むと、データ モデルの操作が難しくなり、コードの記述と保守が難しくなるというケースを何度も見てきました。

データモデルを修正したくない場合は、次のことができます

  • 変数宣言の型として使用する型のSUBTYPEまたはパッケージ化された変数をNUMBER(21, 6)宣言します。型の宣言を変更する場合は、この定義を変更する必要がありますVARRAY
  • 単一の属性 (a) を持つオブジェクト タイプを作成し、そのオブジェクト タイプに基づいて をNUMBER(21,6)定義します。VARRAY次に、コードでオブジェクト型のインスタンスを宣言できます。
于 2013-03-05T16:40:20.140 に答える
0

これは必須のソリューションではありませんが、動的SQLでさらに使用するための型定義の文字列を取得できます。

SELECT 
   regexp_substr(text, 'VARRAY.*?OF\s+(.+?)(;|\s)*$', 1, 1, 'i', 1) 
FROM user_source 
WHERE name = 'READINGS'
于 2013-03-05T17:07:28.830 に答える