2015-07-01 8 views
5

L'esecuzione della stored procedure in PHP fornisce ORA-01460. Questo è il codice semplificato (originale ha più di 48 valori di ingresso) in PHP:Esecuzione della stored procedure in PHP: ORA-01460: richiesta di conversione non implementata o irragionevole

$proc_sql = "BEGIN CREATE_RECORD(:b1, :b2, :b3, :b4, :b5, :b6); END;"; 

$bind = array("bind 1", "bind 2", "bind 3", "bind 4", "bind 5", "OUT DUMMY"); 

$stmt = oci_parse($conn, $proc_sql); 

$i = 1; 

$outval = ""; 

foreach($bind as $val){ 
    $tmp =":b".$i; 
    if($i < count($bind)){ 
     oci_bind_by_name($stmt,$tmp,$val); 
    }else{ 
     oci_bind_by_name($stmt, $tmp, $outval, 512); 
    } 
    $i++; 
} 
oci_execute($stmt); 

Ultima riga produce l'avvertimento. Tuttavia se eseguo la query direttamente in SQL Developer:

declare 
    re varchar2(512); 
begin 

CREATE_RECORD('bind 1', 'bind 2', 'bind 3', 'bind 4', 'bind 5', re); 
dbms_output.put_line(re); 

end; 

L'inserimento è stato completato correttamente. È il mio primo progetto con PHP & combinazione Oracle. Quindi non so se il mio php è errato o il problema risiede altrove. Ecco informazioni OCI8 da phpinfo():

oci8 

OCI8 Support enabled 
OCI8 DTrace Support disabled 
OCI8 Version 2.0.8 
Oracle Run-time Client Library Version 10.2.0.3.0 
Oracle Compile-time Instant Client Version 10.2 

Directive      Local Value    Master Value 

oci8.default_prefetch    100      100 
oci8.events       Off      Off 
oci8.max_persistent     -1      -1 
oci8.old_oci_close_semantics   Off      Off 
oci8.persistent_timeout    -1      -1 
oci8.ping_interval     60      60 
oci8.privileged_connect    Off      Off 
oci8.statement_cache_size    20      20 

PHP Version 5.5.17 e Oracle 9i prega, aiutare a trovare il motivo per cui mi appare questo avvertimento. Grazie per la lettura.

UPDATE

Il codice di seguito anche funziona:

$proc_sql = "BEGIN CREATE_RECORD('bind 1', 'bind 2', 'bind 3', 'bind 4', 'bind 5', :b6); END;"; 
$stmt = oci_parse($conn, $proc_sql); 
$outval = ""; 
oci_bind_by_name($stmt, ':b6', $outval, 512); 

come ho detto sopra, questa è semplificata versione di eseguire codice procedura, in realtà ho bisogno di impegnare 48 parametri IN e un OUT parametro. Deve fare qualcosa con statement_cache_size nelle impostazioni OCI8? Ho letto il docs ma non riesco davvero a capire se ha qualcosa a che fare con il mio problema.

+1

Potete per favore condividere il codice della procedura 'CREATE_RECORD' in modo che possiamo vedere cosa succede realmente lì dentro. Suppongo che il 6 ° parametro sia una variabile OUT, ma è solo un'ipotesi basata sul valore "OUT DUMMY" per la sesta variabile bind. – gvenzl

+0

Ciao gvenzl, grazie per il tuo commento. Purtroppo non posso mostrare la parte interna della procedura poiché non ho il permesso, e sì, il 6 ° parametro è una variabile out. Se guardi al ciclo 'foreach' c'è il blocco' else' dove imposto la variabile. Ho anche scoperto che se inserisco i valori direttamente nella query, la procedura funziona ... Vedi il mio aggiornamento. –

+0

Hai provato a visualizzare l'istruzione una volta vincolata? Che cosa dà? –

risposta

1

Si prega, si veda this piece of PHP documentation, soprattutto questa parte:

chiamata

un vicolo cieco dice Oracle quale indirizzo di memoria per leggere i dati. Per IN associa tale indirizzo che deve contenere dati validi quando viene chiamato oci_execute() . Ciò significa che il vincolo della variabile deve rimanere nello scope fino all'esecuzione. In caso contrario, si verificheranno risultati imprevisti o errori come "ORA-01460: richiesta di conversione non implementata o irragionevole" . Per OUT binds, un problema non ha valore nella variabile PHP .

Se undestand bene il codice, è possibile utilizzare una variabile locale all'interno di un ciclo per scorrere i parametri IN, in modo da non soddisfare la domanda di avere tutti i valori di portata quando si chiama oci_execute dopo il ciclo è completato.