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.
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
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ę. –
Czy próbowałeś wyświetlić oświadczenie po związaniu? Co daje? –