oci fetch array не позволяет мне распечатать весь полный массив
CREATE OR REPLACE PROCEDURE seleccionar (
registros OUT SYS_REFCURSOR,
codigo NUMBER
) AS
BEGIN
OPEN registros FOR SELECT
imagen,
nombre_producto,
precio_producto
FROM
producto
WHERE
id_categoria = codigo;
END;
это мой хранимый процесс
<?php
$conn = oci_connect('ProyectoLBD', 'ProyectoLBD', 'orcl');
$sql = 'BEGIN seleccionar(:registros,:codigo); END;';
$stmt = oci_parse($conn, $sql);
$paramIn = 1;
oci_bind_by_name($stmt,":codigo",$paramIn,-1,SQLT_INT);
$rs = oci_new_cursor($conn);
oci_bind_by_name($stmt,":registros",$rs,-1,OCI_B_CURSOR);
oci_execute($stmt);
oci_execute($rs);
$mData=array();
while ($row = oci_fetch_assoc($rs)) {
$mData[] = $row;
}
var_dump($mData);
echo json_encode($mData);
?>
Если я печатаю его таким образом, формат
json
не работает, и если я печатаю его за пределамиwhile
единственное, что он печатает, это FALSE. Echojson_encode($mData);
Если вы печатаете arry, ноjson_encode
вообще ничего не печатает.
1 answers
Согласно разделу Stored Procedures and Reference Cursors документации Oracle:
Для работы с курсором в PHP требуется два дополнительных шага, как сравнивается с доступом к рядам непосредственно из выбранного заявления. Первый шаг заключается в подготовке курсора resource in PHP, using the oci_new_cursor () function, which you then use to bind to the appropriate parameter. The second step, after you have executed The SQL statement, is calling oci_execute () on the курсор resource.
Для работы с курсором в PHP требуется два дополнительных шага по сравнению с доступом к строкам непосредственно из инструкции
SELECT
. Первым шагом является подготовка ресурса курсора в PHP, используя функциюoci_new_cursor()
, который затем используется для привязки к соответствующему параметру. Второй шаг, после того , как вы выполнили оператор SQL, - вызватьoci_execute()
на ресурсе курсор.
Ваш код должен работать следующим образом, за исключением других ошибок:
$conn = oci_connect('ProyectoLBD', 'ProyectoLBD', 'orcl');
$sql = 'BEGIN seleccionar(:registros,:codigo); END;';
#Suele usarse $stmt como convención de nombre
$stmt = oci_parse($conn, $sql);
// Bind del parámetro de entrada :codigo usando la variable $paramIn
$paramIn = 1;
oci_bind_by_name($stmt,":codigo",$paramIn,-1,SQLT_INT);
// Crear un recurso que será el que leeremos con los resultados
$rs = oci_new_cursor($conn);
// Bind de $rs al argumento out de la SP Oracle
oci_bind_by_name($stmt,":registros",$rs,-1,OCI_B_CURSOR);
// Ejecutar el statement
oci_execute($stmt);
// Ejecutar el cursor
oci_execute($rs);
// Array para recoger cada fila
$mData=array();
// Leer los datos, no hay que complicarse usando !=false
// Y se puede usar un método más específico como oci_fetch_assoc
while ($row = oci_fetch_assoc($rs)) {
$mData[] = $row;
}
#Para debug, quitarlo cuando funcione
var_dump($mData);
// Imprimir fuera del while
echo json_encode($mData);
Если он говорит вам, что JSON недействителен, скопируйте и вставьте вывод и оцените его в этот валидатор, чтобы вы могли узнать, какая проблема в вашем json.