Tomasz Madeyski programista PHP
Temat: Wywoływanie funckji PL/SQL z poziomu doctrine (1.2)
WitamMam problem z wywołaniem funkcji Pl/SQL (Oracle) z poziomu Doctrine i uzyskanie spowrotem wartości zwracanej przez tą funkcję.
Funkcja jest stworzona tak, że odpada wywołanie jej w postaci SELECT myFunc(params) from dual, ponieważ Oracle zwraca błąd ORA-14551. W związku z tym muszę chyba wywołać to w sposób
begin
:result := myFunc(params)
end;
Pytanie - jak dostać wartość :result?
Gdyby to było czyste PHP to dało by się zrobić coś takiego:
$query = "BEGIN :result := myFunc(:in_val); END;";
$curs = ocinewcursor($conn);
$stmt = ociparse ($conn, $query);
ocibindbyname($stmt, ":result", &$curs, -1, OCI_B_CURSOR);
ocibindbyname($stmt, ":in_val", &$value, -1);
ociexecute($stmt);
ociexecute($curs);
jak to zrobić w Doctrine (1.2)?
Pozdrawiam
Łukasz
Woźniak
Java Developer,
COM-PAN
Temat: Wywoływanie funckji PL/SQL z poziomu doctrine (1.2)
wywołanie można wykonać w sposób;
$connection = Doctrine_Manager::getInstance()->connection();
$statement = $connection->execute($sql);
$var_result = Array();
$j = 0;
while( $row = $statement->fetch(PDO::FETCH_NUM) )
{
// .... obsługa tablicy $row;
}
w sql masz czysty sql ;)Łukasz Woźniak edytował(a) ten post dnia 30.05.11 o godzinie 17:50
Tomasz Madeyski programista PHP
Temat: Wywoływanie funckji PL/SQL z poziomu doctrine (1.2)
tak, tylko wlasnie problem jest z tym czystym sql - jak powinno wygladac wywolanie funkcji zwracajacej wartosc przy zalozeniach:- nie mozna jej wywolac w formie select funkcja from dual
- parametry do funkcji musza byc przekazane przez "bind" (ze wzgledow bezpieczenstwa)
Łukasz Adamczewski Programista Symfony
Temat: Wywoływanie funckji PL/SQL z poziomu doctrine (1.2)
Tomasz Madeyski:
tak, tylko wlasnie problem jest z tym czystym sql - jak powinno wygladac wywolanie funkcji zwracajacej wartosc przy zalozeniach:
- nie mozna jej wywolac w formie select funkcja from dual
- parametry do funkcji musza byc przekazane przez "bind" (ze wzgledow bezpieczenstwa)
Jeśli chcesz mieć dostęp do api PDO z bindowaniem parametrów to spróbuj
$pdo = Doctrine_Manager::getInstance()->getCurrentConnection()->getDbh();
Zwraca Ci ono obiekt PDO, więc masz wszystko czego potrzebujesz.
i potem przykładowe bindowanie np. dla selecta, ale dla procedur i funkcji jest podobnie
$sth = $pdo->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < :calories AND colour = :colour');
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);
$sth->execute();
$rs = $stmt->fetchAll();
Tomasz Madeyski programista PHP
Temat: Wywoływanie funckji PL/SQL z poziomu doctrine (1.2)
Tak właśnie próbowałem, Oracle mi zwracał błąd, ale doszedłem do tego dlaczego - w moim przypadku funkcja wywoływana zwracała wartość integer.Tymczasem w kodzie metody bindParam klasy Doctrine_Adapter_Statement_Oracle mamy:
switch ($type) {
case Doctrine_Core::PARAM_STR:
$oci_type = SQLT_CHR;
break;
}
czyli Doctrine jest przygotowany na obsluge tylko Stringow - czyli wywolanie metody
$sth->bindParam(':calories', $calories, PDO::PARAM_INT); jest niestety bezzasadne.
Dopisalem linie, tak ze calosc wyglada tak:
switch ($type) {
case Doctrine_Core::PARAM_STR:
$oci_type = SQLT_CHR;
case Doctrine_Core::PARAM_INT:
$oci_type = SQLT_INT;
break;
}
i działa. Zgłosiłem sprawę tu. Zobaczymy czy cos z tego bedzie (uzywam Doctrine 1.2.4)
