DBI do-> syntax, \%attr und @bind_values
*Asilinda*
- perl
0 Daniel Thoma0 *Aslinda*0 Daniel Thoma0 *Aslinda*
Guten Abend!
CPAN's DBI Doku gibt als Syntax-Beispiel an:
$rows = $dbh->do($statement, %attr, @bind_values) or die ...
Das Beispiel dazu lautet:
my $rows_deleted = $dbh->do(q{DELETE FROM table WHERE status = ?}, undef, 'DONE') or die $dbh->errstr;
Wenn ich das der Reihenfolge nach mit dem Syntax vergleiche,
so musste undef hier %attr entsprechen. (oder? - stimmt das so?)
'DONE' ist wahrscheinlich @bind_values (oder? - bin unsicher)
Was genau macht der Bind_value 'DONE' hier denn überhaupt?
Was passiert mit DONE?
***** Frage zu %attr *****
Absolut unklar ist mir %attr
Was macht %attr denn überhaupt?
Alle meine Kollegen sagen mir nur "Ach, %attr brauchst eh nie,
einfach undef angeben und alles wird gut.
Das reicht mir aber nicht als Erklärung!
Auch in der DBI Doku findet sich kaum brauchbares
(zumindest nichts für mich verständliches *g*)
Danke für alle antworten,
egal wie kurz oder lang, danke danke danke!
Eure
*Asilinda*
Hallo *Asilinda*,
%attr ist eine Referenz auf einen Hash mit zusätzlichen Argumenten.
Da kann man z.B. details zur Fehlerbehandlung angeben und ähnliches.
Die @bind_values sind die Werte, die für die ? eingesetzt werden.
Es ist bequemer, Werte aus Variablen so einzusetzen, da man nicht auf '' achten muss.
Wenn ich das der Reihenfolge nach mit dem Syntax vergleiche,
so musste undef hier %attr entsprechen. (oder? - stimmt das so?)
ja das stimmt.
'DONE' ist wahrscheinlich @bind_values (oder? - bin unsicher)
das ebenfalls.
Alle meine Kollegen sagen mir nur "Ach, %attr brauchst eh nie
Wenn man nicht weiß, wozu es gut ist, braucht man es vielleicht auch nie ;-)
Man braucht es nicht besonders oft, aber gelegentlich schon.
Grüße
Daniel
Danke Daniel fürs antworten!!
%attr ist eine Referenz auf einen Hash mit zusätzlichen Argumenten.
Da kann man z.B. details zur Fehlerbehandlung angeben und ähnliches.
Hast du ein beispiel zur Hand wie das ausschaut?
ich würds toll finden zu sehen was damit geht anhand von einer code-zeile. Was mache ich mit %attr im genauen?
Ich würde es sehr gerne sehen!
Die @bind_values sind die Werte, die für die ? eingesetzt werden.
Es ist bequemer, Werte aus Variablen so einzusetzen, da man nicht auf '' achten muss.
nehmen wir an ich will mit Wildcard suchen.
delete werden soll nach B% und nach A_l_nd% oder rows die eine schule gleich wien haben
Also so:
DELETE FROM table WHERE pname LIKE 'B%' OR pname LIKE 'A_l_nd%' OR schule=wien;
Wie sieht das mit DBI aus?
ich mache mir sorgen über '?' bzgl. QUOTEN von % und _
und weiters wie man mehr als einen Bind_Value übergibt.
muss man da [] setzen?
(weils mehr als einer ist)
Bitte auch zeigen :)
Danke danke danke!!
*Aslinda*
Hallo *Aslinda*,
Hast du ein beispiel zur Hand wie das ausschaut?
$dbh->selectall_arrayref("SELECT * FROM bla", {MaxRows=>10});
Das würde z.B. maximal 10 Zeilen holen.
DBI->connect($data_source, $username, $auth, {RaiseErrors=>1})
Dadurch würde mit die() ein Fehler geworfen. Das verwende ich z.B. ganz gern .
Es gibt jede Menge solcher Parameter, da kommst Du aber an der Doku nicht vorbei.
Also so:
DELETE FROM table WHERE pname LIKE 'B%' OR pname LIKE 'A_l_nd%' OR schule=wien;
Wie sieht das mit DBI aus?
$dbh->do("DELETE FROM table WHERE pname LIKE ? OR pname LIKE ? OR schule", undef, "B%", "A_1_nd%", "wien");
Bei festen Werten wie in diesem Fall ist das nicht wirklich sinnvoll. Sinnvoll ist es, wenn Du stattdessen Variablen verwenden willst. Also z.B:
$dbh->do("DELETE FROM table WHERE schule=?", undef, $wert);
muss man da [] setzen?
Nein, da würdest Du eine Arrayreferenz übergeben.
Als bind values werden aber einfach alle Argumente nach den ersten beiden genommen.
Grüße
Daniel
nochmals Danke Daniel!
Ich verstehe, es gibt ein paar "Funktionen" die man dahin schreiben kann wo %attr steht.
MaxRows ist eines davon, RaiseErrors ein anderes.
Da gibt es wahrscheinlich viel mehr.
Wo finde ich eine Liste von allen "Funktionen" die ich immer
dort hin schreiben kann wo %attr steht?
In der doku finde ich eine solche liste nicht die klar sagt "Das kannst Du dahin schreiben wo %attr steht"
$dbh->do("DELETE FROM table WHERE pname LIKE ? OR pname LIKE ? OR schule", undef, "B%", "A_1_nd%", "wien");
Also Bind_Values kann ich unbegrenzt mit kommas getrennt schreiben?
Es wundert mich dass keine () Klammern notwendig sind um die
Bind_Values herum - oder sollte man das tun?
$dbh->do("DELETE FROM table WHERE schule=?", undef, $wert);
Wenn man mehrere Werte so wie oben hat, könnte man ja so machen:
$wert = '"B%", "A_1_nd%", "wien"'; richtig?
Danke :-)
*Aslinda*
Hallo *Aslinda*,
Ich nehme an, wir sprechen über Doku von DBI (perldoc DBI)
In der doku finde ich eine solche liste nicht die klar sagt "Das kannst Du dahin schreiben wo %attr steht"
Man kann da ja nicht überall alles angeben. "MaxRows" ergibt z.B. bei connect z.B. keinen Sinn.
Solche Attribute sind bei den entsprechenden Methoden angegeben, wo sie verwendet werden können.
"MaxRows" ist zum Beispiel bei prepare dokumentiert. Bei allen Methoden, die prepare mit einschließen, kann man das also verwenden.
Außerdem gibt es weiter unten noch eine Auflistung der Attribute, die verschiedenen Handles haben können. Die Attribute, die nicht nur lesbar sind, sollte man auch beim Erzeugen des entsprechenden Handles angeben können.
Die Doku ist nicht wirklich Anfängertauglich, das braucht ein weilchen, bis man da drin den Überblick gefunden hat.
Grüße
Daniel
Hallo Daniel
danke fürs antworten!
Eins fehlt mir noch zum verständnis:
my $myvar='"B%", "A_1_nd%", "wien"';
$dbh->do("DELETE FROM table WHERE pname LIKE ? OR pname LIKE ? OR schule=?", undef, $myvar);
Ist das so gut gelöst?
Der inhalt müsste theor. stimmen aber unhandlich ist es.
In wiefern geht das mit einer liste?
Wie löst du das wenn du mehrere dynamische werte übergeben willst
die in variablen stehen?
Danke :-)
*Aslinda*
Hallo *Aslinda*,
my $myvar='"B%", "A_1_nd%", "wien"';
Nein, so geht das nicht. Das ist ja ein String und somit nur ein Wert.
Du musst da ein Array nehmen: my @myvar = ("B%", "A_1_nd%", "wien");
In wiefern geht das mit einer liste?
Es geht nur mit einer Liste.
my @value = (2,3,4);
bla(1, @values, 5);
ist das selbe wie:
bla(1,2,3,4,5);
Bin mir nicht ganz sicher, ob Dir das klar ist. Wenn Du eine Liste als Element einer Liste angibst, wird da eine Liste draus.
Wie löst du das wenn du mehrere dynamische werte übergeben willst
die in variablen stehen?
Ist das Problem dadurch gelös? Ansonsten musst Du genauer erklären, was Du meinst.
Grüße
Daniel
Hallo Daniel
my @liste = ("B%", "A_1_nd%", "wien");
$dbh->do("DELETE FROM table WHERE pname LIKE ? OR pname LIKE ? OR schule=?", undef, "@liste"); # oder @liste ohne " " ???
Was sagst du nun dazu?
Danke,
*Aslinda*
Hallo *Aslinda*,
Was sagst du nun dazu?
Mit "" gibt man doch einen String an, einen einzelnen Wert. Perl wertet da zwar Arrays aus, aber das ändert daran nichts.
Du willst doch nicht einen, sondern mehrere Werte übergeben.
Mit meinem Beispiel aus dem letzten Posting solltest Du da jetzt aber wirklich selbst drauf kommen.
Grüße
Daniel