функция format_type не се поддържа от DBOS/SPU

Получавам грешка в темата, когато се опитвам да изпълня под заявката в Neteeza - Aginity

(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) 

Грешка

ERROR:  function format_type not supported on DBOS/SPU

Тази грешка се появява след добавяне на частта по-долу към заявката

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

Има ли някакво решение за това

Благодаря


person SMPH    schedule 02.10.2015    source източник


Отговори (1)


Срещате проблем с това, което се нарича „мостова заявка“, която е заявка, която препраща към системни каталожни таблици (чрез изгледи) и собствени таблици на Netezza. При тези видове заявки не е необичайно да се натъкнете на проблеми със съвместимостта на тип данни и функция.

За да не навлизам твърде дълбоко в тези плевели, ще прекъсна темата и ще кажа, че ако прибягвате до case statement за разрешаване на типа данни, можете да избегнете тези проблеми в този конкретен случай.

За CHARACTER, VARCHAR, NCHARACTER и NVARCHAR можете да извадите 12 от стойността в ATTTYPMOD, за да получите дължината на знака на колоната, както е дефинирана в 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 ;
person ScottMcG    schedule 02.10.2015
comment
Благодаря за вашия отговор. Всъщност се опитвах да сравня действителната дължина на колоната с максималната дължина на данните на колоната. Във вашето решение не мога да видя дължината на колоната. - person SMPH; 04.10.2015
comment
Изглежда, че с помощта на _V_SYS_COLUMNS таблица можете да получите дължината с COLUMN_SIZE . Получавам същата грешка, когато се опитвам да извлека TYPE_NAME , което има както тип данни, така и дължина - person SMPH; 04.10.2015
comment
Търсите ли конкретни размери на колони char/varchar? - person ScottMcG; 04.10.2015
comment
Най-вече да, защото около тези типове може да възникне съкращаване - person SMPH; 04.10.2015
comment
Само за character/ncharacter/varchar/nvarchar изчислявате размера чрез препратка ATTTYPMOD и изваждане на 12. Ще променя кода, за да покажа този пример. Надявам се това да помогне. - person ScottMcG; 05.10.2015