Erro ao Atribuir SQL concatenado a uma tabela
-
Boa tarde, estou tentando atribuir o seguinte SQL a uma tabela pela função "Abrir conexão dinâmica":
SELECT
'INSERT INTO rbl_alteracao_compras(data_alteracao,idcompras,cod_produto,qtde,unidade,data_antes,data_depois,diferenca)
VALUES '||string_agg( distinct
'(CURRENT_DATE,'||cmp_comprasitens.idcompra||','''||bas_insumo.codigo||''','||coalesce(cast(cmp_comprasitens.qtdeestoque as integer),0.0)||','''||coalesce(bas_insumo.unidestoque,'UN')||''','''||cmp_comprasitens.entrega||''','''||'2022-10-20'||''','||('2022-10-20' - cmp_comprasitens.entrega)||')',',
')||';' as insert_compras
FROM
ped_itens
INNER JOIN ped_pedido ON ped_itens.idpedido = ped_pedido.idpedido
INNER JOIN bas_funcionario ON ped_pedido.idfuncionario = bas_funcionario.idfuncionario
LEFT JOIN bas_empresa ON ped_pedido.idcliente = bas_empresa.idempresa
LEFT JOIN bas_insumo ON ped_itens.idinsumo = bas_insumo.idinsumo
LEFT JOIN cmp_comprasitens ON ped_itens.idinsumo = cmp_comprasitens.idproduto
LEFT JOIN est_saldo ON ped_itens.idinsumo = est_saldo.idinsumo AND est_saldo.idlocalestoque = 1
LEFT JOIN flw_registro On ped_itens.idpedido = flw_registro.idpedido
WHERE
ped_itens.idstatus IN (0, 1, 2, 3, 7)
AND flw_registro.idstatus = 1
AND flw_registro.idnivel2 = 144
AND cmp_comprasitens.iditem IN (350093)
Porém, ao usar essa função, me aparece o seguinte erro:
Pelo que estava testando, o problema é gerado quando faço strings dentro do campo, ou seja, monto a estrutura do insert entre as duas primeiras aspas simples (parte que está em negrito e itálico).
Também tentei usar outras funções, como a abrir consulta dinamica navegavel, avançada, etc e continua dando o mesmo erro.
Podem me ajudar por favor? -
Boa tarde, @ian_pinheiro!
Por motivos de segurança e integridade, as funções de abrir consulta fazem verificação do SQL que está sendo passado e permitem somente a execução de comandos SELECT.
Por algum motivo, a função achou que estava sendo executado o comando de INSERT que você está montando como um campo na sua query. Isso é um comportamento atípico e irei reportá-lo ao setor.
Entretanto, o ideal nessa situação, seria que você executasse o comando de inserção no fluxo passando os parâmetros ao invés de montar ele no banco de dados. Assim você chamaria a função de abrir consulta somente para pegar os valores desejados e em seguida utilizasse a função
Executar Comandos SQL
passando seu comando de inserção e a lista de parâmetros (valores obtidos do banco):INSERT INTO rbl_alteracao_compras (data_alteracao, idcompras, cod_produto, qtde, unidade, data_antes, data_depois, diferenca) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
Atenciosamente,
-
Obrigado, ajudou!