Estou tentando fazer duas coisas usando as funções Oracle OCI do PHP:
- Execute um procedimento de pacote dentro de um banco de dados Oracle.
- Após a execução do pacote, consulte uma tabela temporária para obter os resultados da operação do procedimento.
Consigo fazer isso com sucesso usando o software SQL Developer fornecido pela Oracle. Minha consulta é extremamente básica e pode ser vista abaixo:
BEGIN
PKG_KTY_SEARCH.PR_PRICE_LIST();
END;
/
SELECT * FROM kty_web.KTY_PROD_PRICE_TEMP;
Este código acima funciona perfeitamente e recebo uma tabela completa de resultados no SQL Developer.
Estou tentando fazer a mesma coisa acima no PHP usando OCI. Meu código pode ser visto abaixo:
<?php
// Load up the system.
require('../../system/init.php');
global $config;
$oracleDb = oci_new_connect($config['oracleDb']['username'], $config['oracleDb']['password'], $config['oracleDb']['connectionString']);
$firstStid = oci_parse($oracleDb, "BEGIN PKG_KTY_SEARCH.PR_PRICE_LIST(); END;");
oci_execute($firstStid);
$secondStid = oci_parse($oracleDb, "SELECT * FROM kty_web.KTY_PROD_PRICE_TEMP");
oci_execute($secondStid);
oci_fetch_all($secondStid, $result);
echo json_encode($result);
echo "<br />Import complete!";
?>
No entanto, isso não retorna erros e um conjunto de resultados vazio. Não consigo entender o porquê. Alguém viu alguma coisa óbvia aqui que eu estou perdendo?
Conjunto de resultados retornado do PHP
{"PRODUCT_ID":[],"CUST_ROLE":[],"MIN_QTY":[],"MAX_QTY":[],"PRICE":[]}
Minha cadeia de conexão é a seguinte:
$config['oracleDb']['connectionString'] = "(DESCRIPTION=(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = " . $config['oracleDb']['host'] . ")(PORT = " . $config['oracleDb']['port'] . ")))(CONNECT_DATA=(SID=" . $config['oracleDb']['sid'] . ")))";
Estou usando o PHP7.1.22 e o banco de dados Oracle 11g . Eu sou capaz de consultar tabelas normais e obter resultados sem problemas no PHP e obter um conjunto completo de resultados.
oci_execute()
chamadas, o que significa pelo menos duas "viagens de ida e volta" ao banco de dados. Para desempenho e escalabilidade, você pode adicionar a consulta ao primeiro bloco anônimo e retornar um REF CURSOR com os resultados da consulta.Respostas:
A tabela temporária é definida como
on commit delete rows
ou comoon commit preserve rows
?Por padrão,
oci_execute
emitirá implicitamente umcommit
após cada chamada bem-sucedida. Supondo que sua tabela temporária seja definida comoon commit delete rows
, isso excluirá as linhas antes da consulta subsequente. Você pode alterar esse comportamento passando um segundo parâmetro opcionalSupondo que você faça isso, no entanto, convém fazer um explícito
oci_commit
para fechar a transação que você abriu.fonte