No Db2 v11.5 no Linux, eu gostaria de criar uma variável e então usar essa variável na instrução SELECT. Eu não quero criar um procedimento ou função no banco de dados, eu só quero fazer isso em SQL dinâmico do db2cmd ou alguma ferramenta de banco de dados.
Exemplo simplificado:
BEGIN
DECLARE name VARCHAR(10);
SET name = 'John';
SELECT * FROM SYSIBM.SYSDUMMY1 WHERE name = :name;
END;
EDIT: Por que não quero criar um procedimento/função armazenado? Eu realizo auditorias a cada semestre para privilégios/autorizações de banco de dados em vários bancos de dados e não tenho privilégio de criar procedimento em alguns dos bancos de dados, devido a configurações de segurança rígidas. Na maioria dos casos, só tenho acesso às tabelas do catálogo do sistema, o que é perfeitamente suficiente para criar auditoria. Eu listo os usuários do banco de dados e, em seguida, para usuários "suspeitos", realizo verificações completas de permissão/autoridade executando vários SQL-s do catálogo do sistema. Até agora, para cada usuário, usei o editor de texto e usei localizar/substituir, o que é uma solução OK, mas a variável é uma solução melhor. Obrigado!
Sua pergunta mostra o uso de
:variable-name
, mas essa sintaxe só está disponível no SQL incorporado ou no modo Oracle (se habilitado para sua instância e banco de dados Db2).Além disso, algumas ferramentas do lado do cliente (de terceiros) permitem a criação de scripts com variáveis, mas isso só funciona ao usar essas ferramentas específicas, ou seja, não funcionará com o Db2-CLP.
Em geral, criar rotinas (funções definidas pelo usuário ou procedimentos armazenados) é uma escolha mais sensata. Não está claro por que você quer evitar essa opção.
Você pode usar variáveis globais (mais fácil, menos restrições, mas todas as desvantagens das variáveis globais) ou pode usar blocos anônimos (muitas restrições no Db2).
Mas blocos anônimos não permitirão que você veja diretamente a saída de um SELECT, você precisaria fazer o SELECT fora do bloco. A IBM documenta várias restrições sobre o que é possível com
compound-sql(inlined)
, consulte a documentação no Db2 Knowledge Centre para obter detalhes.Com variáveis globais (este exemplo usa o Db2 CLP no Linux):
Com o bloco anônimo compound-sql(inlined) (com o Db2 CLP no Linux), aqui está uma maneira de fazer isso (outras maneiras são possíveis) com tabelas de sessão: