2015-07-01 4 views
5

Wykonywanie procedury składowanej w PHP daje ORA-01460. Jest to uproszczona (oryginalna ma ponad 48 wartości wejściowych) kod w php:Wykonywanie procedury składowanej w PHP: ORA-01460: niezaimplementowana lub nieuzasadniona konwersja wymagana

$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); 

Ostatnia linia produkuje ostrzeżenia. Jeśli jednak uruchomię zapytanie bezpośrednio w 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; 

Wstawianie zakończone powodzeniem. To mój pierwszy projekt z połączeniem Oracle w PHP &. Więc nie wiem, czy mój php jest nieprawidłowy, czy problem leży gdzie indziej. Oto OCI8 informacji od 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 i Oracle 9i Proszę pomóc dowiedzieć się, dlaczego ja coraz to ostrzeżenie. Dziękuję za przeczytanie.

UPDATE

Kod poniżej również działa:

$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); 

Jak stwierdzono powyżej, jest to uproszczona wersja wykonania kodu procedury w rzeczywistości potrzebne do wiązania 48 parametrów IN i OUT parametr. Czy musi coś zrobić z statement_cache_size w ustawieniach OCI8? Przeczytałem docs, ale nie mogę naprawdę zrozumieć, czy ma to coś wspólnego z moim problemem.

+1

Czy możesz również udostępnić kod procedury "CREATE_RECORD", abyśmy mogli zobaczyć, co faktycznie dzieje się w tym miejscu. Zakładam, że szósty parametr jest zmienną OUT, ale to tylko przypuszczenie oparte na wartości "OUT DUMMY" dla 6. zmiennej wiązania. – gvenzl

+0

Witaj gvenzl, dziękuję za komentarz. Niestety nie mogę pokazać wewnętrznej części procedury, ponieważ nie mam pozwolenia, i tak, szósty parametr jest zmienną out. Jeśli spojrzysz na pętlę foreach, znajduje się blok 'else', w którym wiążę zmienną. Dowiedziałem się również, że jeśli wstawię wartości bezpośrednio do kwerendy, procedura działa ... Proszę zobaczyć moją aktualizację. –

+0

Czy próbowałeś wyświetlić oświadczenie po związaniu? Co daje? –

Odpowiedz

1

Proszę zobaczyć this piece of PHP documentation, szczególnie ta część:

bind wezwanie mówi Oracle których pamięć adres do odczytu danych z. Dla IN wiąże ten adres musi zawierać prawidłowe dane, gdy wywoływane jest oci_execute() . Oznacza to, że zmienna związana musi pozostać w zakresie do momentu wykonania. Jeśli tak się nie stanie, mogą wystąpić nieoczekiwane wyniki lub błędy, takie jak "ORA-01460: niezaimplementowana lub nieuzasadniona konwersja" może wystąpić . Dla powiązań OUT jednym z symptomów jest brak wartości ustawionej w zmiennej PHP .

Gdybym undestand kodu dobrze, należy użyć zmiennej lokalnej wewnątrz pętli do cyklu poprzez swoje parametry w, więc nie zaspokoić popyt mieć wszystkie wartości w zakresie gdy dzwonisz oci_execute po cyklu jest zakończony.

Powiązane problemy