(Parte 8 de 13)

Dois problemas com SELECT FIRST

delete from TAB1 where PK1 in (select first 10 PK1 from TAB1);

1. O comando abaixo:

apagará todos os registros da tabela. Nossa! O “sub-select” marca as primeiras 10 linhas para eliminação, apaga-as, marca as próximas 10, apaga-as, e assim sucessivamente até que não existam mais linhas disponíveis na tabela.

Cuidado!

2. Queries como esta: ... WHERE F1 IN ( SELECT FIRST 5 F2 FROM TABLE2 ORDER BY 1 DESC ) não funcionam como esperado, por causa da otimização processada atualmente pelo servidor que trata os predicados correlacionados WHERE...IN (SELECT...) em predicados correlacionados EXISTS. É óbvio que neste contexto FIRST N não faz qualquer sentido:

WHERE EXISTS ( SELECT FIRST 5 TABLE2.F2 FROM TABLE2 WHERE TABLE2.F2 = TABLE1.F1 ORDER BY 1 DESC )

Melhorias no Set de Caracteres

Adicionadas na versão 1.5

! Adicionada a “collation” WIN1251_UA (para as linguagens russa e ucraniana) ao set de caracteres WIN1251. ! Corrigido o valor padrão para Maiú/Minúsculas do WIN1251

! Adicionada a ISO_HUN (para a linguagem Húngara) ao set de caracteres ISO8859_2.

Novos sets de caracteres (“no non-binary collations”) adicionados Blas Rodriguez Somoza ! DOS737 PC Greek

! DOS775 PC Baltic

! DOS858 Variante do Cp850 com o caracter do Euro (€)

! DOS862 PC Hebrew ! DOS864 PC Arabic

! DOS866 MS-DOS Russian

! DOS869 IBM Modern Greek

! WIN1255 Windows Hebrew

! WIN1256 Windows Arabic

! WIN1257 Windows Baltic

! ISO8859_3 Latin 3 (Esperanto, Maltese, Pinyi, Sami, Croatian e outras)

! ISO8859_4 Latin 4 (Baltic, Greenlandic, Lappish)

! ISO8859_5 Cyrillic

! ISO8859_6 Arabic

! ISO8859_7 Greek

! ISO8859_8 Hebrew v.1.08 Notas da Versão Firebird 1.5 08 fevereiro 2004 Página 30

! ISO8859_9 Turkish ! ISO8859_13 Baltic

Adicionadas na versão 1.0

! Foi adicionado o “collation set” Húngaro, sem diferenciação de maiúsculas, desenvolvido e testado por Sandor Szollosi (ssani@freemail.hu).

! Nesta versão o Firebird suporta o set de caracteres ISO8859-2 (para a linguagem tcheca)

EXTENSÔES DE LINGUAGEM TRANSPORTADAS DO FIREBIRD 1..0..x

As seguintes extensões de linguagem, introduzidas no Firebird 1.0.x, são reproduzidas aqui, para sua conveniência.

Estas duas novas variáveis de contexto foram adicionadas para permitir referenciar o USER e (se implementado1) o ROLE do contexto da presente conexão.

CREATE GENERATOR GEN_USER_LOG; CREATE DOMAIN INT_64 AS NUMERIC(18,0); COMMIT; CREATE TABLE USER_LOG( LOG_ID INT_64 PRIMARY KEY NOT NULL, OP_TIMESTAMP TIMESTAMP, LOG_TABLE VARCHAR(31), LOG_TABLE_ID INT_64, LOG_OP CHAR(1), LOG_USER VARCHAR(8), LOG_ROLE VARCHAR(31));

GEN_ID(GEN_USER_LOG, 1),
CURRENT_TIMESTAMP,
'ATABLE',
NEW.ID,
'I',
CURRENT_USER,
CURRENT_ROLE);

CURRENT_USER é um sinônimo DSQL de USER que aparece no SQL standard. Eles são idênticos. Não existe qualquer vantagem de CURRENT_USER sobre USER.

1 Se você ainda estiver usando um banco de dados InterBase v.4.x ou 5.1 com o Firebird, ROLE não será suportado, assim o CURRENT_ROLE será NONE (como definido pelo standard SQL na ausência de um ROLE declarado) mesmo que o usuário informe ROLE válido. Bancos com versão IB 5.5, IB 6 ou Firebird, tem o ROLE informado e verificado. Caso o ROLE não exista, ele passará a ser tratado como NONE sem que qualquer erro ocorra.

Isto significa que no FB jamais devolverá um ROLE inválido como CURRENT_ROLE, porque o valor retornado será NONE. Este comportamento contrasta com o IB, onde o valor inválido é aceito internamente, embora não de forma visível para o SQL.

v.1.08 Notas da Versão Firebird 1.5 08 fevereiro 2004 Página 31

Permite que GENERATORs não utilizados sejam removidos da base de dados. O armazenamento será liberado para reutilização no próximo RESTORE. Acessível em SQL e DSQL.

DROP GENERATOR <nome generator>;

(1.0) GROUP BY UDF

Agora é possível agregar um SELECT por grupo pelo resultado de uma UDF. Por exemplo.

select strlen(rtrim(rdb$relation_name)), count(*) from rdb$relations group by strlen(rtrim(rdb$relation_name)) order by 2

Um efeito colateral das alterações para permitir o agrupamento por UDFs : Previamente não era permitida a utilização de funções internas do Firebird em uma cláusula GROUP BY. Agora isto é possível através da criação de uma estrutura similar a uma UDF :

select count(*) from rdb$relations r group by bin_or((select count(rdb$field_name) from rdb$relation_fields f where f.rdb$relation_name = r.rdb$relation_name),1)

Esta nova declaração DDL permite criar uma Stored Procedure com o mesmo nome de uma já existente, substituindo-a, sem que seja necessário fazer antes um DROP da mesma. A sintaxe é idêntica a CREATE PROCEDURE.

Disponível em SQL e DSQL.

Esta nova declaração DDL permite criar uma nova estrutura para uma tabela já existente, sem necessidade de que se faça antes um DROP da tabela antiga. A sintaxe é idêntica a CREATE TABLE.

Note que RECREATE TABLE não preserva os dados existentes da tabela antiga. Disponível em SQL e DSQL.

(1.0) SUBSTRING ( <express alfanumérica> FROM <pos> [FOR <tam>])

Função interna que implementa a função ANSI SQL SUBSTRING(). Irá devolver uma variável contendo o byte da posição <pos> e todos os bytes subsequentes até ao final da expressão. Se a opção FOR <tam> estiver especificada, a extensão será a menor destes dois valores: o tamanho <tam> especificado, ou o número de bytes até o final da expressão.

(Parte 8 de 13)

Comentários