PHP / OCI - Không thể nhận kết quả từ thủ tục Oracle trong một bảng tạm thời


8

Tôi đang cố gắng thực hiện hai điều bằng cách sử dụng các hàm PHP OCI Oracle:

  1. Chạy một thủ tục gói trong cơ sở dữ liệu Oracle.
  2. Khi gói đã chạy, truy vấn một bảng tạm thời để có kết quả hoạt động của thủ tục.

Tôi có thể thực hiện việc này thành công bằng phần mềm SQL Developer được cung cấp từ Oracle. Truy vấn của tôi là cực kỳ cơ bản và có thể được nhìn thấy dưới đây:

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

Mã này ở trên hoạt động hoàn hảo và tôi nhận được một bảng kết quả đầy đủ trong SQL Developer.

Tôi đang cố gắng làm điều tương tự ở trên trong PHP bằng OCI. Mã của tôi có thể được nhìn thấy dưới đây:

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

?>

Tuy nhiên, điều này trả về không có lỗi và một tập kết quả trống. Tôi không thể hiểu tại sao. Bất cứ ai nhìn thấy bất cứ điều gì rõ ràng ở đây mà tôi đang thiếu?

Tập kết quả được trả về từ PHP

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

Chuỗi kết nối của tôi như sau:

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

Tôi đang sử dụng PHP7.1.22 và cơ sở dữ liệu Oracle 11g . Tôi có thể truy vấn các bảng bình thường và nhận kết quả mà không gặp vấn đề gì trong PHP và có được một bộ kết quả đầy đủ.


1
Có lẽ chủ đề này có thể hữu ích: stackoverflow.com/questions/41506335/ Từ
Eduardo Almeida

1
Cảm ơn bạn đã vượt qua điều này cùng, Eduardo. Sẽ xem xét với DBA của tôi và nhận phản hồi của họ về điều này.
ZettaGeek

2
Mặc dù nghe có vẻ như là kết nối DB hoặc sự cố đặc quyền, bạn vẫn nên thêm một số kiểm tra lỗi trong mã của mình. Xem lại các ví dụ lỗi thủ công OCI8 . Cũng xem lại Hướng dẫn sử dụng PHP và Oracle ngầm .
Christopher Jones

2
Không liên quan đến giải pháp, nhưng điều này có thể hữu ích: Bạn đang thực hiện hai oci_execute()cuộc gọi, có nghĩa là ít nhất hai "chuyến đi khứ hồi" tới DB. Để có hiệu suất và khả năng mở rộng, bạn có thể thêm truy vấn vào khối ẩn danh đầu tiên và trả về REF CURSOR với kết quả truy vấn.
Christopher Jones

Câu trả lời:


1

Là bảng tạm thời được định nghĩa là on commit delete rowshoặc như on commit preserve rows?

Theo mặc định, oci_executesẽ ngầm phát hành commitsau mỗi cuộc gọi thành công. Giả sử bảng tạm thời của bạn được xác định là on commit delete rows, sẽ xóa các hàng trước truy vấn tiếp theo. Bạn có thể thay đổi hành vi đó bằng cách chuyển tham số thứ hai tùy chọn

oci_execute($firstStid, OCI_DEFAULT);

Tuy nhiên, giả sử bạn làm điều này, bạn sẽ muốn làm một điều rõ ràng oci_commitđể đóng giao dịch bạn đã mở.


Điều này đã làm việc! Không thể tin được rằng nó đơn giản. Cảm ơn Justin! :)
ZettaGeek
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.