システム カタログ関数
システム カタログ関数によるメタデータの取得
以下のトピックでは、システム カタログ関数について説明します。
PSQL システム カタログ関数
システム カタログ関数を使用すると、データ辞書ファイル(「カタログ」とも呼ばれます)からデータベース メタデータを取得することができます。システム カタログ関数は FROM 句でのみ使用できます。
PSQL では、適切なカタログ API を呼び出したり、システム ストアド プロシージャ(システム ストアド プロシージャを参照)を使用したりすることによって、メタデータ情報を返すこともできます。しかし、これら 2 つの方法はメタデータをビューに格納しません。ビューでは、ほかのテーブルとの JOIN や UNION が行えます。ほかのテーブルとの JOIN および UNION 機能を提供するには、システム カタログ関数が必要です。
ADO.NET など一部のアクセス方法では、JOIN および UNION の機能を利用できるように、エンティティ サポートのためのシステム カタログ関数を必要とします。
各システム カタログ関数のテンポラリ ビュー スキーマは、準備フェーズで作成されます。実行フェーズで対応するカタログ API を呼び出すことにより、そのビューにデータが格納されます。
次の表は、利用可能なシステム カタログ関数を示しています。
1 PSQL のカタログ関数は ODBC に基づいているので、追加情報については ODBC のドキュメントを参照してください。ここに記述されている内容は、PSQL カタログ関数を理解し使用するのに十分な情報を提供していますが、完全な技術的詳細は含まれていません。
リターン ステータス
各システム カタログ関数は、実行結果に応じて以下のステータスのいずれかを返します。
まとめ
システム カタログ関数には、次のような特徴が適用されます。
dbo.fSQLColumns
この関数は、指定されたテーブルの列名の一覧を返します。
構文
dbo.fSQLColumns <'database_qualifier' | null>, <'table_name' | null>, <'column_name' | null>)
引数
 
返される結果セット
 
次の例は、デフォルトの Demodata サンプル データベースに含まれる、Room テーブルのすべての列に関する情報を返します。
SELECT * FROM dbo.fSQLColumns ('Demodata', 'room', null)
結果セット(スペースを考慮して短縮されています):
COLUMN_NAME     DATA_TYPE   LENGTH   ORDINAL_POSITION
==============  =========   ======   ================
Building_Name           1       25                  1
Number                  4        4                  2
Capacity                5        2                  3
Type                    1       20                  4
 
4 行が影響を受けました。
dbo.fSQLForeignKeys
この関数は、現在のデータベース内の特定テーブルの外部キー情報を返します。dbo.fSQLForeignKeys は、外部キーの一覧を次のいずれかの結果セットとして返すことができます。
構文
dbo.fSQLForeignKeys (<'table_qualifier' | null>, 'pkey_table_name' | null>, <'fkey_table_name' | null>)
引数
 
返される結果セット
 
次の例では、Demodata サンプル データベースに 3 つのテーブルを作成します。それらのテーブルに外部キーと主キーが割り当てられます。dbo.fSQLForeignKeys 関数は、文字列検索パターンを使って 2 つの主キー テーブルを参照します。文字列検索パターンも参照してください。
CREATE TABLE primarykey1 (pk1col1 INT, pk1col2 INT, pk1col3 INT, pk1col4 INT, PRIMARY KEY (pk1col1, pk1col2))
ALTER TABLE primarykey1 ADD FOREIGN KEY (pk1col3, pk1col4) REFERENCES primarykey1 ON DELETE CASCADE
 
CREATE TABLE primarykey2 (pk2col1 INT, pk2col2 INT, pk2col3 INT, pk2col4 INT, PRIMARY KEY (pk2col1, pk2col2))
ALTER TABLE primarykey2 ADD FOREIGN KEY (pk2col3, pk2col4) REFERENCES primarykey2 ON DELETE CASCADE
 
CREATE TABLE foreignkey1 (fkcol1 INT, fkcol2 INT, fkcol3 INT, fkcol4 INT)
ALTER TABLE foreignkey1 ADD FOREIGN KEY (fkcol1, fkcol2) REFERENCES PRIMARYKEY1
ALTER TABLE foreignkey1 ADD FOREIGN KEY (fkcol3, fkcol4) REFERENCES PRIMARYKEY2
 
SELECT * FROM dbo.fSQLForeignKeys ('Demodata', 'primarykey%', 'foreignkey1')
結果セット(スペースを考慮して短縮されています):
FKCOLUMN_NAME  DELETE_RULE   FK_NAME     PK_NAME
=============  ===========   ==========  ==========
fkcol1                   1   FK_0fkcol1  PK_pk1col1
fkcol2                   1   FK_0fkcol1  PK_pk1col1
fkcol3                   1   FK_0fkcol3  PK_pk2col1
fkcol4                   1   FK_0fkcol3  PK_pk2col1
 
4 行が影響を受けました。
dbo.fSQLPrimaryKeys
この関数は、テーブルの主キーを構成する列名を結果セットとして返します。dbo.fSQLPrimaryKeys では、1 回の呼び出しで複数のテーブルから主キーを返すことはできません。
構文
dbo.fSQLPrimaryKeys (<'pkey_table_qualifier' | null>, <'table_name' | null>)
引数
 
返される結果セット
 
次の例では、Demodata サンプル データベースに 2 つのテーブルを作成します。それらのテーブルに外部キーと主キーが割り当てられます。dbo.fSQLPrimaryKeys 関数は、文字列検索パターンを使って 2 つのテーブルを参照します。文字列検索パターンも参照してください。
CREATE TABLE tblprimarykey3 ( tblpk3col1 INT, tblpk3col2 INT, tblpk3col3 INT, tblpk3col4 INT, PRIMARY KEY (tblpk3col1, tblpk3col2) )
ALTER TABLE tblprimarykey3 ADD FOREIGN KEY (tblpk3col3, tblpk3col4) REFERENCES tblprimarykey3 ON DELETE CASCADE
 
CREATE TABLE tblprimarykey4 ( tblpk4col1 INT, tblpk4col2 INT, tblpk4col3 INT, tblpk4col4 INT, PRIMARY KEY (tblpk4col1, tblpk4col2) )
ALTER TABLE tblprimarykey4 ADD FOREIGN KEY (tblpk4col3, tblpk4col4) REFERENCES tblprimarykey4 ON DELETE CASCADE
 
SELECT * FROM dbo.fsqlprimarykeys('Demodata', 'tbl%')
結果セット(スペースを考慮して短縮されています):
TABLE_NAME       COLUMN_NAME   KEY_SEQ   PK_NAME
==============   ===========   =======   =============
tblprimarykey3   tblpk3col1          1   PK_tblpk3col1
tblprimarykey3   tblpk3col2          2   PK_tblpk3col1
tblprimarykey4   tblpk4col1          1   PK_tblpk4col1
tblprimarykey4   tblpk4col2          2   PK_tblpk4col1
 
4 行が影響を受けました。
dbo.fSQLProcedures
この関数は、現在のデータベースまたは指定されたデータベースの、ストアド プロシージャおよびユーザー定義関数の名前を結果セットとして返します。CREATE PROCEDURECREATE FUNCTION も参照してください。
構文
dbo.fSQLProcedures (<'database_qualifier' | null>, <'procedure_name' | null>)
引数
 
メモ: システム ストアド プロシージャは、PSQL Control Center に表示されない内部データベース PERVASIVESYSDB に定義されています。
返される結果セット
 
デフォルトで、Demodata サンプル データベースにはストアド プロシージャとユーザー定義関数が何も含まれていません。dbo.fSQLProcedures 関数(および dbo.fSQLProcedureColumns)の出力を提供するために、次のようなストアド プロシージャとユーザー定義関数を作成してください。それらはすべて、必要なテーブルおよびパラメーター バインドが与えられれば呼び出すことができます。しかし、この例の目的はそれらの実行を示すことではなく、それらをデータベース オブジェクトとして含めることです。
CREATE PROCEDURECREATE FUNCTION も参照してください。
CREATE PROCEDURE curs1 (IN :Arg1 CHAR(4), IN :Arg2 INTEGER) AS BEGIN
DECLARE :alpha char(10) DEFAULT 'BA';
DECLARE :beta INTEGER DEFAULT 100;
DECLARE degdel CURSOR FOR
SELECT degree, cost_per_credit FROM tuition WHERE Degree = :Arg1 AND cost_per_credit = :arg2
FOR UPDATE;
OPEN degdel;
FETCH NEXT FROM degdel INTO :alpha, :beta
DELETE WHERE CURRENT OF degdel;
CLOSE degdel;
END
 
CREATE PROCEDURE EnrollStudent2 (IN :Stud_id INTEGER, IN
:Class_Id INTEGER);
BEGIN
INSERT INTO Enrolls VALUES (:Stud_id, :Class_Id, 0.0);
END
 
CREATE PROCEDURE AInsert
(IN :AGUID BINARY(16),
IN :APeriod INT,
IN :BBal UTINYINT,
IN :BDr DECIMAL(23,9),
IN :BCr DECIMAL(23,9),
IN :BNet DECIMAL(23,9),
IN :HTrx UTINYINT,
IN :PDr DECIMAL(23,9),
IN :PCr DECIMAL(23,9),
IN :PNet DECIMAL(23,9))
AS BEGIN
INSERT INTO "ASum" ("AID", "APeriod", "IBal", "BDr", "BCr", "BNet", "HTrx", "PDr", "PCr", "PNet") VALUES (:AGUID,:APeriod,:BBal,:BDr,:BCr,:BNet,:HTrx, :PDr,:PCr,:PNet);
END
 
CREATE PROCEDURE AR (OUT :BIID SMALLINT, IN :BName CHAR(30))
AS BEGIN
SELECT MAX(BID) + 1 INTO :BIID FROM Br;
INSERT INTO Br (BID, FName) VALUES (:BIID, :BName);
END
 
CREATE FUNCTION CalInterest (IN :principle FLOAT,
IN :period REAL, IN :rate DOUBLE)
RETURNS DOUBLE
AS BEGIN
DECLARE :interest DOUBLE;
SET :interest = ((:principle * :period * :rate) /
100);
RETURN (:interest);
END;
 
SELECT * FROM dbo.fSQLProcedures ('Demodata', null)
結果セット(スペースを考慮して短縮されています):
PROCEDURE_QUALIFIER  PROCEDURE_NAME     PROCEDURE_TYPE
===================  =================  ==============
Demodata             curs1                           1
Demodata             Enrollstudent2                  1
Demodata             AInsert                         1
Demodata             AR                              1
Demodata             CalInterest                     2
 
5 行が影響を受けました。
dbo.fSQLProcedureColumns
この関数は、入力パラメーターおよび出力パラメーターのリストと、指定されたストアド プロシージャまたはユーザー定義関数の結果セットを構成する列を返します。CREATE PROCEDURECREATE FUNCTIONも参照してください。
構文
dbo.fSQLProcedureColumns (<'database_qualifier' | null>, <'procedure_name' | null>, <'procedure_column_name' | null>)
引数
 
メモ: システム ストアド プロシージャは、PSQL Control Center に表示されない内部データベース PERVASIVESYSDB に定義されています。
返される結果セット
 
デフォルトで、Demodata サンプル データベースにはストアド プロシージャとユーザー定義関数が何も含まれていません。dbo.fSQLProcedureColumns 関数の出力を提供するために、dbo.fSQLProcedures の例で示されているストアド プロシージャとユーザー定義関数を作成してください。この例は、Demodata にストアド プロシージャ "curs1"、"Enrollstudent2"、"AInsert"、および "AR" と、ユーザー定義関数 "CalInterest" が含まれていることを前提とします。
次のステートメントは、Demodata サンプル データベース内のすべてのストアド プロシージャおよびユーザー定義関数の、すべての列に関する情報を返します。
SELECT * FROM dbo.fsqlprocedurecolumns ('Demodata', null, null)
結果セット(スペースを考慮して短縮されています):
PROCEDURE_NAME  COLUMN_NAME  COLUMN_TYPE  DATA_TYPE
==============  ===========  ===========  =========
AInsert         :AGUID                 1         -2
AInsert         :APeriod               1          4
AInsert         :BBal                  1         -6
AInsert         :BCr                   1          3
AInsert         :BDr                   1          3
AInsert         :BNet                  1          3
AInsert         :HTrx                  1         -6
AInsert         :PCr                   1          3
AInsert         :PDr                   1          3
AInsert         :PNet                  1          3
AR              :BIID                  4          5
AR              :BName                 1          1
CalInterest     :period                1          7
CalInterest     :principle             1          8
CalInterest     :rate                  1          8
CalInterest     :RETURN_VALUE          5          8
curs1           :Arg1                  1          1
curs1           :Arg2                  1          4
Enrollstudent2  :Class_Id              1          4
Enrollstudent2  :Stud_id               1          4
 
20 行が影響を受けました。
dbo.fSQLSpecialColumns
この関数は、指定されたテーブルの以下のような列情報を取得します。
テーブル内の行を一意に識別する最適な列のセット、および、トランザクションによって行内の任意の値が更新されたときに自動的に更新される列。
構文
dbo.fSQLSpecialColumns (<'database_qualifier' | null>, <'table_name' | null>, <'nullable' | null>)
引数
 
返される結果セット
 
この例では次のようなテーブルを作成します。テーブルは行を一意に識別する 2 つの列を持ち、トランザクションが行内の任意の値を更新したときにそれらの列が自動的に更新されます。
CREATE TABLE t2 (c1 IDENTITY, c2 INTEGER, c3 SMALLINT NOT NULL, c4 TIMESTAMP NOT NULL)
ALTER TABLE t2 ADD PRIMARY KEY (c1, c4)
 
SELECT * FROM dbo.fSQLSpecialColumns ('Demodata' ,'t2' , 'null')
結果セット(スペースを考慮して短縮されています):
COLUMN_NAME  DATA_TYPE  TYPE_NAME  PRECISION  LENGTH
===========  =========  =========  =========  ======
c1                   4  INTEGER            4       4
c4                  11  DATETIME          16      16
 
2 行が影響を受けました。
dbo.fSQLStatistics
この関数は、テーブルに関する統計情報の一覧と、そのテーブルに関連付けられているインデックスを 1 つの結果セットとして返します。
構文
dbo.fSQLStatistics (<'database_qualifier' | null>, <'table_name' | null>, <'unique' | null>)
引数
 
返される結果セット
 
次の例は、デフォルトの Demodata サンプル データベース中、文字 c で始まるすべてのテーブルの全インデックスに関する統計情報を返します。INDEX_NAME の NULL は除いてあります。文字列検索パターンも参照してください。
SELECT * FROM dbo.fSQLStatistics ('Demodata', 'c%', 1) WHERE INDEX_NAME IS NOT NULL
 
結果セット(スペースを考慮して短縮されています):
TABLE_NAME   INDEX_NAME          COLUMN_NAME
==========   ================    ====================
Class        UK_ID               ID
Class        Class_Name          Name
Class        Class_Name          Section
Class        Class_seg_Faculty   Faculty_ID
Class        Class_seg_Faculty   Start_Date
Class        Class_seg_Faculty   Start_Time
Class        Building_Room       Building_Name
Class        Building_Room       Room_Number
Class        Building_Room       Start_Date
Class        Building_Room       Start_Time
Course       Course_Name         Name
Course       DeptName            Dept_Name
 
12 行が影響を受けました。
dbo.fSQLTables
この関数は、データベースに格納されているテーブル、カタログ、およびスキーマ名の一覧と、テーブルの種類を結果セットとして返します。
構文
dbo.fSQLTables (<'database_qualifier' | null>, <'table_name' | null>, <['type' | null>)
引数
 
返される結果セット
 
次の例は、デフォルトの Demodata サンプル データベース中の、ユーザー テーブルおよびシステム テーブルの一覧を返します。
SELECT * FROM dbo.fSQLTables ('Demodata', null, null)
 
結果セット(スペースを考慮して短縮されています):
TABLE_NAME      TABLE_TYPE
=============   ==============
X$File          SYSTEM TABLE
X$Field         SYSTEM TABLE
X$Index         SYSTEM TABLE
X$View          SYSTEM TABLE
X$Proc          SYSTEM TABLE
X$Relate        SYSTEM TABLE
X$Trigger       SYSTEM TABLE
X$Attrib        SYSTEM TABLE
X$Occurs        SYSTEM TABLE
X$Variant       SYSTEM TABLE
Billing         TABLE
Class           TABLE
Course          TABLE
Dept            TABLE
Enrolls         TABLE
Faculty         TABLE
Person          TABLE
Room            TABLE
Student         TABLE
Tuition         TABLE
X$User          SYSTEM TABLE
X$Rights        SYSTEM TABLE
 
22 行が影響を受けました。
文字列検索パターン
以下のシステム カタログ関数は、文字列検索パターンをサポートしています。
検索パターンで 2 つのワイルドカード文字を使用できます。
次の表は、文字列検索パターンの使用例を示します。