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:
- Chạy một thủ tục gói trong cơ sở dữ liệu Oracle.
- 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 đủ.
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.