日本語PDF

272 ANYDATAタイプ

ANYDATAタイプには、指定のタイプのインスタンスおよびそのタイプの説明が含まれています。つまり、ANYDATAは自己記述型です。ANYDATAは、データベースに永続的に格納できます。

この章のトピックは、次のとおりです:

272.1 ANYDATAタイプの制限事項

BFILE以外のLOBがタイプに埋め込まれたANYDATAインスタンスの永続的な格納は、現時点ではサポートされていません。

272.2 ANYDATAタイプの操作上のノート

この項では、ANYDATAタイプの構成およびアクセスに関連するノートについて説明します。

構成

ANYDATAを構成するには、2通りの方法があります。CONVERT*コールを使用すると、単一のコールでANYDATA全体を構成できます。Oracle ORDBMSのあらゆるタイプからANYDATAまで、明示的なCASTファンクションとして機能します。

STATIC FUNCTION ConvertBDouble(dbl IN BINARY_DOUBLE) return ANYDATA,
STATIC FUNCTION ConvertBfile(b IN BFILE) RETURN ANYDATA,
STATIC FUNCTION ConvertBFloat(fl IN BINARY_FLOAT) return ANYDATA,
STATIC FUNCTION ConvertBlob(b IN BLOB) RETURN ANYDATA,
STATIC FUNCTION ConvertChar(c IN CHAR) RETURN ANYDATA,
STATIC FUNCTION ConvertClob(c IN CLOB) RETURN ANYDATA,
STATIC FUNCTION ConvertCollection(col IN "collection_type") RETURN ANYDATA,
STATIC FUNCTION ConvertDate(dat IN DATE) RETURN ANYDATA,
STATIC FUNCTION ConvertIntervalDS(inv IN INTERVAL DAY TO SECOND) return ANYDATA,
STATIC FUNCTION ConvertIntervalYM(invIN INTERVAL YEAR TO MONTH) return ANYDATA,
STATIC FUNCTION ConvertNchar(nc IN NCHAR) return ANYDATA,
STATIC FUNCTION ConvertNClob(nc IN NCLOB) return ANYDATA,
STATIC FUNCTION ConvertNumber(num IN NUMBER) RETURN ANYDATA,
STATIC FUNCTION ConvertNVarchar2(nc IN NVARCHAR2) return ANYDATA,
STATIC FUNCTION ConvertObject(obj IN "<object_type>") RETURN ANYDATA,
STATIC FUNCTION ConvertRaw(r IN RAW) RETURN ANYDATA,
STATIC FUNCTION ConvertRef(rf IN REF "<object_type>") RETURN ANYDATA,
STATIC FUNCTION ConvertTimestamp(ts IN TIMESTAMP) return ANYDATA,
STATIC FUNCTION ConvertTimestampTZ(ts IN TIMESTAMP WITH TIMEZONE) return ANYDATA,
STATIC FUNCTION ConvertTimestampLTZ(ts IN TIMESTAMP WITH LOCAL TIMEZONE) return ANYDATA,
STATIC FUNCTION ConvertURowid(rid IN UROWID) return ANYDATA,
STATIC FUNCTION ConvertVarchar(c IN VARCHAR) RETURN ANYDATA,
STATIC FUNCTION ConvertVarchar2(c IN VARCHAR2) RETURN ANYDATA,

ANYDATAを構成するもう1つの方法は、個別のアプローチによるものです。構成プロセスは、BEGINCREATE静的プロシージャ・コールで開始し、ENDCREATEメンバー・プロシージャ・コールで終了します。この2つのコールの間では、SET*コールを使用して、オブジェクト・タイプの各属性またはコレクションの要素を設定できます。オブジェクト属性およびコレクション要素に個別にアクセスするには、GET*コールの前にPIECEWISEメンバー・プロシージャ・コールを起動しておく必要があります。

ノート: ANYDATAは、最初の属性(またはコレクション要素)から順番に構成またはアクセスする必要があります。BEGINCREATEコールは、個別モードで構成を自動的に開始します。BEGINCREATEの後、すぐにPIECEWISEをコールする必要はありません。構成プロセスを終了するには、ENDCREATEをコールする必要があります(その後、アクセス・コールが実行できます)。

アクセス

アクセス・ファンクションは、SQLに基づいて使用できます。これらのファンクションは、タイプの不一致が発生しても例外をスローしません。そのかわりに、ANYDATAのタイプがアクセスのタイプに対応していない場合に、NULLを戻します。問合せで戻されたタイプのうちANYDATAファンクションのみを使用したい場合は、GETTYPENAMEを使用するWHERE句を使用し、該当するタイプを選択します("SYS.NUMBER"と指定)。各ファンクションは、SYS.ANYDATAラッパーの中に指定されたデータ・タイプの値を戻します。

MEMBER FUNCTION AccessBDouble(self IN ANYDATA) return BINARY_DOUBLE
   DETERMINISTIC,
MEMBER FUNCTION AccessBfile(self IN ANYDATA) return BFILE,
MEMBER FUNCTION AccessBFloat(self IN ANYDATA) return BINARY_FLOAT
   DETERMINISTIC,
MEMBER FUNCTION AccessBlob(self IN ANYDATA) return BLOB,
MEMBER FUNCTION AccessChar(self IN ANYDATA) return CHAR,
MEMBER FUNCTION AccessClob(self IN ANYDATA) return CLOB,
MEMBER FUNCTION AccessDate(self IN ANYDATA) return DATE,
MEMBER FUNCTION AccessIntervalYM(self IN ANYDATA) return INTERVAL YEAR TO MONTH,
MEMBER FUNCTION AccessIntervalDS(self IN ANYDATA) return INTERVAL DAY TO SECOND,
MEMBER FUNCTION AccessNchar(self IN ANYDATA) return NCHAR,
MEMBER FUNCTION AccessNClob(self IN ANYDATA) return NCLOB
MEMBER FUNCTION AccessNumber(self IN ANYDATA) return NUMBER,
MEMBER FUNCTION AccessNVarchar2(self IN ANYDATA) return NVARCHAR2,
MEMBER FUNCTION AccessRaw(self IN ANYDATA) return RAW,
MEMBER FUNCTION AccessTimestamp(self IN ANYDATA) return TIMESTAMP,
MEMBER FUNCTION AccessTimestampLTZ(self IN ANYDATA) return TIMESTAMP WITH LOCAL 
   TIMEZONE,
MEMBER FUNCTION AccessTimestampTZ(self IN ANYDATA) return TIMESTAMP WITH 
   TIMEZONE,
MEMBER FUNCTION AccessURowid(self IN ANYDATA) return UROWID DETERMINISTIC
MEMBER FUNCTION AccessVarchar(self IN ANYDATA) return VARCHAR,
MEMBER FUNCTION AccessVarchar2(self IN ANYDATA) return VARCHAR2,

272.3 ANYDATAサブプログラムの要約

この表は、ANYDATAのサブプログラムをアルファベット順に示し、簡単に説明しています。

表272-1 ANYDATAタイプのサブプログラム

サブプログラム 説明

BEGINCREATE静的プロシージャ

新しいANYDATAで作成プロセスを開始します。

ENDCREATEメンバー・プロシージャ

ANYDATAの作成を終了します。

GET*メンバー・ファンクション

現行のデータ値(適切なタイプのデータ値)を取得します。

GETTYPEメンバー・ファンクション

ANYDATAのタイプを取得します。

GETTYPENAMEメンバー・ファンクション

ANYDATAの完全修飾名を取得します。

PIECEWISEメンバー・プロシージャ

1回ごとに現行のデータ値が属性となるようにアクセスのMODEを設定します(データ値がTYPECODE_OBJECTの場合)。 

SET*メンバー・プロシージャ

現行のデータ値を設定します。

272.3.1 BEGINCREATE静的プロシージャ

このプロシージャは、新しいANYDATAで作成プロセスを開始します。

構文

STATIC PROCEDURE BeginCreate(
   dtype          IN OUT NOCOPY AnyType,
   adata          OUT NOCOPY ANYDATA);

パラメータ

表272-2 BEGINCREATEプロシージャのパラメータ

パラメータ 説明

dtype

ANYDATAのタイプ。(OCI_TYPECODE_OBJECTまたはCollection typecodeに対応する必要があります。)

adata

構成されるANYDATA。

例外

DBMS_TYPES.INVALID_PARAMETERS: dtypeは無効です(完全に構成されていない、および同様の障害)。

使用上のノート

このコールの後、すぐにPIECEWISEをコールする必要はありません。この構成プロセスは、個別モードで自動的に開始されます。

272.3.2 ENDCREATEメンバー・プロシージャ

このプロシージャは、ANYDATAの作成を終了します。このコール以降は、その他の作成ファンクションをコールすることはできません。

構文

MEMBER PROCEDURE EndCreate(
   self         IN OUT NOCOPY ANYDATA);

パラメータ

表272-3 ENDCREATEプロシージャのパラメータ

パラメータ 説明

self

ANYDATA

272.3.3 GET*メンバー・ファンクション

これらのファンクションは、現行のデータ値(適切なタイプのデータ値)を取得します。

現在のデータ値のタイプは、アクセスするモードにより異なります。つまり、PIECEWISEコールを起動しているかどうかにより異なります。

PIECEWISEがコールされていない場合は、ANYDATAに完全にアクセスし、データ値のタイプはANYDATAのタイプと一致する必要があります。

PIECEWISEがコールされている場合、ANYDATAは個別にアクセスされます。データ値のタイプは、現在の位置での属性のタイプ(またはコレクション要素)に一致する必要があります。

構文

MEMBER FUNCTION GetBDouble(
   self         IN ANYDATA,
   dbl          OUT NOCOPY BINARY_DOUBLE)
RETURN PLS_INTEGER;

MEMBER FUNCTION GetBfile(
   self         IN ANYDATA,
   b            OUT NOCOPY BFILE)
   RETURN       PLS_INTEGER;

MEMBER FUNCTION GetBFloat(
   self         IN ANYDATA,
   fl           OUT NOCOPY BINARY_FLOAT)
RETURN PLS_INTEGER;

MEMBER FUNCTION GetBlob(
   self         IN ANYDATA,
   b            OUT NOCOPY BLOB)
   RETURN       PLS_INTEGER;

MEMBER FUNCTION GetChar(
   self         IN ANYDATA,
   c            OUT NOCOPY CHAR)
   RETURN       PLS_INTEGER;

MEMBER FUNCTION GetClob(
   self         IN ANYDATA,
   c            OUT NOCOPY CLOB)
   RETURN       PLS_INTEGER;

MEMBER FUNCTION GetCollection(
   self         IN ANYDATA,
   col          OUT NOCOPY "<collection_type>")
   RETURN       PLS_INTEGER;

MEMBER FUNCTION GetDate(
   self         IN ANYDATA,
   dat          OUT NOCOPY DATE)
   RETURN       PLS_INTEGER;

MEMBER FUNCTION GetIntervalDS(
   self         IN ANYDATA,
   inv          OUT NOCOPY INTERVAL DAY TO SECOND) 
 RETURN         PLS_INTEGER;

MEMBER FUNCTION GetIntervalYM(
   self         IN ANYDATA,
   inv          OUT NOCOPY INTERVAL YEAR TO MONTH) 
 RETURN         PLS_INTEGER;

MEMBER FUNCTION GetNchar(
   self         IN ANYDATA, 
   nc           OUT NOCOPY NCHAR) 
 RETURN         PLS_INTEGER;

MEMBER FUNCTION GetNClob(
   self         IN ANYDATA, 
   nc           OUT NOCOPY NCLOB) 
 RETURN         PLS_INTEGER;

MEMBER FUNCTION GetNumber(
   self         IN ANYDATA,
   num          OUT NOCOPY NUMBER)
   RETURN       PLS_INTEGER;

MEMBER FUNCTION GetNVarchar2(
   self         IN ANYDATA, 
   nc           OUT NOCOPY NVARCHAR2) 
 RETURN         PLS_INTEGER;

MEMBER FUNCTION GetObject(
   self         IN ANYDATA,
   obj          OUT NOCOPY "<object_type>")
   RETURN       PLS_INTEGER;

MEMBER FUNCTION GetRaw(
   self         IN ANYDATA,
   r            OUT NOCOPY RAW)
   RETURN       PLS_INTEGER;

MMEMBER FUNCTION GetRef(
   self         IN ANYDATA,
   rf           OUT NOCOPY REF "<object_type>")
   RETURN       PLS_INTEGER;

MEMBER FUNCTION GetTimestamp(
   self         IN ANYDATA, 
   ts           OUT NOCOPY TIMESTAMP)
 RETURN PLS_INTEGER;

MEMBER FUNCTION GetTimestampTZ(
   self         IN ANYDATA, 
   ts           OUT NOCOPY TIMESTAMP WITH TIME ZONE) 
 RETURN PLS_INTEGER;

MEMBER FUNCTION GetTimestampLTZ(
   self         IN ANYDATA,
   ts           OUT NOCOPY TIMESTAMP WITH LOCAL TIME ZONE) 
 RETURN PLS_INTEGER;

MEMBER FUNCTION GetVarchar(
   self         IN ANYDATA,
   c            OUT NOCOPY VARCHAR)
   RETURN       PLS_INTEGER;

MEMBER FUNCTION GetVarchar2(
   self         IN ANYDATA,
   c            OUT NOCOPY VARCHAR2)
   RETURN       PLS_INTEGER;

パラメータ

表272-4 GET*ファンクションのパラメータ

パラメータ 説明

self

ANYDATA。

num

取得する数値。

戻り値

DBMS_TYPES.SUCCESSまたはDBMS_TYPES.NO_DATA

PIECEWISEがコレクションに対してすでにコールされている場合にのみ、戻り値が関連します。このような場合、全要素にアクセスしたときにDBMS_TYPES.NO_DATAはコレクションの終了を示します。

例外

DBMS_TYPES.TYPE_MISMATCH: 予想されたタイプが渡されたタイプと異なる場合。

DBMS_TYPES.INVALID_PARAMETERS: 無効なパラメータ(作成プロセスのこの時点での数値の追加が適切ではない場合)。

DBMS_TYPES.INCORRECT_USAGE: 不適切な使用。

272.3.4 GETTYPEメンバー・ファンクション

このファンクションは、ANYDATAのtypecodeを取得します。

構文

MEMBER FUNCTION GETTYPE(
   self          IN ANYDATA,
   typ           OUT NOCOPY AnyType)
   RETURN        PLS_INTEGER;

パラメータ

表272-5 GETTYPEファンクションのパラメータ

パラメータ 説明

self

ANYDATA

typ

ANYDATAに対応するAnyType。ユーザー定義タイプを表していない場合は、NULLの場合があります。

戻り値

ANYDATAのタイプに対応するtypecode。

272.3.5 GETTYPENAMEメンバー・ファンクション

このファンクションは、ANYDATAの完全修飾名を取得します。

ANYDATAが組込みタイプに基づいている場合、このファンクションはNUMBERなどの関連情報を戻します。

ユーザー定義タイプに基づいている場合、このファンクションはschema_name.type_name(SCOTT.FOOなど)を戻します。

一時的な匿名タイプに基づいている場合、このファンクションはNULLを戻します。

構文

MEMBER FUNCTION GETTYPENAME(
   self         IN ANYDATA)
   RETURN       VARCHAR2;

パラメータ

表272-6 GETTYPENAMEファンクションのパラメータ

パラメータ 説明

self

ANYDATA

戻り値

ANYDATAのタイプ名。

272.3.6 PIECEWISEメンバー・プロシージャ

このプロシージャは、1回ごとに現行のデータ値が属性となるようにアクセス・モードを設定します(データ値がTYPECODE_OBJECTの場合)。

データ値のアクセス・モードを一度にコレクション要素に設定します(データ値がコレクション・タイプの場合)。このコールが実行されると、後続のSET*およびGET*へのコールにより順番に個別の属性またはコレクション要素が取得されます。

構文

MEMBER PROCEDURE PIECEWISE(
   self         IN OUT NOCOPY ANYDATA);

パラメータ

表272-7 PIECEWISEプロシージャのパラメータ

パラメータ 説明

self

現在のデータ値。

例外

  • DBMS_TYPES.INVALID_PARAMETERS

  • DBMS_TYPES.INCORRECT_USAGE: 不適切な使用。

使用上のノート

このコールの実行前は、現行のデータ値は、OBJECTまたはCOLLECTIONタイプである必要があります。

オブジェクトまたはコレクション・タイプのネストされた属性の個別の構成またはアクセスはサポートされていません。

272.3.7 SET*メンバー・プロシージャ

このプロシージャは、現行のデータ値を設定します。

現行のデータ値のタイプに応じてコールする必要のあるプロシージャのリストです。データ値のタイプは、個別の構成プロセス中の現在の位置での属性のタイプにする必要があります。

構文

MEMBER PROCEDURE SETBDOUBLE(
   self        IN OUT NOCOPY ANYDATA,
   dbl         IN BINARY_DOUBLE,
   last_elem   IN boolean DEFAULT FALSE);

MEMBER PROCEDURE SETBFILE(
   self        IN OUT NOCOPY ANYDATA,
   b           IN BFILE,
   last_elem   IN boolean DEFAULT FALSE);

MEMBER PROCEDURE SETBFLOAT(
   self        IN OUT NOCOPY ANYDATA, 
   fl          IN            BINARY_FLOAT,
   last_elem   IN            boolean DEFAULT FALSE);

MEMBER PROCEDURE SETBLOB(
   self        IN OUT NOCOPY ANYDATA, 
   b           IN BLOB,
   last_elem   IN boolean DEFAULT FALSE);

MEMBER PROCEDURE SETCHAR(
   self        IN OUT NOCOPY ANYDATA, 
   c           IN CHAR,
   last_elem   IN boolean DEFAULT FALSE);

MEMBER PROCEDURE SETCLOB(
   self        IN OUT NOCOPY ANYDATA,
   c           IN CLOB,
   last_elem   IN boolean DEFAULT FALSE);

MEMBER PROCEDURE SETCOLLECTION(
   self        IN OUT NOCOPY ANYDATA,
   col         IN "<collectyion_type>",
   last_elem   IN boolean DEFAULT FALSE);

MEMBER PROCEDURE SETDATE(
   self        IN OUT NOCOPY ANYDATA, 
   dat         IN DATE,
   last_elem   IN boolean DEFAULT FALSE);

MEMBER PROCEDURE SETINTERVALDS(
   self        IN OUT NOCOPY ANYDATA,
   inv         IN INTERVAL DAY TO SECOND,
   last_elem IN boolean DEFAULT FALSE);
  
MEMBER PROCEDURE SETINTERVALYM(
   self        IN OUT NOCOPY ANYDATA,
   inv         IN INTERVAL YEAR TO MONTH,
   last_elem   IN boolean DEFAULT FALSE);
  
MEMBER PROCEDURE SETNCHAR(
   self        IN OUT NOCOPY ANYDATA,
   nc          IN NCHAR, 
   last_elem   IN boolean DEFAULT FALSE);
  
MEMBER PROCEDURE SETNCLOB(
   self        IN OUT NOCOPY ANYDATA,
   nc          IN NClob, 
   last_elem   IN boolean DEFAULT FALSE);

MEMBER PROCEDURE SETNUMBER(
   self        IN OUT NOCOPY ANYDATA, 
   num         IN NUMBER,
   last_elem   IN boolean DEFAULT FALSE);

MEMBER PROCEDURE SETNVARCHAR2(
   self        IN OUT NOCOPY ANYDATA,
   nc          IN NVarchar2, 
   last_elem   IN boolean DEFAULT FALSE),
  
MEMBER PROCEDURE SETOBJECT(
   self        IN OUT NOCOPY ANYDATA,
   obj         IN "<object_type>",
   last_elem   IN boolean DEFAULT FALSE);

MEMBER PROCEDURE SETRAW(
   self        IN OUT NOCOPY ANYDATA, 
   r           IN RAW,
   last_elem   IN boolean DEFAULT FALSE);

MEMBER PROCEDURE SETREF(
   self        IN OUT NOCOPY ANYDATA,
   rf          IN REF "<object_type>",
   last_elem   IN boolean DEFAULT FALSE);

MEMBER PROCEDURE SETTIMESTAMP(
   self       IN OUT NOCOPY ANYDATA, 
   ts         IN TIMESTAMP,
   last_elem  IN BOOLEAN DEFAULT FALSE);
  
MEMBER PROCEDURE SETTIMESTAMPTZ(self IN OUT NOCOPY ANYDATA, 
   ts          IN TIMESTAMP WITH TIME ZONE,
   last_elem   IN BOOLEAN DEFAULT FALSE);
  
MEMBER PROCEDURE SETTIMESTAMPLTZ(
   self IN OUT NOCOPY ANYDATA,
   ts IN TIMESTAMP WITH LOCAL TIME ZONE,
   last_elem IN boolean DEFAULT FALSE),
  
MEMBER PROCEDURE SETVARCHAR(
   self        IN OUT NOCOPY ANYDATA, 
   c           IN VARCHAR,
   last_elem   IN boolean DEFAULT FALSE);

MEMBER PROCEDURE SETVARCHAR2(
   self        IN OUT NOCOPY ANYDATA,
   c           IN VARCHAR2, 
   last_elem   IN boolean DEFAULT FALSE);

パラメータ

表272-8 SET* Procedureパラメータ

パラメータ 説明

self

ANYDATA

num

設定する数値などの関連情報。

last_elem

ANYDATAがコレクションを表す場合にのみ関連します。

コレクションの最後の要素の場合はTRUE、そうでない場合はFALSEに設定します。

例外

  • DBMS_TYPES.INVALID_PARAMETERS: 無効なパラメータ(作成プロセスのこの時点での数値の追加が適切ではない場合)。

  • DBMS_TYPES.INCORRECT_USAGE: 不適切な使用。

  • DBMS_TYPES.TYPE_MISMATCH: 予想されたタイプが渡されたタイプと異なる場合。

使用上のノート

BEGINCREATEがコールされた場合は、個別モードですでに構成が開始されています。SET*への後続のコールにより、次の属性値が設定されます。

ANYDATAがスタンドアロンのコレクションである場合は、SET*をコールすると次のコレクション要素が設定されます。