Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wywołanie funkcji w PHP
Forum PHP.pl > Forum > Bazy danych > Oracle
polnik@studio
Mam oto taką funkcję :

  1. FUNCTION ekp_api_intranet.limit_pozostaly(
  2. p_prc_id NUMBER, --identyfikator pracownika
  3. p_rda_id NUMBER, --identyfikator rodzaju absencji
  4. p_dzien DATE, --dzień na który sprawdzamy wymiar
  5. po_godziny OUT NUMBER, --zwracana ilość godzin pozostałych do wykorzystania
  6. po_dni OUT NUMBER, --zwracana ilość dni pozostałych do wykorzystania
  7. po_blad OUT VARCHAR2 --zwracany opis błędu, w przypadku niepowodzenia
  8. )
  9. RETURN NUMBER;


i chciałbym aby można było ją wywołać w php

robie coś takiego :
  1. <?php
  2.  
  3. $cmdstr = "SELECT ekp_api_intranet.limit_pozostaly(:p_prc_id, :p_rda_id , :p_dzien) v_godziny FROM dual";
  4. echo "Connection is " . $db_conn;
  5. echo '<br>';
  6.  
  7. $stmt = OCIParse($db_conn, $cmdstr) or die ('Can not parse query');
  8.  
  9. OCIBindByName($stmt,":p_prc_id", $pracownik_spr, 200) or die ('Can not bind variable');
  10. OCIBindByName($stmt,":p_rda_id", $rodzaj_urlopu_spr, 200) or die ('Can not bind variable');
  11. OCIBindByName($stmt,":p_dzien", $data_teraz, 200) or die ('Can not bind variable');
  12.  
  13.  OCIExecute($stmt) or die ('Can not Execute statment');
  14.  
  15. while (ocifetch($stmt)){ $_friends=ociresult($stmt,"v_godziny"); }
  16.  
  17. ?>


niestety otrzymuję komunikat :

Cytat
Warning: ociexecute(): OCIStmtExecute: ORA-06553: PLS-306: wrong number or types of arguments in call to 'LIMIT_POZOSTALY'


w czym może być probem sad.gif

Proszę o pomoc

pozdrawiam Krzysiek
nospor
ja tam znawca fukcji w oraclu nie jestem, ale jak wol widze ze masz funkcje z 6 paramatrami, a wywolujesz ją tylko z 3. Nawet komunikat o bledzie ci to sygnalizuje
polnik@studio
oki

dodałem te 3 pozostałe w ten sposób :

  1. <?php
  2.  
  3. $cmdstr = "SELECT ekp_api_intranet.limit_pozostaly(:p_prc_id, :p_rda_id , :p_dzien, :v_godziny OUT, :v_dni OUT, :v_blad OUT) FROM dual";
  4. echo "Connection is " . $db_conn;
  5. echo '<br>';
  6.  
  7. $stmt = OCIParse($db_conn, $cmdstr) or die ('Can not parse query');
  8.  
  9. OCIBindByName($stmt,":p_prc_id", $pracownik_spr, 200) or die ('Can not bind variable');
  10. OCIBindByName($stmt,":p_rda_id", $rodzaj_urlopu_spr, 200) or die ('Can not bind variable');
  11. OCIBindByName($stmt,":p_dzien", $data_teraz, 200) or die ('Can not bind variable');
  12.  
  13.  
  14. OCIBindByName($stmt,":v_godziny", $wynik1, 200) or die ('Can not bind variable');
  15. OCIBindByName($stmt,":v_dni", $wynik2, 200) or die ('Can not bind variable');
  16. OCIBindByName($stmt,":v_blad", $wynik3, 200) or die ('Can not bind variable');
  17.  
  18.  
  19. OCIExecute($stmt) or die ('Can not Execute statment');
  20.  
  21. while (ocifetch($stmt)){
  22. $_friends=ociresult($stmt,"v_godziny");
  23. }
  24.  
  25. ?>


i otrzymuję komunikat :

Cytat
Warning: ociexecute(): OCIStmtExecute: ORA-00907: missing right parenthesis


domyślam się, że brakuje jakiś parametrów. Niestety nie mam pojęcia jakich.

pozdrawiam serdecznie
Krzysiek
dr_bonzo
Nawias nie parametr - w raazie watpliwosci uzyj slownika en->pl.
polnik@studio
teraz po wykonaniu tego :

  1. <?php
  2.  
  3. $cmdstr = "SELECT ekp_api_intranet.limit_pozostaly(:p_prc_id, :p_rda_id , :p_dzien, :po_godziny , :po_dni, :po_blad) FROM dual";
  4. echo "Connection is " . $db_conn;
  5. echo '<br>';
  6.  
  7. $stmt = OCIParse($db_conn, $cmdstr) or die ('Can not parse query');
  8.  
  9. OCIBindByName($stmt,":p_prc_id", $pracownik_spr, 200) or die ('Can not bind variable');
  10. OCIBindByName($stmt,":p_rda_id", $rodzaj_urlopu_spr, 200) or die ('Can not bind variable');
  11. OCIBindByName($stmt,":p_dzien", $data_teraz, 200) or die ('Can not bind variable');
  12.  
  13. OCIBindByName($stmt,"po_godziny", $wynik1, 200) or die ('Can not bind variable');
  14. OCIBindByName($stmt,"po_dni", $wynik2, 200) or die ('Can not bind variable');
  15. OCIBindByName($stmt,"po_blad", $wynik3, 4000) or die ('Can not bind variable');
  16.  
  17. OCIExecute($stmt) or die ('Can not Execute statment');
  18.  
  19. ?>


zwraca mi komunikat :

Cytat
Warning: ociexecute(): OCIStmtExecute: ORA-06572: Function LIMIT_POZOSTALY has out arguments



sad.gif

pozdrawiam serdecznie Krzysiek


EDIT :

już sobie poradziłem smile.gif

dla zainteresowanych smile.gif

  1. <?php
  2.  
  3. $s = OCIParse($db_conn, "begin :result := ekp_api_intranet.limit_pozostaly(:p_prc_id, :p_rda_id , to_date(:p_dzien,'ddmmyyyy'), :po_godziny, :po_dni, :po_blad); end;");
  4. OCIBindByName($s, ":p_prc_id", $in_var);
  5. OCIBindByName($s, ":p_rda_id", $in_var2);
  6. OCIBindByName($s, ":p_dzien", $data_sprawdzenia);
  7. OCIBindByName($s, ":po_godziny", $out_var1, 50); // 50 długość zwracanej danej
  8. OCIBindByName($s, ":po_dni", $out_var2, 50); // 50 długość zwracanej danej
  9. OCIBindByName($s, ":po_blad", $out_var3, 50); // 50 długość zwracanej danej
  10. OCIBindByName($s, ":result", $out_var4, 4000); // 4000 długość zwracanej danej
  11.  
  12. OCIExecute($s, OCI_DEFAULT);
  13. echo "Ilość godzin: " . $out_var1 ."<BR>";
  14. echo "Ilość dni: " . $out_var2 ."<BR>";
  15. echo "Błąd: " . $out_var3 ."<BR>";
  16.  
  17. ?>


pozdrawiam Krzysiek
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.