Update Function GET_DESCRIPTOR
This commit is contained in:
@@ -1 +1,305 @@
|
||||
牄禗袬蒨@\蚕謨@^@
|
||||
SET PATH *LIBL ;
|
||||
|
||||
CREATE OR REPLACE FUNCTION CISTOOLS.GET_DESCRIPTOR (
|
||||
SQLSTMT VARCHAR(32000) )
|
||||
RETURNS TABLE (
|
||||
COLUMNCARDINALITY BIGINT ,
|
||||
DATETIMECODE INTEGER ,
|
||||
BASEDBNAME VARCHAR(128) ,
|
||||
BASECOLUMNNAME VARCHAR(128) ,
|
||||
BASELIBRARYNAME VARCHAR(128) ,
|
||||
BASETABLENAME VARCHAR(128) ,
|
||||
COLUMNCCSID INTEGER ,
|
||||
COLUMNDBNAME VARCHAR(128) ,
|
||||
COLUMNGENERATED INTEGER ,
|
||||
COLUMNGENERATIONTYPE INTEGER ,
|
||||
COLUMNHIDDEN INTEGER ,
|
||||
COLUMNNAME VARCHAR(128) ,
|
||||
COLUMNROWCHANGE INTEGER ,
|
||||
COLUMNLIBNAME VARCHAR(128) ,
|
||||
COLUMNTBLNAME VARCHAR(128) ,
|
||||
COLUMNALLOWUPDATE INTEGER ,
|
||||
CORRELATIONNAME VARCHAR(128) ,
|
||||
CURSORNAME VARCHAR(128) ,
|
||||
COLUMNLABEL VARCHAR(60) ,
|
||||
PARAMNAME VARCHAR(128) ,
|
||||
RESULTSETROW BIGINT ,
|
||||
SYSTEMCOLUMNNAME CHAR(10) ,
|
||||
KEYMEMBER INTEGER ,
|
||||
COLUMNLENGTH INTEGER ,
|
||||
COLUMNLEVEL INTEGER ,
|
||||
OBJECTNAME VARCHAR(128) ,
|
||||
ISNULLABLE INTEGER ,
|
||||
OCTETLENGTH INTEGER ,
|
||||
PARAMMODE INTEGER ,
|
||||
PARAMORDPOS INTEGER ,
|
||||
ORDINALPOS INTEGER ,
|
||||
PARAMSPECIFICDB VARCHAR(128) ,
|
||||
PARAMSPECIFICTABLE VARCHAR(128) ,
|
||||
PARAMSPECIFICLIB VARCHAR(128) ,
|
||||
PRECISION INTEGER ,
|
||||
RETURNARRAYSIZE INTEGER ,
|
||||
RETURNLENGTH INTEGER ,
|
||||
RETURNOCTETLENGTH INTEGER ,
|
||||
SCALE INTEGER ,
|
||||
DATATYPE INTEGER ,
|
||||
SQLTYPE VARCHAR(128) ,
|
||||
ISUNNAMED INTEGER ,
|
||||
UDTCATALOG VARCHAR(128) ,
|
||||
UDTNAME VARCHAR(128) ,
|
||||
UDTSCHEMA VARCHAR(128) ,
|
||||
UDTCODE VARCHAR(128) )
|
||||
LANGUAGE SQL
|
||||
SPECIFIC CISTOOLS.GET_DESCRIPTOR
|
||||
NOT DETERMINISTIC
|
||||
READS SQL DATA
|
||||
CALLED ON NULL INPUT
|
||||
NO EXTERNAL ACTION
|
||||
CONCURRENT ACCESS RESOLUTION DEFAULT
|
||||
SET OPTION ALWBLK = *ALLREAD ,
|
||||
ALWCPYDTA = *OPTIMIZE ,
|
||||
COMMIT = *NONE ,
|
||||
DBGVIEW = *SOURCE ,
|
||||
DECRESULT = (31, 31, 00) ,
|
||||
DYNDFTCOL = *NO ,
|
||||
DYNUSRPRF = *OWNER ,
|
||||
OPTLOB = *YES ,
|
||||
SQLCURRULE = *STD ,
|
||||
SRTSEQ = *HEX
|
||||
BEGIN
|
||||
DECLARE STMTHANDLE BIGINT ;
|
||||
DECLARE DESCHANDLE VARCHAR ( 128 ) ;
|
||||
DECLARE VCARDINALITY BIGINT DEFAULT 0 ;
|
||||
DECLARE VDATETIMECODE INTEGER DEFAULT 0 ;
|
||||
DECLARE VBASEDBNAME VARCHAR ( 128 ) DEFAULT ' ' ;
|
||||
DECLARE VBASECOLUMNNAME VARCHAR ( 128 ) DEFAULT ' ' ;
|
||||
DECLARE VBASELIBRARYNAME VARCHAR ( 128 ) DEFAULT ' ' ;
|
||||
DECLARE VBASETABLENAME VARCHAR ( 128 ) DEFAULT ' ' ;
|
||||
DECLARE VCCSID INTEGER DEFAULT 0 ;
|
||||
DECLARE VCOLUMNDBNAME VARCHAR ( 128 ) DEFAULT ' ' ;
|
||||
DECLARE VCOLUMNGENERATED INTEGER DEFAULT 0 ;
|
||||
DECLARE VCOLUMNGENERATIONTYPE INTEGER DEFAULT 0 ;
|
||||
DECLARE VCOLUMNHIDDEN INTEGER DEFAULT 0 ;
|
||||
DECLARE VCOLUMNNAME VARCHAR ( 128 ) DEFAULT ' ' ;
|
||||
DECLARE VCOLUMNROWCHANGE INTEGER DEFAULT 0 ;
|
||||
DECLARE VCOLUMNLIBNAME VARCHAR ( 128 ) DEFAULT ' ' ;
|
||||
DECLARE VCOLUMNTBLNAME VARCHAR ( 128 ) DEFAULT ' ' ;
|
||||
DECLARE VCOLUMNALLOWUPDATE INTEGER DEFAULT 0 ;
|
||||
DECLARE VCORRELATIONNAME VARCHAR ( 128 ) DEFAULT ' ' ;
|
||||
DECLARE VCURSORNAME VARCHAR ( 128 ) DEFAULT ' ' ;
|
||||
DECLARE VLABEL VARCHAR ( 60 ) DEFAULT ' ' ;
|
||||
DECLARE VPARAMNAME VARCHAR ( 128 ) DEFAULT ' ' ;
|
||||
DECLARE VRESULTSETROW BIGINT DEFAULT 0 ;
|
||||
DECLARE VSYSTEMCOLUMNNAME CHAR ( 10 ) DEFAULT ' ' ;
|
||||
DECLARE VKEYMEMBER INTEGER DEFAULT 0 ;
|
||||
DECLARE VLENGTH INTEGER DEFAULT 0 ;
|
||||
DECLARE VLEVEL INTEGER DEFAULT 0 ;
|
||||
DECLARE VOBJECTNAME VARCHAR ( 128 ) DEFAULT ' ' ;
|
||||
DECLARE VISNULLABLE INTEGER DEFAULT 0 ;
|
||||
DECLARE VOCTETLENGTH INTEGER DEFAULT 0 ;
|
||||
DECLARE VPARAMMODE INTEGER DEFAULT 0 ;
|
||||
DECLARE VPARAMORDPOS INTEGER DEFAULT 0 ;
|
||||
DECLARE VORDINALPOS INTEGER DEFAULT 0 ;
|
||||
DECLARE VPARAMSPECIFICDB VARCHAR ( 128 ) DEFAULT ' ' ;
|
||||
DECLARE VPARAMSPECIFICTABLE VARCHAR ( 128 ) DEFAULT ' ' ;
|
||||
DECLARE VPARAMSPECIFICLIB VARCHAR ( 128 ) DEFAULT ' ' ;
|
||||
DECLARE VPRECISION INTEGER DEFAULT 0 ;
|
||||
DECLARE VRETURNARRAYSIZE INTEGER DEFAULT 0 ;
|
||||
DECLARE VRETURNLENGTH INTEGER DEFAULT 0 ;
|
||||
DECLARE VRETURNOCTETLENGTH INTEGER DEFAULT 0 ;
|
||||
DECLARE VSCALE INTEGER DEFAULT 0 ;
|
||||
DECLARE VDATATYPE INTEGER DEFAULT 0 ;
|
||||
DECLARE VSQLTYPE VARCHAR ( 128 ) DEFAULT ' ' ;
|
||||
DECLARE VISUNNAMED INTEGER DEFAULT 0 ;
|
||||
DECLARE VUDTCATALOG VARCHAR ( 128 ) DEFAULT ' ' ;
|
||||
DECLARE VUDTNAME VARCHAR ( 128 ) DEFAULT ' ' ;
|
||||
DECLARE VUDTSCHEMA VARCHAR ( 128 ) DEFAULT ' ' ;
|
||||
DECLARE VUDTCODE VARCHAR ( 128 ) DEFAULT ' ' ;
|
||||
DECLARE I INTEGER DEFAULT 1 ;
|
||||
DECLARE TOKEN VARCHAR ( 128 ) DEFAULT ' ' ;
|
||||
DECLARE RTNSQLCODE INT ;
|
||||
DECLARE COLCOUNT INTEGER ;
|
||||
DECLARE SQLCODE INTEGER DEFAULT 0 ;
|
||||
DECLARE SQLSTATE CHAR ( 5 ) DEFAULT '00000' ;
|
||||
DECLARE CONTINUE HANDLER FOR SQLSTATE '22501' , SQLSTATE '33000'
|
||||
BEGIN
|
||||
DEALLOCATE DESCRIPTOR LOCAL DESCHANDLE ;
|
||||
GET DIAGNOSTICS CONDITION 1 TOKEN = DB2_ORDINAL_TOKEN_2 ;
|
||||
SET COLCOUNT = TOKEN ;
|
||||
ALLOCATE DESCRIPTOR LOCAL DESCHANDLE WITH MAX COLCOUNT ;
|
||||
DESCRIBE STMTHANDLE USING DESCRIPTOR LOCAL DESCHANDLE ;
|
||||
SET I = 1 ;
|
||||
END ;
|
||||
SET DESCHANDLE = 'Descr' || HEX ( GENERATE_UNIQUE ( ) ) ;
|
||||
PREPARE STMTHANDLE FROM SQLSTMT ;
|
||||
ALLOCATE DESCRIPTOR LOCAL DESCHANDLE WITH MAX 1024 ;
|
||||
DESCRIBE STMTHANDLE USING DESCRIPTOR LOCAL DESCHANDLE ;
|
||||
GET DESCRIPTOR LOCAL DESCHANDLE COLCOUNT = COUNT ;
|
||||
WHILE I <= COLCOUNT DO
|
||||
GET DESCRIPTOR LOCAL DESCHANDLE
|
||||
VALUE I
|
||||
VCARDINALITY = CARDINALITY ,
|
||||
VDATETIMECODE = DATETIME_INTERVAL_CODE ,
|
||||
VBASEDBNAME = DB2_BASE_CATALOG_NAME ,
|
||||
VBASECOLUMNNAME = DB2_BASE_COLUMN_NAME ,
|
||||
VBASELIBRARYNAME = DB2_BASE_SCHEMA_NAME ,
|
||||
VBASETABLENAME = DB2_BASE_TABLE_NAME , VCCSID = DB2_CCSID ,
|
||||
VCOLUMNDBNAME = DB2_COLUMN_CATALOG_NAME ,
|
||||
VCOLUMNGENERATED = DB2_COLUMN_GENERATED ,
|
||||
VCOLUMNGENERATIONTYPE = DB2_COLUMN_GENERATION_TYPE ,
|
||||
VCOLUMNHIDDEN = DB2_COLUMN_HIDDEN ,
|
||||
VCOLUMNNAME = DB2_COLUMN_NAME ,
|
||||
VCOLUMNROWCHANGE = DB2_COLUMN_ROW_CHANGE ,
|
||||
VCOLUMNLIBNAME = DB2_COLUMN_SCHEMA_NAME ,
|
||||
VCOLUMNTBLNAME = DB2_COLUMN_TABLE_NAME ,
|
||||
VCOLUMNALLOWUPDATE = DB2_COLUMN_UPDATABILITY ,
|
||||
VCORRELATIONNAME = DB2_CORRELATION_NAME ,
|
||||
VCURSORNAME = DB2_CURSOR_NAME , VLABEL = DB2_LABEL ,
|
||||
VPARAMNAME = DB2_PARAMETER_NAME ,
|
||||
VRESULTSETROW = DB2_RESULT_SET_ROWS ,
|
||||
VSYSTEMCOLUMNNAME = DB2_SYSTEM_COLUMN_NAME ,
|
||||
VKEYMEMBER = KEY_MEMBER , VLENGTH = LENGTH , VLEVEL = LEVEL ,
|
||||
VOBJECTNAME = NAME , VISNULLABLE = NULLABLE ,
|
||||
VOCTETLENGTH = OCTET_LENGTH , VPARAMMODE = PARAMETER_MODE ,
|
||||
VPARAMORDPOS = PARAMETER_ORDINAL_POSITION ,
|
||||
VPARAMSPECIFICDB = PARAMETER_SPECIFIC_CATALOG ,
|
||||
VPARAMSPECIFICTABLE = PARAMETER_SPECIFIC_NAME ,
|
||||
VPARAMSPECIFICLIB = PARAMETER_SPECIFIC_SCHEMA ,
|
||||
VPRECISION = PRECISION ,
|
||||
VRETURNARRAYSIZE = RETURNED_CARDINALITY ,
|
||||
VRETURNLENGTH = RETURNED_LENGTH ,
|
||||
VRETURNOCTETLENGTH = RETURNED_OCTET_LENGTH , VSCALE = SCALE ,
|
||||
VDATATYPE = TYPE , VISUNNAMED = UNNAMED ,
|
||||
VUDTCATALOG = USER_DEFINED_TYPE_CATALOG ,
|
||||
VUDTNAME = USER_DEFINED_TYPE_NAME ,
|
||||
VUDTSCHEMA = USER_DEFINED_TYPE_SCHEMA ,
|
||||
VUDTCODE = USER_DEFINED_TYPE_CODE ;
|
||||
SET VLABEL = CISTOOLS . STRIP_SPACES ( VLABEL ) ;
|
||||
SET VORDINALPOS = I ;
|
||||
-- This code block maps data types to their equivalent SQL types
|
||||
-- Standardize variable names
|
||||
IF VDATATYPE = 5 THEN
|
||||
SET VSQLTYPE = 'SQL_SMALLINT' ;
|
||||
SET VLENGTH = 2 ;
|
||||
SET VOCTETLENGTH = 2 ;
|
||||
ELSEIF VDATATYPE = 4 THEN
|
||||
SET VSQLTYPE = 'SQL_INTEGER' ;
|
||||
SET VLENGTH = 4 ;
|
||||
SET VOCTETLENGTH = 4 ;
|
||||
ELSEIF VDATATYPE = 25 THEN
|
||||
SET VSQLTYPE = 'SQL_BIGINT' ;
|
||||
SET VLENGTH = 8 ;
|
||||
SET VOCTETLENGTH = 8 ;
|
||||
ELSEIF VDATATYPE = 3 THEN
|
||||
SET VSQLTYPE = 'SQL_DECIMAL' ;
|
||||
SET VLENGTH = ( VPRECISION / 2 ) + 1 ;
|
||||
SET VOCTETLENGTH = ( VPRECISION / 2 ) + 1 ;
|
||||
ELSEIF VDATATYPE = 2 THEN
|
||||
SET VSQLTYPE = 'SQL_NUMERIC' ;
|
||||
ELSEIF VDATATYPE = 7 THEN
|
||||
SET VSQLTYPE = 'SQL_REAL' ;
|
||||
SET VLENGTH = 4 ;
|
||||
SET VOCTETLENGTH = 4 ;
|
||||
ELSEIF VDATATYPE = 8 THEN
|
||||
SET VSQLTYPE = 'SQL_DECFLOAT' ;
|
||||
SET VLENGTH = 8 ;
|
||||
SET VOCTETLENGTH = 8 ;
|
||||
ELSEIF VDATATYPE = - 360 THEN
|
||||
SET VSQLTYPE = 'SQL_DECFLOAT' ;
|
||||
ELSEIF VDATATYPE = 1 THEN
|
||||
SET VSQLTYPE = 'SQL_CHARACTER' ;
|
||||
ELSEIF VDATATYPE = 12 THEN
|
||||
SET VSQLTYPE = 'SQL_VARCHAR' ;
|
||||
ELSEIF VDATATYPE = 40 THEN
|
||||
SET VSQLTYPE = 'SQL_CLOB' ;
|
||||
ELSEIF VDATATYPE = - 95 THEN
|
||||
SET VSQLTYPE = 'SQL_GRAPHIC' ;
|
||||
SET VOCTETLENGTH = VLENGTH * 2 ;
|
||||
ELSEIF VDATATYPE = - 96 THEN
|
||||
SET VSQLTYPE = 'SQL_VARGRAPHIC' ;
|
||||
SET VOCTETLENGTH = VLENGTH * 2 ;
|
||||
ELSEIF VDATATYPE = - 350 THEN
|
||||
SET VSQLTYPE = 'SQL_DBCLOB' ;
|
||||
SET VOCTETLENGTH = VLENGTH * 2 ;
|
||||
ELSEIF VDATATYPE = - 2 THEN
|
||||
SET VSQLTYPE = 'SQL_BINARY' ;
|
||||
ELSEIF VDATATYPE = - 3 THEN
|
||||
SET VSQLTYPE = 'SQL_VARBINARY' ;
|
||||
ELSEIF VDATATYPE = 30 THEN
|
||||
SET VSQLTYPE = 'SQL_BLOB' ;
|
||||
ELSEIF VDATATYPE = 9 THEN
|
||||
IF VDATETIMECODE = 1 THEN
|
||||
SET VSQLTYPE = 'SQL_DATE' ;
|
||||
SET VLENGTH = 10 ;
|
||||
SET VOCTETLENGTH = 10 ;
|
||||
ELSEIF VDATETIMECODE = 2 THEN
|
||||
SET VSQLTYPE = 'SQL_TIME' ;
|
||||
SET VLENGTH = 8 ;
|
||||
SET VOCTETLENGTH = 8 ;
|
||||
ELSEIF VDATETIMECODE = 3 THEN
|
||||
SET VSQLTYPE = 'SQL_TIMESTAMP' ;
|
||||
SET VLENGTH = 26 ;
|
||||
SET VOCTETLENGTH = 26 ;
|
||||
END IF ;
|
||||
ELSEIF VDATATYPE = 70 THEN
|
||||
SET VSQLTYPE = 'SQL_DATALINK' ;
|
||||
ELSEIF VDATATYPE = - 904 THEN
|
||||
SET VSQLTYPE = 'SQL_ROWID' ;
|
||||
ELSEIF VDATATYPE = 137 THEN
|
||||
SET VSQLTYPE = 'SQL_XML' ;
|
||||
ELSEIF VDATATYPE = - 400 THEN
|
||||
SET VSQLTYPE = 'SQL_GRAPHIC' ;
|
||||
SET VOCTETLENGTH = VLENGTH * 2 ;
|
||||
ELSEIF VDATATYPE = - 916 THEN
|
||||
SET VSQL_TYPE = 'SQL_BLOB' ;
|
||||
SET VLENGTH = 267 ;
|
||||
SET VOCTETLENGTH = 267 ;
|
||||
ELSEIF VDATATYPE = - 920 THEN
|
||||
SET VSQL_TYPE = 'SQL_CLOB' ;
|
||||
SET VLENGTH = 267 ;
|
||||
SET VOCTETLENGTH = 267 ;
|
||||
ELSEIF VDATATYPE = - 924 THEN
|
||||
SET VSQL_TYPE = 'SQL_DBCLOB' ;
|
||||
SET VLENGTH = 267 ;
|
||||
SET VOCTETLENGTH = 267 ;
|
||||
ELSEIF VDATATYPE = - 972 THEN
|
||||
SET VSQL_TYPE = 'SQL_RESULT_SET_LOCATOR' ;
|
||||
SET VLENGTH = 8 ;
|
||||
SET VOCTETLENGTH = 8 ;
|
||||
ELSE
|
||||
SET VSQLTYPE = 'UNKNOWN TYPE' ;
|
||||
END IF ;
|
||||
PIPE (
|
||||
VCARDINALITY ,
|
||||
VDATETIMECODE , VBASEDBNAME , VBASECOLUMNNAME , VBASELIBRARYNAME ,
|
||||
VBASETABLENAME , VCCSID , VCOLUMNDBNAME , VCOLUMNGENERATED ,
|
||||
VCOLUMNGENERATIONTYPE , VCOLUMNHIDDEN , VCOLUMNNAME ,
|
||||
VCOLUMNROWCHANGE , VCOLUMNLIBNAME , VCOLUMNTBLNAME ,
|
||||
VCOLUMNALLOWUPDATE , VCORRELATIONNAME , VCURSORNAME , VLABEL ,
|
||||
VPARAMNAME , VRESULTSETROW , VSYSTEMCOLUMNNAME , VKEYMEMBER ,
|
||||
VLENGTH , VLEVEL , VOBJECTNAME , VISNULLABLE , VOCTETLENGTH ,
|
||||
VPARAMMODE , VPARAMORDPOS , VORDINALPOS , VPARAMSPECIFICDB ,
|
||||
VPARAMSPECIFICTABLE , VPARAMSPECIFICLIB , VPRECISION ,
|
||||
VRETURNARRAYSIZE , VRETURNLENGTH , VRETURNOCTETLENGTH , VSCALE ,
|
||||
VDATATYPE , VSQLTYPE , VISUNNAMED , VUDTCATALOG , VUDTNAME ,
|
||||
VUDTSCHEMA , VUDTCODE ) ;
|
||||
SET I = I + 1 ;
|
||||
END WHILE ;
|
||||
DEALLOCATE DESCRIPTOR LOCAL DESCHANDLE ;
|
||||
RETURN ;
|
||||
END ;
|
||||
|
||||
COMMENT ON PARAMETER SPECIFIC FUNCTION CISTOOLS.GET_DESCRIPTOR
|
||||
( SQLSTMT IS 'SQL Statement' ) ;
|
||||
|
||||
LABEL ON SPECIFIC FUNCTION CISTOOLS.GET_DESCRIPTOR
|
||||
IS 'Get Descriptor' ;
|
||||
|
||||
GRANT ALTER , EXECUTE
|
||||
ON SPECIFIC FUNCTION CISTOOLS.GET_DESCRIPTOR
|
||||
TO AMAPICS WITH GRANT OPTION ;
|
||||
|
||||
GRANT EXECUTE
|
||||
ON SPECIFIC FUNCTION CISTOOLS.GET_DESCRIPTOR
|
||||
TO PUBLIC ;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user