Problema com parametro

SQL

Oracle

Oracle PL SQL

29/09/2022

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)
Marcos Batista

Marcos Batista

Curtidas 0

Respostas

Arthur Heinrich

Arthur Heinrich

29/09/2022

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".
GOSTEI 0
POSTAR