Este apêndice explica as diferenças semânticas entre o CHAR
e VARCHAR2
tipos de base. Estas diferenças subtis mas importantes entram em jogo quando você atribuir, comparar, inserir, atualizar, selecionar ou obter valores de caracteres.
Este apêndice discute os seguintes tópicos::
atribuir os valores dos caracteres comparando os valores dos caracteres inserindo os valores dos caracteres seleccionando os valores dos caracteres
atribuindo os valores dos caracteres
quando atribuir um valor dos caracteres a umCHAR
variável, se o valor for mais curto do que o comprimento declarado da variável, PL/SQL coloca em branco o valor ao comprimento declarado. Então, a informação sobre os espaços em branco perdidos está perdida. No exemplo seguinte, o valor atribuído a last_name
inclui seis espaços em branco, não apenas um:
last_name CHAR(10) := 'CHEN '; -- note trailing blank
Se o valor do caractere é maior do que o comprimento declarado da CHAR
variável, PL/SQL, cancela a atribuição e levanta a predefinidos exceção de VALUE_ERROR
. PL / SQL nem trunca o valor nem tenta aparar espaços em branco. Por exemplo, dada a declaração
acronym CHAR(4);
o seguinte atribuição levanta VALUE_ERROR
:
acronym := 'SPCA '; -- note trailing blank
quando atribuir um valor de carácter a um VARCHAR2
variável, se o valor for inferior ao comprimento declarado da variável, PL/SQL nem espaços em branco o valor nem faixas em branco. Os valores dos caracteres são atribuídos intactos, de modo que nenhuma informação é perdida. Se o valor do caráter for maior do que o comprimento declarado do VARCHAR2
variável, PL/SQL aborta a atribuição e aumenta VALUE_ERROR
. PL / SQL nem trunca o valor nem tenta aparar espaços em branco.
comparando valores de caracteres
pode usar os operadores relacionais para comparar valores de caracteres para igualdade ou desigualdade. Comparações são baseadas na sequência de colagem usada para o conjunto de caracteres do banco de dados. Um valor de caractere é maior do que outro se o segue na sequência de colagem. Por exemplo, dadas as declarações
last_name1 VARCHAR2(10) := 'COLES';last_name2 VARCHAR2(10) := 'COLEMAN';
a seguinte condição se for verdadeira:
IF last_name1 > last_name2 THEN ...
ANSI/ISO SQL requer que dois valores de caracteres sejam comparados com comprimentos iguais. Então, se ambos os valores em uma comparação têm datatype CHAR
, semântica de preenchimento em branco são usados. Isto é, antes de comparar valores de caracteres de comprimento desigual, PL / SQL espaços em branco o valor mais curto para o comprimento do valor mais longo. Por exemplo, dadas as declarações
last_name1 CHAR(5) := 'BELLO';last_name2 CHAR(10) := 'BELLO '; -- note trailing blanks
seguinte IF
condição for verdadeira:
IF last_name1 = last_name2 THEN ...
Se um valor em uma comparação tem o tipo de dados VARCHAR2
e não em branco-preenchimento semântica são utilizados. Isto é, ao comparar valores de caracteres de comprimento desigual, PL / SQL não faz ajustes e usa os comprimentos exatos. Por exemplo, dadas as declarações
last_name1 VARCHAR2(10) := 'DOW';last_name2 VARCHAR2(10) := 'DOW '; -- note trailing blanks
seguinte IF
condição for falsa:
IF last_name1 = last_name2 THEN ...
Se um valor em uma comparação tem o tipo de dados VARCHAR2
e o outro, o valor de tipo de dados CHAR
e não em branco-preenchimento semântica são utilizados. Mas, lembre-se, quando você atribui um valor de caractere a um CHAR
variável, se o valor for menor do que o comprimento declarado da variável, PL/SQL branco-pads o valor ao comprimento declarado. Assim, tendo em conta as declarações
last_name1 VARCHAR2(10) := 'STAUB';last_name2 CHAR(10) := 'STAUB'; -- PL/SQL blank-pads value
seguinte IF
condição é falsa, pois o valor de last_name2
inclui cinco espaços em branco à direita:
IF last_name1 = last_name2 THEN ...
Todos os literais de seqüência de caracteres de ter o tipo de dados CHAR
. Então, se ambos os valores em uma comparação são literais, semântica de preenchimento em branco são usados. If one value is a literal, blank-padding semantics are used only if the other value has datatype CHAR
.
inserir os valores dos caracteres
quando inserir o valor de uma variável de caracteres PL/SQL numa coluna de base de Dados Oracle, quer o valor seja preenchido em branco ou não depende do tipo de coluna, não do tipo variável.
quando introduz um valor de carácter numa coluna de base de dados CHAR
, A Oracle não retira espaços em branco. Se o valor for menor que a largura definida da coluna, Oracle blank-pads o valor para a largura definida. Como resultado, a informação sobre os espaços em branco é perdida. Se o valor do caractere for maior que a largura definida da coluna, Oracle aborta a inserção e gera um erro.
quando introduz um valor de carácter numa coluna de base de dados VARCHAR2
, A Oracle não retira espaços em branco. Se o valor for menor que a largura definida da coluna, Oracle não preenche o valor em branco. Os valores dos caracteres são armazenados intactos, de modo que nenhuma informação é perdida. Se o valor do caractere for maior que a largura definida da coluna, Oracle aborta a inserção e gera um erro.nota: ao actualizar aplicam-se as mesmas regras.
Ao inserir os valores dos caracteres, para garantir que não são armazenados espaços em branco, use a função RTRIM
, que se sobrepõe aos espaços em branco. Segue-se um exemplo:
DECLARE ... my_name VARCHAR2(15);BEGIN ... my_ename := 'LEE '; -- note trailing blanks INSERT INTO emp VALUES (my_empno, RTRIM(my_ename), ...); -- inserts 'LEE'END;
seleccionando os valores dos caracteres
quando selecciona um valor de uma coluna de base de Dados Oracle para uma variável de caracteres PL/SQL, se o valor está em branco ou não depende do tipo de variável, não do tipo de coluna.
Quando seleccionar um valor da coluna numa variávelCHAR
variável, se o valor for mais curto do que o comprimento declarado da variável, PL/SQL coloca em branco o valor ao comprimento declarado. Como resultado, a informação sobre os espaços em branco é perdida. Se o valor do caráter for maior do que o comprimento declarado da variável, PL/SQL aborta a atribuição e aumenta VALUE_ERROR
.
Quando selecciona um valor da coluna numa variávelVARCHAR2
variável, se o valor for mais curto do que o comprimento declarado da variável, PL/SQL não cobre o valor nem elimina os espaços em branco. Os valores dos caracteres são armazenados intactos, de modo que nenhuma informação é perdida.
Por exemplo, quando selecciona uma variável ‘CHAR
‘> valor da coluna num valorVARCHAR2
variável, os espaços em branco não são despojados. Se o valor do caráter for maior do que o comprimento declarado do VARCHAR2
variável, PL/SQL aborta a atribuição e aumenta VALUE_ERROR
.Nota: as mesmas regras se aplicam ao obter.