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. Echo json_encode($mData); Если вы печатаете arry, но json_encode вообще ничего не печатает.

 1
Author: user15606804, 2021-04-13

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.

  0
Author: A. Cedano, 2021-04-13 17:42:22