Tenho uma tabela com o seguinte:
Columns:
---
URL [nullable, e.g. "https://dba.stackexchange.com/"]
APPFK [nullable, e.g. 654654]
LINKTYPE ["Page", "Link", or "App"]
Check Constraints:
---
(URL IS NULL AND LINKTYPE <> "Link") OR (URL IS NOT NULL AND LINKTYPE = "Link")
(APPFK IS NULL AND LINKTYPE <> "App") OR (APPFK IS NOT NULL AND LINKTYPE = "App")
Como o LinkType é calculável com base na nulidade de URL e APPFK, imaginei que essa era uma oportunidade perfeita para uma coluna computada/gerada/virtual.
Então, tentei executar:
alter table MYLIB.MYTABLE
add column testcol VARCHAR(4) generated always as
(
CASE
WHEN URL IS NOT NULL THEN 'LINK'
WHEN APPFK IS NOT NULL THEN 'APP'
ELSE 'PAGE'
END
)
Annnd DB2 cuspiu isso de volta para mim:
Estado SQL: 42601 Código do fornecedor: -104 Mensagem: [SQL0104] Token (não era válido. Tokens válidos: IDENTITY. Causa . . . . . . . . . . . : Um erro de sintaxe foi detectado no token (. Token ( não é um token válido. A lista parcial de tokens válidos é IDENTITY. Esta lista pressupõe que a instrução está correta até o token. O erro pode ser anterior na instrução, mas a sintaxe da instrução parece ser válida até este ponto. Recuperação . . . : Execute um ou mais dos seguintes procedimentos e tente a solicitação novamente: -- Verifique a instrução SQL na área do token (. Corrija a instrução. O erro pode ser uma vírgula ou aspas ausentes, uma palavra incorreta ou pode estar relacionado à ordem das cláusulas -- Se o token de erro for , corrija a instrução SQL porque ela não termina com uma cláusula válida.
Tentei executar o primeiro exemplo nesta documentação do DB2 , mas deu o mesmo erro.
O que está acontecendo de errado, aqui? Estou fazendo algo errado? A documentação está errada? É apenas porque nosso DB2 está desatualizado (estamos executando a Versão 7, Revisão 1) e, em caso afirmativo, existe uma solução alternativa?
As versões do DB2 para plataformas diferentes tendem a ter recursos e detalhes de sintaxe de instrução diferentes, portanto, você deve sempre consultar a documentação para a versão e plataforma exatas do banco de dados. Se você fizer isso, verá que só pode usar uma seleção limitada de expressões para colunas geradas -- uma identidade ou um carimbo de data/hora de alteração de linha.
Em vez de uma coluna gerada, sugiro que você simplesmente crie uma visualização com sua
CASE
expressão para uma coluna extra.Qual plataforma e versão do Db2?
A documentação à qual você vinculou é para Db2 para Linux/Unix/Windows (também conhecido como LUW).
A
db2-midrange
tag é para Db2 for IBM i, cuja documentação CREATE TABLE mostra que apenas as colunas a seguir podem ser geradas.Nota: Os quatro últimos são relativamente novos e foram adicionados basicamente para suportar tabelas temporais na versão mais recente do Db2 para IBM i (7.4)
Essa última pode parecer o que você está tentando, mas cavando mais fundo, uma "expressão gerada" é uma das seguintes "expressão não-determinística"