Stwórz profil

Musisz wpisać swoje imię
Musisz wpisać swoje nazwisko
Musisz wpisać poprawny e-mail
Musisz wpisać hasło (min. 8 znaków)
Musisz zaakceptować regulamin

Tomasz Madeyski programista PHP

Temat: Wywoływanie funckji PL/SQL z poziomu doctrine (1.2)

Witam

Mam 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
30.05.2011, 13:30

Ł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
30.05.2011, 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)
30.05.2011, 18:04

Ł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();
31.05.2011, 14:42

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)
31.05.2011, 20:46



Wyślij zaproszenie do