В DB2 можно использовать ключевое слово типа LENGTH таблицы SYSCAT.COLUMNS вместе с CONCAT в сценарии SQL для удвоения длины столбцов VARCHAR. - PullRequest
0 голосов
/ 13 марта 2012

В My ниже SQL LENGTH - ключевое слово, а также имя столбца в таблице SYSCAT.COLUMNS.Как я могу исправить ниже Query.Я получаю исключение

SELECT 'ALTER TABLE ' CONCAT TABNAME CONCAT ' ALTER COLUMN ' CONCAT  COLNAME CONCAT ' SET DATA TYPE ' CONCAT TYPENAME CONCAT '('
CONCAT LENGTH CONCAT ');'
FROM SYSCAT.COLUMNS
WHERE TABSCHEMA= 'ABC' AND TYPENAME = 'VARCHAR' AND TABNAME = 'XYZ';

Исключение: -

[Error] Script lines: 1-4 --------------------------
 DB2 SQL error: SQLCODE: -440, SQLSTATE: 42884, SQLERRMC: CONCAT;FUNCTION
 Message: No authorized routine named "CONCAT" of type "FUNCTION" having compatible arguments was found.

Ответы [ 2 ]

0 голосов
/ 14 марта 2012

CONCAT (||) работает со строками. Я подозреваю, что длина не строка

Попробуйте привести их как строки (символ): символ (ДЛИНА) вместо ДЛИНЫ

Теперь ваш запрос выглядит так: ВЫБЕРИТЕ 'ALTER TABLE' CONCAT TABNAME CONCAT 'ALTER COLUMN' CONCAT COLNAME CONCAT 'SET DATA TYPE' CONCAT TYPENAME CONCAT '(' CONCAT CHAR (LENGTH) CONCAT ');' ОТ SYSCAT.COLUMNS ГДЕ TABSCHEMA = 'ABC' И TYPENAME = 'VARCHAR' И TABNAME = 'XYZ';

0 голосов
/ 13 марта 2012

В версиях DB2 для Linux, UNIX и Windows, предшествующих 9.7, DB2 применяла строгую типизацию.Поэтому вы не можете объединить VARCHAR и INTEGER без предварительного приведения INTEGER к строке.

SELECT 
    'ALTER TABLE ' CONCAT TABNAME 
    CONCAT ' ALTER COLUMN ' CONCAT  COLNAME 
    CONCAT ' SET DATA TYPE ' CONCAT TYPENAME 
    CONCAT '(' CONCAT char(LENGTH) CONCAT ');'
FROM 
    SYSCAT.COLUMNS
WHERE 
    TABSCHEMA= 'ABC' 
    AND TYPENAME = 'VARCHAR' 
    AND TABNAME = 'XYZ';

В DB2 9.7 IBM добавила неявное приведение, поэтому ваш запрос будет работать как написано.

...