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.