以下は、入力列を受け入れ、UDT型または複合型の出力列を返すことができるJavaテーブル演算子の例です。コントラクト関数は、UDT型またはCDT型の処理方法をそれぞれ示します。
/* CREATE FUNCTION jtblop_udtvals() RETURNS TABLE VARYING USING FUNCTION jtblop_udtvals_contract LANGUAGE JAVA NO SQL PARAMETER STYLE SQLTABLE EXTERNAL NAME 'TBLOPUDT_JAR:jtblop_udtvals.execute'; */
public class jtblop_udtvals implements TableOperator { public jtblop_udtvals() {}; public int contract(RuntimeContract contract, ResultSet rsin[], ResultSet rsout[]) throws SQLException { /* Get number of input streams */ int incount = contract.getInputInfo().getIncount(); /* Get input columns. */ MetaData iCols; int total_colcount = 0; for(int i = 0; i < incount; i++) { if (rsin[i] != null) { iCols = ((TeradataResultSet)rsin[i]).getTeradataMetaData(); total_colcount += iCols.getColumnCount(); } } /* Create an equal number of output columns. */ ColumnDefinition OutCols[] = new ColumnDefinition[total_colcount]; /* Copy input columns to output columns. */ int ocount = 0; for(int j = 0; j < incount; j++) { MetaData inCols = ((TeradataResultSet)rsin[j]).getTeradataMetaData();; UDTBaseInfo udtbaseinfo[] = contract.getInputInfo().getUDTMetadata(j); for (int i=0;i<inCols.getColumnCount();i++) { OutCols[ocount]=new ColumnDefinition("O"+ocount, inCols.getTeradataColumnType(i+1)); OutCols[ocount].setDisplayLength(inCols.getColumnDisplaySize(i+1)); TeradataType t = TeradataType.get(inCols.getTeradataColumnType(i+1)); switch (t) { case VARCHAR_DT: case CHAR_DT: OutCols[ocount].setCharset(inCols.getPrecision(i+1)); break; case BLOB_REFERENCE_DT: case CLOB_REFERENCE_DT: case VARBYTE_DT: case XML_DT: case JSON_DT: case ST_GEOMETRY_DT: OutCols[ocount].setCharset(inCols.getPrecision(i+1)); OutCols[ocount].setDisplayLength(inCols.getColumnDisplaySize(i+1)); break; case DECIMAL1_DT: case DECIMAL2_DT: case DECIMAL4_DT: case DECIMAL8_DT: case DECIMAL16_DT: OutCols[ocount].setPrecision(inCols.getPrecision(i+1)); OutCols[ocount].setScale(inCols.getScale(i+1)); case NUMBER_DT: OutCols[ocount].setPrecision(inCols.getPrecision(i+1)); OutCols[ocount].setScale(inCols.getScale(i+1)); break; case TIME_DT: case TIMESTAMP_DT: case TIME_WTZ_DT: case TIMESTAMP_WTZ_DT: case PERIOD_DT: OutCols[ocount].setPrecision(inCols.getPrecision(i+1)); break; case INTERVAL_SECOND_DT: case INTERVAL_DTS_DT: case INTERVAL_HTS_DT: case INTERVAL_MTS_DT: case INTERVAL_DTM_DT: // DAY TO MINUTE OutCols[ocount].setPrecision(inCols.getPrecision(i+1)); OutCols[ocount].setScale(inCols.getScale(i+1)); break; case ARRAY_DT: case UDT_DT: case MBR_DT: case MBB_DT: OutCols[ocount].setUdtName(inCols.getUdtTypeName(i+1)); } OutCols[ocount].setPeriodType(inCols.getPeriodType(i+1)); ocount++; } } /* Define output columns. */ contract.setOutputInfo(0, OutCols); contract.complete(); return 1; } public void execute(RuntimeContract contract, ResultSet rsin[], ResultSet rsout[]) throws SQLException { /* Tblop Execute code */ } /* execute */ }