Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Kohana]Problem z wywołaniem procedury składowanej mysql
askone
post 3.03.2010, 19:15:50
Post #1





Grupa: Zarejestrowani
Postów: 654
Pomógł: 121
Dołączył: 27.10.2007
Skąd: Poznań, Łódź

Ostrzeżenie: (0%)
-----


Hej

Wydaje mi się, że rzuciłem się z motyką na słońce, ale chciałem postępować tak jak zawsze robię przy bazach MSSQL i C#...

Zachciało mi się w aplikacji korzystać z procedur składowanych w bazie mysql. Procedury te pobierają odpowiednie parametry po czym zwracają wynik działania - I tutaj pojawia się problem smile.gif

Mam coś takiego:
  1. DROP PROCEDURE IF EXISTS sp_NewAuthor; DELIMITER //
  2. CREATE PROCEDURE sp_NewAuthor ( IN fName VARCHAR(25), IN lName VARCHAR(50), OUT result INT)
  3. MODIFIES SQL DATA
  4. BEGIN
  5. IF fName <> '' AND lName <> '' THEN
  6. IF NOT EXISTS (SELECT id FROM authors WHERE firstName = fName AND lastName = lName) THEN
  7. INSERT INTO authors VALUES (NULL, fName, lName);
  8. SELECT LAST_INSERT_ID() INTO result;
  9. END IF;
  10. END IF;
  11. END//
  12. DELIMITER ;


I to działa jeśli wywołuję z poziomu mySQL'a.

Ponieważ aplikacja powstaje w oparciu o framework Kohana korzystam z klasy Database i metody query. Robię to tak:
  1. $this->db->query('call sp_NewAuthor(?, ?, $result)', $fName, $lName)


Oczywiście w zmiennych $fName i $lName mam właściwe wartości.

W odpowiedzi dostaję błąd:
There was an SQL error: OUT or INOUT argument 3 for routine books.sp_NewAuthor is not a variable or NEW pseudo-variable in BEFORE trigger - call sp_NewAuthor('jacek', 'popielczyk', $result)

Wiem, że to z mySQL ale brakuje mi już pomysłów jak to ugryźć - może ktoś już spotkał się z takim problemem i wie jak go rozwiązać smile.gif

Z góry dziękuje za odpowiedzi i wszelkie sugestie smile.gif

Edit:
Udało mi się zlikwidować błąd mysql poprzez zapisanie query w poniższy sposób:
  1. $this->db->query('call sp_NewAuthor(?, ?, @result)', $fName, $lName)


Niestety gdy wyświetlam wartość zwracaną poprzez var_dump zawsze otrzymuję 0, pomimo iż powinienem otrzymać id wstawionego rekordu. Może teraz ktoś ma jakieś pomysłu smile.gif

Ten post edytował fly474 3.03.2010, 20:57:14


--------------------
Kliknij jeśli moja odpowiedź Ci pomogła.
askone.pl
Go to the top of the page
+Quote Post
phpion
post 4.03.2010, 08:02:06
Post #2





Grupa: Moderatorzy
Postów: 6 070
Pomógł: 860
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Chyba musisz potem zrobić:
  1. SELECT @result;
Go to the top of the page
+Quote Post
askone
post 4.03.2010, 08:46:21
Post #3





Grupa: Zarejestrowani
Postów: 654
Pomógł: 121
Dołączył: 27.10.2007
Skąd: Poznań, Łódź

Ostrzeżenie: (0%)
-----


Dzięki za sugestię - sprawdzę to rozwiązanie jak tylko wrócę do domu smile.gif

Edit:
Sprawdziłem podaną sugestię i ... nie działa sad.gif. Mogę powiedzieć, że rozwiązanie to działa perfekcyjnie w MySQL Managerze, niestety nie działa z poziomu PHP i Kohana.

Próbowałem tak:
Kod
$this->db->query('call sp_NewAuthor(?, ?, @result); select @result;', $fName, $lName);

i tak:
Kod
$this->db->query('call sp_NewAuthor(?, ?, @result);', $fName, $lName);
$this->db->query('select @result;');


W pierwszym przypadku otrzymuję błąd składniowy, w drugim zapytania działają, ale efekt jest żaden...

Liczę na pomoc, a sam nadal pytam Wujka Dobra Rada winksmiley.jpg

Ten post edytował fly474 4.03.2010, 18:03:35


--------------------
Kliknij jeśli moja odpowiedź Ci pomogła.
askone.pl
Go to the top of the page
+Quote Post
phpion
post 4.03.2010, 19:12:23
Post #4





Grupa: Moderatorzy
Postów: 6 070
Pomógł: 860
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Nie pytaj wujaszka tylko zajrzyj do dokumentacji Kohany:
http://docs.kohanaphp.com/libraries/database/result#current
  1. $this->db->query('SELECT @result AS result;')->current()->result;
Go to the top of the page
+Quote Post
askone
post 4.03.2010, 19:29:15
Post #5





Grupa: Zarejestrowani
Postów: 654
Pomógł: 121
Dołączył: 27.10.2007
Skąd: Poznań, Łódź

Ostrzeżenie: (0%)
-----


Dzięki smile.gif

Ale właśnie miałem się pochwalić, że też do tego doszedłem smile.gif
Zrobiłem to tak:
Kod
$this->db->query('call sp_NewAuthor(?, ?, @result);', $fName, $lName);
$result = $this->db->query('SELECT @result;')->result_array();
var_dump($result['result']);


Pozdrawiam


--------------------
Kliknij jeśli moja odpowiedź Ci pomogła.
askone.pl
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 23.04.2024 - 19:07