# mysql procedure



## krackmoe (22. Jul 2010)

Hi

Ich hab folgende Procedure:


```
DELIMITER $$

DROP procedure IF EXISTS `setBezahlt`$$
CREATE PROCEDURE `setBezahlt` (arzID INTEGER, rechnungsID INTEGER)
BEGIN

DECLARE smscount,oldsms,smsnew INT;
SELECT anzahl INTO smscount FROM rechnung WHERE arzId = arzID AND rechnungsId = rechnungsID AND bezahlt IS NULL;
UPDATE rechnung SET bezahlt = "Ja" WHERE rechnungsId = rechnungsID AND arzId = arzID;
SELECT sms INTO oldsms FROM arzt WHERE id = arzID;
UPDATE arz SET sms = smsnew WHERE id = arzID;

END;
$$
DELIMITER ;
```

Ruf ich folgendermaßen auf:

```
getSimpleJdbcTemplate().query("call setBezahlt(?,?)",new ParameterizedRowMapper<Pat>() {
            public Pat mapRow(ResultSet rs, int i) throws SQLException {
                throw new UnsupportedOperationException("Not supported yet.");
            }
        }, arzID, rechnungsID);
```

1. ich brauch den ParameterizedRowMapper, aber ich muss ihn angeben...
2. Ich bekomm folgende Meldung zurück: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Result consisted of more than one row

Ich möcht aber gar nichts zurückbekommen... aber es gibt irgendwie kein andere Methode als query die dafür passt..

Jemand eine Idee?


----------



## Gast2 (22. Jul 2010)

Zum Ersten: kannst du dann nicht einfach [c]null[/c] als RowMapper übergeben?

Zum Zweiten: "To many rows" Error - ganz klassisch 


Wenn du ein [c]SELECT x INTO variable[/c] machst, musst du drauf achten das es nur ein Result des Queries gibt. Sonst müsstest du in einen Tabellen typ selektieren. 

MySQL :: MySQL 5.1 Reference Manual (Online Help) :: 8.8.3.3 SELECT ... INTO-Anweisung


----------



## ign0rant (22. Jul 2010)

Du möchtest SimpleJdbcTemplate.update statt query verwenden.


----------



## Marcinek (23. Jul 2010)

OffTopic:

Hallo,

es gibt in der Informatik eine "3-Schichten" Architektur

Persitence <=> Model / Fachlogik <=> Darstellung

Und du packst gerade deine Fachlogik in die Persitenz. Wenn nun sich die Logik ändert, dann musst du sowohl DB als auch dein Programm updaten.

Das kann schon unangenehm werden.

Vor allem dann, wenn du deine DB wechseln möchtest, dann musst du alle stored procedures anpassen.

Gruß,

Martin


----------



## krackmoe (23. Jul 2010)

Ja aber ohne Procedure, muss ich das ja in den Klassen dann auch anpassen?


----------



## Marcinek (23. Jul 2010)

Aber nur an einer Stelle.

Und bei einem wechsel einer DB musst du nicht die Prozeduren in der DB ändern. Diese haben meist pro DB eine andere Syntax.

SQL ist dabei fast überall gleich.

Was ist, wenn du die Methoden überlagern / überschreiben willst?

Du bist hier an der Stelle stark eingeschränkt.


----------

