PHP / OCI - Não foi possível obter resultados do procedimento Oracle em uma tabela temporária

8

Estou tentando fazer duas coisas usando as funções Oracle OCI do PHP:

  1. Execute um procedimento de pacote dentro de um banco de dados Oracle.
  2. 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.

ZettaGeek
fonte
1
Talvez este tópico possa ser útil: stackoverflow.com/questions/41506335/…
Eduardo Almeida
1
Obrigado por transmitir isso, Eduardo. Revisarei com meu DBA e obterá seus comentários sobre isso.
ZettaGeek 12/04
2
Embora pareça um problema de conexão ou privilégio no banco de dados, você ainda deve adicionar alguma verificação de erro no seu código. Revise os exemplos de erro manual do OCI8 . Leia também o Manual Underground do PHP e Oracle .
Christopher Jones
2
Não está relacionada à solução, mas isso pode ser útil: Você está fazendo duas 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.
Christopher Jones

Respostas:

1

A tabela temporária é definida como on commit delete rowsou como on commit preserve rows?

Por padrão, oci_executeemitirá implicitamente um commitapós cada chamada bem-sucedida. Supondo que sua tabela temporária seja definida como on commit delete rows, isso excluirá as linhas antes da consulta subsequente. Você pode alterar esse comportamento passando um segundo parâmetro opcional

oci_execute($firstStid, OCI_DEFAULT);

Supondo que você faça isso, no entanto, convém fazer um explícito oci_commitpara fechar a transação que você abriu.

Justin Cave
fonte
Isso funcionou! Não posso acreditar que era assim tão simples. Obrigado Justin! :)
ZettaGeek