2015-10-02 2 views
0

Je reçois l'erreur sujet lors de la tentative d'exécution ci-dessous requête dans Neteeza - Aginityfonction format_type pas pris en charge sur DBOS/SPU

(SELECT 'TABLE1' AS TABLE_NAME, 'CHANGE_BY_CD' AS COL,(SELECT DATA_TYPE 
FROM information_schema.columns WHERE table_name = 'TABLE1' 
AND COLUMN_NAME = 'CHANGE_BY_CD') AS COL_LEN, MAX(LENGTH(CHANGE_BY_CD)) AS MAX_LEN, CHANGE_BY_CD::CHARACTER VARYING(2000) AS VAL FROM SCHEMA1.A_TABLE1 
WHERE CHANGE_BY_CD IS NOT NULL GROUP BY CHANGE_BY_CD ORDER BY MAX_LEN DESC , CHANGE_BY_CD DESC LIMIT 1) 

Erreur

ERROR: function format_type not supported on DBOS/SPU 

Cette erreur apparaît après avoir ajouté ci-dessous partie la requête

(SELECT DATA_TYPE 
FROM information_schema.columns WHERE table_name = 'TABLE1' 
AND COLUMN_NAME = 'CHANGE_BY_CD') AS COL_LEN 

y at-il une solution à ce

Merci

Répondre

1

Vous rencontrez un problème avec ce que l'on appelle une "requête de pont", qui est une requête qui référence des tables de catalogue système (via des vues) et des tables Netezza natives. Dans ces sortes de requêtes, il n'est pas rare de rencontrer un problème de type de données et de compatibilité de fonction. Pour ne pas aller trop loin dans ces mauvaises herbes, je vais aller droit au but et dire que si vous avez recours à une déclaration de cas pour résoudre le type de données, vous pouvez éviter ces problèmes dans ce cas particulier. Pour CHARACTER, VARCHAR, NCHARACTER et NVARCHAR, vous pouvez soustraire 12 de la valeur de ATTTYPMOD pour obtenir la longueur de caractère de la colonne définie dans le DDL.

SELECT 'TABLE1' AS TABLE_NAME, 
    'CHANGE_BY_CD' AS COL, 
    (
     SELECT data_type 
     FROM (
      SELECT objname, 
       attname, 
       atttypid, 
       ATT.ATTTYPMOD, 
       CASE 
        WHEN atttypid=23 THEN 'INTEGER' 
        WHEN atttypid=16 THEN 'BOOLEAN' 
        WHEN atttypid=17 THEN 'BYTEA' 
        WHEN atttypid=18 THEN 'CHAR' 
        WHEN atttypid=19 THEN 'NAME' 
        WHEN atttypid=20 THEN 'BIGINT' 
        WHEN atttypid=21 THEN 'SNALLINT' 
        WHEN atttypid=22 THEN 'INT2VECTOR' 
        WHEN atttypid=24 THEN 'REGPROC' 
        WHEN atttypid=25 THEN 'TEXT' 
        WHEN atttypid=26 THEN 'OID' 
        WHEN atttypid=27 THEN 'TID' 
        WHEN atttypid=28 THEN 'XID' 
        WHEN atttypid=29 THEN 'CID' 
        WHEN atttypid=30 THEN 'OIDVECTOR' 
        WHEN atttypid=210 THEN 'SMGR' 
        WHEN atttypid=700 THEN 'REAL' 
        WHEN atttypid=701 THEN 'DOUBLE' 
        WHEN atttypid=702 THEN 'ABSTIME' 
        WHEN atttypid=705 THEN 'UNKNOWN' 
        WHEN atttypid=1007 THEN '_INTEGER' 
        WHEN atttypid=1033 THEN 'ACLITEM' 
        WHEN atttypid=1034 THEN '_ACLITEM' 
        WHEN atttypid=1042 THEN 'CHARACTER(' || atttypmod -12 || ')' 
        WHEN atttypid=1043 THEN 'VARCHAR(' || atttypmod -12 || ')' 
        WHEN atttypid=1082 THEN 'DATE' 
        WHEN atttypid=1083 THEN 'TIME' 
        WHEN atttypid=1184 THEN 'TIMESTAMP' 
        WHEN atttypid=1266 THEN 'TIMETZ' 
        WHEN atttypid=1700 THEN 'NUMERIC' 
        WHEN atttypid=2500 THEN 'BYTEINT' 
        WHEN atttypid=2569 THEN 'NUCL' 
        WHEN atttypid=2570 THEN 'PROT' 
        WHEN atttypid=2522 THEN 'NCHAR(' || atttypmod -12 || ')' 
        WHEN atttypid=2530 THEN 'NVARCHAR(' || atttypmod -12 || ')' 
        WHEN atttypid=278 THEN 'NTEXT' 
       END DATA_TYPE 
      FROM DEFINITION_SCHEMA."_V_OBJ_RELATION" 
       JOIN DEFINITION_SCHEMA."_V_ATTRIBUTE" ATT 
       ON ATT.ATTRELID = DEFINITION_SCHEMA."_V_OBJ_RELATION".RELOID 
       LEFT JOIN DEFINITION_SCHEMA."_T_ATTRDEF" 
       ON (
        ATT.ATTRELID = DEFINITION_SCHEMA."_T_ATTRDEF".ADRELID 
        AND ATT.ATTNUM = DEFINITION_SCHEMA."_T_ATTRDEF".ADNUM 
       ) 
      WHERE (
        ATT.ATTNUM        > 0 
       AND SUBSTR("NVARCHAR"(ATT.ATTNAME), 1, 1) <> '_'::"NVARCHAR" 
       AND OBJTYPE        ='TABLE' 
       ) 
     ) 
     foo 
     WHERE foo.objname = 'TABLE_1' 
     AND foo.ATTNAME = 'CHANGE_BY_CD' 
    ) 
             AS COL_LEN, 
    MAX(LENGTH(CHANGE_BY_CD))   AS MAX_LEN, 
    CHANGE_BY_CD::CHARACTER VARYING(2000) AS VAL 
FROM TABLE1 
WHERE CHANGE_BY_CD IS NOT NULL 
GROUP BY CHANGE_BY_CD 
ORDER BY MAX_LEN DESC , 
    CHANGE_BY_CD DESC LIMIT 1 ; 
+0

Merci pour votre réponse. J'essayais en fait de comparer la longueur réelle de la colonne avec la longueur maximale de la colonne. Dans votre solution, je ne peux pas voir la longueur de la colonne. – SMPH

+0

On dirait qu'en utilisant la table '_V_SYS_COLUMNS' on peut obtenir la longueur avec 'COLUMN_SIZE'. Je reçois la même erreur lorsque j'essaie de récupérer "TYPE_NAME" qui a à la fois le type de données et la longueur – SMPH

+0

Cherchez-vous des tailles de colonnes char/varchar en particulier? – ScottMcG