PHP / OCI-一時テーブル内のOracleプロシージャから結果を取得できません


8

PHP OCI Oracle関数を使用して2つのことを実行しようとしています。

  1. Oracleデータベース内でパッケージプロシージャを実行します。
  2. パッケージが実行されたら、一時テーブルをクエリして、プロシージャの操作の結果を取得します。

これは、Oracleから提供されているSQL Developerソフトウェアを使用して問題なく実行できます。私のクエリは非常に基本的であり、以下に表示されます:

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
たぶん、このスレッドは便利です。stackoverflow.com/questions/41506335/...
エドゥアルド・アルメイダ

1
これを渡してくれてありがとう、エドゥアルド。私のDBAと確認し、これについてのフィードバックを得る。
ZettaGeek

2
DB接続または特権の問題のように思えますが、コードにエラーチェックを追加する必要があります。確認OCI8マニュアルのエラーの例を。また、Underground PHPとOracleのマニュアルも確認してください
クリストファージョーンズ

2
ソリューションとは関係ありませんが、これは便利な場合があります。2つのoci_execute()呼び出しを行っています。つまり、DBへの少なくとも2つの「往復」を行っています。パフォーマンスとスケーラビリティのために、最初の匿名ブロックにクエリを追加し、クエリ結果を含むREF CURSORを返すことができます。
クリストファージョーンズ

回答:


1

一時テーブルはon commit delete rowsまたはとして定義されていon commit preserve rowsますか?

デフォルトでoci_executeは、はcommit呼び出しが成功するたびに暗黙的にを発行します。一時テーブルがとして定義されon commit delete rowsているとすると、後続のクエリの前に行が削除されます。オプションの2番目のパラメーターを渡すことで、その動作を変更できます

oci_execute($firstStid, OCI_DEFAULT);

ただし、これを行うと仮定すると、oci_commit開いたトランザクションを閉じるために明示的に行う必要があります。


これはうまくいった!それがそれほど単純だったとは信じられません。ジャスティン、ありがとう!:)
ZettaGeek
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.