Temos a tabela abaixo.
CREATE TABLE "STYLES" (
"STYLE_CODE" CHAR(8) GENERATED ALWAYS AS
("COLOR"||"FEATURE"||"SIZE"||"YEAR")
VIRTUAL NOT NULL ENABLE,
"COLOR" CHAR(2),
"FEATURE" CHAR(2),
"SIZE" CHAR(2),
"YEAR" CHAR(2),
"SEQ" CHAR(2),
CONSTRAINT "STYLE_CODE_PK" PRIMARY KEY
("STYLE_CODE") USING INDEX ENABLE
) ;
Caso o valor de STYLE_CODE PK não esteja duplicado na tabela acima, o valor SEQ é sempre gerado como 00
Se o valor de STYLE_CODE PK for duplicado, queremos que o valor SEQ seja aumentado na ordem de 01, 02.
Eu quero encontrar uma solução. Obrigado.
Os objetos de sequência não funcionam dessa maneira: eles foram criados para produzir valores únicos . Esses valores podem ter lacunas ou (em alguns casos, como no Oracle RAC) até mesmo estar fora de ordem. Você precisaria de uma sequência separada para cada STYLE_CODE possível e/ou lógica de negócios complicada com bloqueio manual de linhas que não seria bem dimensionado - e se dois usuários adicionarem novas linhas com o mesmo STYLE_CODE ao mesmo tempo? Recomende uma coluna PK separada que seja apenas um número gerado por sequência, com STYLE_CODE como atributo e (no seu caso) uma única coluna para o valor com base no tipo de dados, em vez de diferente para cada um. Além disso, sua expressão de coluna virtual STYLE_CODE não parece ser válida; deve ser uma instrução CASE, cálculo ou algo que retorne um valor derivado, não apenas uma lista de valores aceitáveis.
Se você precisar de um campo de estilo composto para fins de relatório, considere a abordagem descrita aqui: https://stackoverflow.com/questions/67914853/how-to-set-an-autoincrement-composite-primary-key-in-oracle19c e veja se ele pode ser adaptado ao seu propósito. Ele não armazena o contador dependente de campo no banco de dados, mas o gera como parte da consulta.
Como alternativa, considere manter cada tipo em uma tabela separada, cada uma com seu próprio contador e atributos apropriados.
Algumas outras palavras de conselho:
YEAR
ouSEQ
como caracteres; armazene-os sempre como números (use também um ano com 4 dígitos).