PHP / OCI - Невозможно получить результаты процедуры Oracle во временной таблице - PullRequest
8 голосов
/ 12 апреля 2020

Я пытаюсь сделать две вещи, используя функции PHP OCI Oracle:

  1. Запустить процедуру пакета в базе данных Oracle.
  2. После того, как пакет Выполнено, запросите временную таблицу, чтобы получить результаты операции процедуры.

Я могу сделать это успешно, используя программное обеспечение SQL Developer, предоставленное Oracle. Мой запрос чрезвычайно прост c и его можно увидеть ниже:

BEGIN
    PKG_KTY_SEARCH.PR_PRICE_LIST();
END;
/
SELECT * FROM kty_web.KTY_PROD_PRICE_TEMP;

Этот код выше работает отлично, и я получаю полную таблицу результатов в SQL Developer.

Я пытаюсь сделать то же самое выше в PHP, используя OCI. Мой код можно увидеть ниже:

<?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!";

?>

Это, однако, не возвращает ошибок и пустой набор результатов. Я не могу понять, почему. Кто-нибудь видел здесь что-нибудь очевидное, что мне не хватает?

Набор результатов, возвращаемый PHP

{"PRODUCT_ID":[],"CUST_ROLE":[],"MIN_QTY":[],"MAX_QTY":[],"PRICE":[]}

Моя строка подключения выглядит следующим образом:

$config['oracleDb']['connectionString'] = "(DESCRIPTION=(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = " . $config['oracleDb']['host'] . ")(PORT = " . $config['oracleDb']['port'] . ")))(CONNECT_DATA=(SID=" . $config['oracleDb']['sid'] . ")))";

Я использую PHP7 .1.22 и Oracle 11g базу данных. Я могу запросить обычные таблицы и получить результаты без проблем в пределах PHP и получить полный набор результатов.

1 Ответ

1 голос
/ 01 мая 2020

Временная таблица определяется как on commit delete rows или on commit preserve rows?

По умолчанию oci_execute будет неявно выдавать commit после каждого успешного вызова. Предполагая, что ваша временная таблица определена как on commit delete rows, это удалит строки перед последующим запросом. Вы можете изменить это поведение, передав необязательный второй параметр

oci_execute($firstStid, OCI_DEFAULT);

Если вы сделаете это, однако, вы захотите сделать явный oci_commit, чтобы закрыть открытую транзакцию.

...