データ・タイプとデータ変換に定義されている SQL データ・タイプ (基本 SQL データ・タイプといいます) に加えて、新しい特殊タイプ (distinct type) をユーザー側で定義することもできます。これらのユーザー定義タイプ (UDT) は、内部表記を既存のタイプと共用しますが、既存タイプとは独立していて、ほとんどの操作で互換性のないタイプであるとみなされます。この UDT は、CREATE DISTINCT TYPE SQL ステートメントを使用して作成します。
UDT は、オブジェクト指向プログラミングで必要な強力型指定制御を行うのに役立ち、特殊タイプで明示定義された関数や演算子だけをそのインスタンスに確実に適用できるようにします。アプリケーションは、アプリケーション変数については引き続き C データ型で処理するので、 SQL ステートメントを組み立てる場合に限り UDT タイプを考慮する必要があります。
これは次のことを意味します。
ユーザー定義タイプ (UDT) の詳細な規則と説明については、 SQL 解説書 を参照してください。
この例では、複数の UDT および UDF が定義されていることを示し、 UDT 列がある複数の表も示します。 UDT 列のある表へ行を挿入する例については、配列の入力例を参照してください。
/* ... */ /* Initialize SQL statement strings */ SQLCHAR * stmt[] = { "CREATE DISTINCT TYPE CNUM AS INTEGER WITH COMPARISONS", "CREATE DISTINCT TYPE PUNIT AS CHAR(2) WITH COMPARISONS", "CREATE DISTINCT TYPE UPRICE AS DECIMAL(10, 2) " "WITH COMPARISONS", "CREATE DISTINCT TYPE PRICE AS DECIMAL(10, 2) " "WITH COMPARISONS", "CREATE FUNCTION PRICE( CHAR(12), PUNIT, char(16) ) " "returns char(12) " "NOT FENCED EXTERNAL NAME 'order!price' " "NOT VARIANT NO SQL LANGUAGE C PARAMETER STYLE DB2SQL " "NO EXTERNAL ACTION", "CREATE DISTINCT TYPE PNUM AS INTEGER WITH COMPARISONS", "CREATE FUNCTION \"+\"(PNUM, INTEGER) RETURNS PNUM " "source sysibm.\"+\"(integer, integer)", "CREATE FUNCTION MAX(PNUM) RETURNS PNUM " "source max(integer)", "CREATE DISTINCT TYPE ONUM AS INTEGER WITH COMPARISONS", "CREATE TABLE CUSTOMER ( " "Cust_Num CNUM NOT NULL, " "First_Name CHAR(30) NOT NULL, " "Last_Name CHAR(30) NOT NULL, " "Street CHAR(128) WITH DEFAULT, " "City CHAR(30) WITH DEFAULT, " "Prov_State CHAR(30) WITH DEFAULT, " "PZ_Code CHAR(9) WITH DEFAULT, " "Country CHAR(30) WITH DEFAULT, " "Phone_Num CHAR(20) WITH DEFAULT, " "PRIMARY KEY (Cust_Num) )", "CREATE TABLE PRODUCT ( " "Prod_Num PNUM NOT NULL, " "Description VARCHAR(256) NOT NULL, " "Price DECIMAL(10,2) WITH DEFAULT , " "Units PUNIT NOT NULL, " "Combo CHAR(1) WITH DEFAULT, " "PRIMARY KEY (Prod_Num), " "CHECK (Units in (PUNIT('m'), PUNIT('l'), PUNIT('g'), PUNIT('kg'), " "PUNIT(' '))) )", "CREATE TABLE PROD_PARTS ( " "Prod_Num PNUM NOT NULL, " "Part_Num PNUM NOT NULL, " "Quantity DECIMAL(14,7), " "PRIMARY KEY (Prod_Num, Part_Num), " "FOREIGN KEY (Prod_Num) REFERENCES Product, " "FOREIGN KEY (Part_Num) REFERENCES Product, " "CHECK (Prod_Num <> Part_Num) )", "CREATE TABLE ORD_CUST ( " "Ord_Num ONUM NOT NULL, " "Cust_Num CNUM NOT NULL, " "Ord_Date DATE NOT NULL, " "PRIMARY KEY (Ord_Num), " "FOREIGN KEY (Cust_Num) REFERENCES Customer )", "CREATE TABLE ORD_LINE ( " "Ord_Num ONUM NOT NULL, " "Prod_Num PNUM NOT NULL, " "Quantity DECIMAL(14,7), " "PRIMARY KEY (Ord_Num, Prod_Num), " "FOREIGN KEY (Prod_Num) REFERENCES Product, " "FOREIGN KEY (Ord_Num) REFERENCES Ord_Cust )", ( char * ) 0, } ; /* ... */ /* Execute Direct statements */ i = 0 ; while ( stmt[i] != ( char * ) 0 ) { printf( ">Executing Statement %ld\n", ( i + 1 ) ) ; rc = SQLExecDirect( hstmt, stmt[i], SQL_NTS ) ; CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc ) ; i++ ; }