Os par??metros din??micos podem ser utilizados em qualquer lugar da express??o
onde seu tipo de dado pode ser facilmente deduzido.
- ?? permitido o uso como primeiro operando do BETWEEN, se o segundo ou o
terceiro operando n??o for um par??metro din??mico.
O tipo de dado do primeiro operando ?? assumido como sendo o tipo de dado do
par??metro que n??o ?? din??mico, ou o resultado da uni??o dos tipos do segundo e do
terceiro operandos, se estes dois n??o forem par??metros din??micos.
WHERE ? BETWEEN DATE('1996-01-01') AND ?
-- tipos assumidos como sendo DATE
- ?? permitido o uso como segundo ou terceiro operando do BETWEEN.
O tipo de dado ?? assumido como sendo o tipo de dado do operando ?? esquerda.
WHERE DATE('1996-01-01') BETWEEN ? AND ?
-- tipos assumidos como sendo DATE
- ?? permitido o uso como operando ?? esquerda da lista IN
se pelo menos um item da lista n??o for um par??metro din??mico.
O tipo de dado do operando ?? esquerda ?? assumido como sendo o resultado da
uni??o dos tipos de dado dos par??metros n??o din??micos da lista.
WHERE ? NOT IN (?, ?, 'Santiago')
-- tipos assumidos como sendo CHAR
- ?? permitido o uso na lista de valores do predicado IN, se o primeiro
operando n??o for um par??metro din??mico, ou seu tipo foi determinado pela
regra anterior.
O tipo dos par??metros din??micos que aparecem na lista de valores ?? assumido
como sendo o tipo do operando ?? esquerda.
WHERE ColunaPontoFlutuante IN (?, ?, ?)
-- tipos assumidos como sendo FLOAT
- Para os operadores bin??rios +, -, *, /, AND, OR, <, >,
=, <>, <= e >=, ?? permitido o uso do par??metro din??mico como um
dos operandos, mas n??o os dois.
Seu tipo de dado ?? obtido a partir do tipo do outro lado.
WHERE ? < CURRENT_TIMESTAMP
-- tipo assumido como sendo TIMESTAMP
- A utiliza????o em CAST ?? sempre permitida, porque CAST fornece tipo de dado
ao par??metro din??mico.
CALL valueOf(CAST (? AS VARCHAR(10)))
- ?? permitido o uso nos dois lados do operador LIKE.
Quando utilizado no lado esquerdo, o tipo de dado do par??metro din??mico ??
definido como sendo o tipo de dado do operando ?? direita, mas com o comprimento
m??ximo permitido para o tipo de dado.
Quando utilizado no lado direito, o tipo de dado ?? assumido como sendo do
mesmo comprimento e tipo de dado do operando ?? esquerda
(LIKE ?? permitido nos tipos de dado CHAR e VARCHAR;
para obter mais informa????es deve ser consultado
Concatena????o).
WHERE ? LIKE 'Santi%'
-- tipo assumido como sendo CHAR com comprimento igual a
-- java.lang.Integer.MAX_VALUE
- O par??metro ?, sem mais nada, ?? permitido em apenas um dos lados do operador
||, ou seja, "? || ?" n??o ?? permitido.
O tipo do par??metro ? de um dos lados do operador || ?? determinado pelo tipo
da express??o do outro lado do operador ||.
Se a express??o do outro lado for do tipo de dado CHAR ou VARCHAR, o tipo do
par??metro ser?? VARCHAR com o comprimento m??ximo permitido para o tipo de dado.
Se a express??o do outro lado for do tipo de dado CHAR FOR BIT DATA ou
VARCHAR FOR BIT DATA, o tipo de dado do par??metro ser?? VARCHAR FOR BIT DATA
com o comprimento m??ximo permitido para o tipo de dado.
SELECT coluna_bit || ?
FROM tabela_usuario
-- tipo assumido como sendo CHAR FOR BIT DATA
-- com o comprimento especificado para coluna_bit
-
Em uma express??o condicional, que utiliza ?, tamb??m ?? permitida a utiliza????o
do par??metro din??mico (que tamb??m ?? representado por ?).
O tipo do par??metro din??mico como primeiro operando ?? assumido como sendo
booleano.
Com rela????o ao segundo e terceiro operandos, somente um dos dois pode ser um
par??metro din??mico, e seu tipo ?? assumido como sendo o mesmo do outro operando
(ou seja, o terceiro e segundo operando, respectivamente).
SELECT c1 IS NULL ? ? : c1
-- permite especificar o valor "padr??o" em tempo de execu????o
-- o par??metro din??mico ?? assumido como tendo o tipo de c1
-- n??o podem haver par??metros din??micos dos dois lados dos :
- ?? permitido usar par??metro din??mico como item da lista de valores ou da
lista de sele????o da instru????o INSERT.
O tipo do par??metro din??mico ?? assumido como sendo o tipo da coluna de destino.
O par??metro ?, sem mais nada, n??o ?? permitido na lista de sele????o, inclusive na
lista de sele????o da subconsulta, a menos que exista uma coluna correspondente
em UNION, INTERSECT ou EXCEPT
(consulte o n??
16, abaixo)
que n??o seja din??mica.
INSERT INTO t VALUES (?)
-- o par??metro din??mico ?? assumido como sendo
-- do tipo da ??nica coluna da tabela t
INSERT INTO t SELECT ?
FROM t2
-- n??o ?? permitido
- O par??metro ? na compara????o com uma subconsulta recebe seu tipo a partir
da express??o sendo selecionada na subconsulta. Por exemplo:
SELECT *
FROM tab1
WHERE ? = (SELECT x FROM tab2)
SELECT *
FROM tab1
WHERE ? = ANY (SELECT x FROM tab2)
-- Nos dois casos, o tipo do par??metro din??mico ??
-- assumido como sendo o mesmo tipo de tab2.x.
- ?? permitido usar par??metro din??mico como o valor em uma instru????o UPDATE.
O tipo do par??metro din??mico ?? assumido como sendo o tipo da coluna na tabela
de destino.
UPDATE t2 SET c2 =? -- o tipo ?? assumido como sendo o tipo de c2
- N??o ?? permitido par??metro din??mico como operando dos operadores un??rios
- e +.
- LENGTH permite par??metro din??mico.
O tipo ?? assumido como sendo o comprimento m??ximo do tipo VARCHAR.
SELECT LENGTH(?)
- Compara????es qualificadas.
? = SOME (SELECT 1 FROM t)
-- ?? v??lido. O par??metro din??mico ?? assumido como sendo do tipo INTEGER
1 = SOME (SELECT ? FROM t)
-- ?? v??lido. O par??metro din??mico ?? assumido como sendo do tipo INTEGER
- ?? permitido usar par??metro din??mico para representar uma
coluna se aparecer em uma express??o UNION, INTERSECT ou EXCEPT;
O Derby pode inferir
o tipo de dado a partir da coluna correspondente na express??o.
SELECT ?
FROM t
UNION SELECT 1
FROM t
-- o par??metro din??mico ?? assumido como sendo INT
VALUES 1 UNION VALUES ?
-- o par??metro din??mico ?? assumido como sendo INT
- ?? permitido par??metro din??mico como operando ?? esquerda de uma express??o IS,
sendo assumido como booleano.