Problema com parametro
29/09/2022
0
Olá pessoal, necessito de ajuda.
Trabalho em uma empresa aonde fazemos relatórios personalizados, para enviar uma query para o sistema que gera o relatório necessito enviar somente o campo, não posso enviar o campo com parâmetro pois ele ficaria registrado somente com esse valor. Como vocês podem observar nos campos que se seguem após o ''AND NR_APAC NOT IN'' existem valores, gostaria saber se é possível ou se tem alguma função onde, eu possa substituir esses valores para que o sistema entenda somente os campos.
Basicamente eu estou comparando após o ''AND NR_APAC NOT IN'' se a nr_apac existe na próxima fatura.
SELECT CD_APAC
, CD_FAT_SIA
, CD_REMESSA
, NR_APAC
, CD_TIP_ATE
, CD_ORI_ATE
, CD_PACIENTE
, DT_INICIAL
, DT_FINAL
FROM DBAMV.APAC
WHERE APAC.TP_APAC <> '3'
-- AND CD_FAT_SIA = 524
-- AND CD_REMESSA = 1240
-- AND NR_APAC = '3122236510690'
-- AND CD_PACIENTE = 8417257
AND SN_COPIA = 'N'
AND DT_OCORRENCIA IS NULL
AND NR_APAC NOT IN (SELECT NR_APAC FROM DBAMV.APAC
WHERE CD_FAT_SIA = 526
AND CD_REMESSA = 1253
AND NR_APAC IS NOT NULL)
AND DT_INICIAL <= (SELECT NVL(NVL(R.DT_COMPETENCIA_APRESENTACAO, F.DT_COMPETENCIA), F.DT_PERIODO_INICIAL)
FROM DBAMV.REMESSA_APAC R , DBAMV.FAT_SIA F
WHERE F.CD_FAT_SIA = R.CD_FAT_SIA
AND R.CD_REMESSA = 1253 )
AND DT_FINAL >= (SELECT NVL(NVL(R.DT_COMPETENCIA_APRESENTACAO, F.DT_COMPETENCIA), F.DT_PERIODO_INICIAL)
FROM DBAMV.REMESSA_APAC R , DBAMV.FAT_SIA F
WHERE F.CD_FAT_SIA = R.CD_FAT_SIA
AND R.CD_REMESSA = 1253)
Trabalho em uma empresa aonde fazemos relatórios personalizados, para enviar uma query para o sistema que gera o relatório necessito enviar somente o campo, não posso enviar o campo com parâmetro pois ele ficaria registrado somente com esse valor. Como vocês podem observar nos campos que se seguem após o ''AND NR_APAC NOT IN'' existem valores, gostaria saber se é possível ou se tem alguma função onde, eu possa substituir esses valores para que o sistema entenda somente os campos.
Basicamente eu estou comparando após o ''AND NR_APAC NOT IN'' se a nr_apac existe na próxima fatura.
SELECT CD_APAC
, CD_FAT_SIA
, CD_REMESSA
, NR_APAC
, CD_TIP_ATE
, CD_ORI_ATE
, CD_PACIENTE
, DT_INICIAL
, DT_FINAL
FROM DBAMV.APAC
WHERE APAC.TP_APAC <> '3'
-- AND CD_FAT_SIA = 524
-- AND CD_REMESSA = 1240
-- AND NR_APAC = '3122236510690'
-- AND CD_PACIENTE = 8417257
AND SN_COPIA = 'N'
AND DT_OCORRENCIA IS NULL
AND NR_APAC NOT IN (SELECT NR_APAC FROM DBAMV.APAC
WHERE CD_FAT_SIA = 526
AND CD_REMESSA = 1253
AND NR_APAC IS NOT NULL)
AND DT_INICIAL <= (SELECT NVL(NVL(R.DT_COMPETENCIA_APRESENTACAO, F.DT_COMPETENCIA), F.DT_PERIODO_INICIAL)
FROM DBAMV.REMESSA_APAC R , DBAMV.FAT_SIA F
WHERE F.CD_FAT_SIA = R.CD_FAT_SIA
AND R.CD_REMESSA = 1253 )
AND DT_FINAL >= (SELECT NVL(NVL(R.DT_COMPETENCIA_APRESENTACAO, F.DT_COMPETENCIA), F.DT_PERIODO_INICIAL)
FROM DBAMV.REMESSA_APAC R , DBAMV.FAT_SIA F
WHERE F.CD_FAT_SIA = R.CD_FAT_SIA
AND R.CD_REMESSA = 1253)
Marcos Batista
Curtir tópico
+ 0
Responder
Posts
26/12/2022
Arthur Heinrich
Não sei se entendi corretamente.
Você tem uma query que depende de alguns filtros, como código do faturamento, remessa, etc. Para cada conjunto de dados, você quer executar a query com números diferentes.
Existem duas maneiras de se fazer isso.
1 - Utilizando BIND VARIABLES
Bind variables são variáveis que você coloca no select, no lugar dos valores. Ao executar a query, você não executa diretamente. Ela passa por etapas:
1 - Executa o "prepare", que consistem em enviar a query para o banco, para que seja feita a análise sintática e semântica, preparado um plano de execução e o banco mantém o cursor aberto, para execução futura.
Exemplo:
(...)
WHERE CD_FAT_SIA = :CD_FAT_SIA
AND CD_REMESSA = :CD_REMESSA
(...)
Query.Prepare;
2 - Escolha dos parâmetros:
Query.SetParameter('CD_FAT_SIA',526);
Query.SetParameter('CD_REMESSA',1253);
3 - Execução da query com os parâmetros escolhidos
Query.Open (ou Query.Execute)
Cada linguagem de programação/banco de dados pode utilizar nomenclaturas diferentes para os parâmetros. Ao invés de "CD_FAT_SIA = :CD_FAT_SIA" pode ser "CD_FAT_SIA = ?" ou coisa parecida.
2 - Utilizando queries dinâmicas
A segunda maneira é montar a query dinamicamente, concatenando os valores ao texto da query. Isto permite que alguns filtros sejam suprimidos, caso o valor não precise ser filtrado.
Cada uma destas formas possui prós e contras.
Na primeira, os filtros são fixos. Na segunda, pode abrir uma brecha para "SQL injection".
Você tem uma query que depende de alguns filtros, como código do faturamento, remessa, etc. Para cada conjunto de dados, você quer executar a query com números diferentes.
Existem duas maneiras de se fazer isso.
1 - Utilizando BIND VARIABLES
Bind variables são variáveis que você coloca no select, no lugar dos valores. Ao executar a query, você não executa diretamente. Ela passa por etapas:
1 - Executa o "prepare", que consistem em enviar a query para o banco, para que seja feita a análise sintática e semântica, preparado um plano de execução e o banco mantém o cursor aberto, para execução futura.
Exemplo:
(...)
WHERE CD_FAT_SIA = :CD_FAT_SIA
AND CD_REMESSA = :CD_REMESSA
(...)
Query.Prepare;
2 - Escolha dos parâmetros:
Query.SetParameter('CD_FAT_SIA',526);
Query.SetParameter('CD_REMESSA',1253);
3 - Execução da query com os parâmetros escolhidos
Query.Open (ou Query.Execute)
Cada linguagem de programação/banco de dados pode utilizar nomenclaturas diferentes para os parâmetros. Ao invés de "CD_FAT_SIA = :CD_FAT_SIA" pode ser "CD_FAT_SIA = ?" ou coisa parecida.
2 - Utilizando queries dinâmicas
A segunda maneira é montar a query dinamicamente, concatenando os valores ao texto da query. Isto permite que alguns filtros sejam suprimidos, caso o valor não precise ser filtrado.
Cada uma destas formas possui prós e contras.
Na primeira, os filtros são fixos. Na segunda, pode abrir uma brecha para "SQL injection".
Responder
Clique aqui para fazer login e interagir na Comunidade :)