Thread Verwendung von Datenbanklinks in SELECT-Abfrage (29 answers)
Opened by Hanna at 2009-09-23 15:00

sid burn
 2009-09-23 17:46
#126153 #126153
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Ich könnte mir gut vorstellen das man diese Datenbank Links nicht preparen kann. Ein prepare() schickt ein Statement zur Datenbank, und die Datenbank kann den Ausführungsplan dann erstellen damit er das nicht jedesmal neu machen müssen.

So wie ich das sehe ist dieser Datenbank Link was Oracle anbietet ein Link zu einer anderen Datenbank, und diese andere Datenbank muss nichtmal oracle sein. Zumindest steht das hier: http://download.oracle.com/docs/cd/B14117_01/serve...

Quote
The other database need not be an Oracle Database system.


Und Oracle kann ja schlecht einen ausführungsplan erstellen über fremde Datenbanken die nichtmal Oracle sind. Daher mit einem Datenbank Link wird es wahrscheinlich nicht gehen. Und wenn die Datenbank das nicht unterstützt gehen auch die Bind params, also die Syntax mit "?" nicht.

Der richtige weg wäre dann das du manuell quoten musst. Dafür musst du "$dbh->quote()" aufrufen und die rückgabe als Parameter einbauen.

Code: (dl )
1
2
3
my $id = $dbh->quote(10);
$sth = $dbh->prepare("SELECT PRODUCT_ID FROM schema.products\@dblink_to_testdb where (product_id=$id)");
$sth->execute($id);


Beachte hier.

1) Das du Doppelte anführungszeichen nutzt, sonst werden keine Parameter in String interpoliert.
2) Nicht um die Variable nochmal Hochkommata setzen. also soetwas
Code: (dl )
where (product_id='$id')
. Die quote() Funktion macht das automatisch.
3) Ohne Datenbank link solltest du lieber wieder die Syntax mit "?" nutzen.

EDIT:
4) Da "@" speziell ist muss das mit einem Backslash quoten und sonst auch achten das alle korrekt vorher mit quote() behandelt wird. Meine Empfehlung ist den String vorher mit sprintf() zusammen zu bauen und keine Variablen Interpolation zu nutzen, und dann alles prepare() übergeben, also soetwas.

Code: (dl )
1
2
3
my $stmt = sprintf 'SELECT * FROM asd WHERE id = %s', $dbh->quote($id);
my $sth = $dbh->prepare($stmt);
$sth->execute();


So sieht man auch sehr viel leichter wenn du mal eine Variable nutzt ohne vorher quote() zu nutzen. Wenn du direkt Variablen Interpolation nutzt und vorher quote() machst kann das schnell mal passieren das du auf einer variable quote() vergist, und du brauchst keine temporären variablen nur für das quoten.
Last edited: 2009-09-23 17:55:42 +0200 (CEST)
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de

View full thread Verwendung von Datenbanklinks in SELECT-Abfrage