Saya mencoba melakukan dua hal menggunakan fungsi PHP OCI Oracle:

  1. Jalankan prosedur paket dalam database Oracle.
  2. Setelah paket berjalan, kueri tabel sementara untuk mendapatkan hasil operasi prosedur.

Saya berhasil melakukannya menggunakan perangkat lunak Pengembang SQL yang disediakan dari Oracle. Permintaan saya sangat mendasar dan dapat dilihat di bawah:

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

Kode di atas berfungsi dengan baik dan saya mendapatkan tabel lengkap hasil di SQL Developer.

Saya mencoba melakukan hal yang sama di atas dalam PHP menggunakan OCI. Kode saya dapat dilihat di bawah ini:

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

?>

Namun ini tidak mengembalikan kesalahan, dan set hasil kosong. Saya tidak tahu mengapa. Adakah yang melihat sesuatu yang jelas di sini yang saya lewatkan?

Set hasil yang dikembalikan dari PHP

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

String koneksi saya adalah sebagai berikut:

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

Saya menggunakan PHP7.1.22, dan database Oracle 11g. Saya dapat menanyakan tabel normal dan mendapatkan hasil tanpa masalah dalam PHP dan mendapatkan set hasil lengkap.

7
ZettaGeek 12 April 2020, 03:55

1 menjawab

Jawaban Terbaik

Apakah tabel sementara didefinisikan sebagai on commit delete rows atau sebagai on commit preserve rows?

Secara default, oci_execute akan secara implisit mengeluarkan commit setelah setiap panggilan yang berhasil. Dengan asumsi tabel sementara Anda didefinisikan sebagai on commit delete rows, itu akan menghapus baris sebelum kueri berikutnya. Anda dapat mengubah perilaku itu dengan melewatkan parameter kedua opsional

oci_execute($firstStid, OCI_DEFAULT);

Namun, dengan asumsi Anda melakukan ini, Anda ingin melakukan oci_commit eksplisit untuk menutup transaksi yang telah Anda buka.

1
Justin Cave 1 Mei 2020, 13:41