Font
[thread]3547[/thread]

Mit Perl auf DB , Like Befehl funzt nicht

Readers: 2


<< >> 10 entries, 1 page
format_c
 2005-03-15 15:38
#33066 #33066
User since
2003-08-04
1706 articles
HausmeisterIn
[Homepage] [default_avatar]
Kannst du mal ein definives Beispiel mit Code nennen. meine Kristalkugel ist heute irgendwie dunkel.

Gruß alex
Relais
 2005-03-15 15:54
#33067 #33067
User since
2003-08-06
2244 articles
ModeratorIn
[Homepage] [default_avatar]
Du hast vergessen, den Fehler zu liefern, den Du dabei bekommst.

Mit Perl hat es auch nix zu tun, ins Datenbankenforum verschoben.
Erst denken, dann posten --
26. Deutscher Perl- u. Raku -Workshop 15. bis 17.04.2024 in Frankfurt/M.

Winter is Coming
guest Gast
 2005-03-15 15:29
#33068 #33068
Hallo ich habe folgendes Problem,

ich habe mir 2 Module für eine Verbindung über ODBC auf eine Datenbank geladen.
dbi und mysql modul

wenn ich jetzt mit perl eine verbindung aufgebaut habe und mein sql statement absetzen will funktioniert das auch einwandfrei.
Probleme scheint aber der LIKE BEFEHL zu machen also zb.
where auto like "gelb"

Kann es sein das mein dbi:mysql modul den like befehl nicht unterstützt?
ich weiss leider nicht welche version es ist (ist schon ein bisschen länger her). Vielleicht kann mir jemand einen Link für eine aktuelle version geben. OS = Win XP

Hier mal das SQL Statement was unter SQL ENTERPRISE MANAGER ohne Probleme funktioniert!!

Code: (dl )
1
2
SELECT datee, timee, host, logname, methodr, url, find, replacee, code, bytesd, other, ua, referer FROM dbo.testlog INNER JOIN dbo.testcluster ON SUBSTRING(dbo.testcluster.find, 1, LEN(dbo.testcluster.find) - 1) = SUBSTRING(dbo.testlog.url, 1, LEN(dbo.testcluster.find) - 1)
WHERE dbo.testcluster.find Like '%*' or dbo.testcluster.find = dbo.testlog.url;


FÜR HILFE BIN ICH SEHR DANKBAR !!
GwenDragon
 2005-03-15 15:46
#33069 #33069
User since
2005-01-17
14666 articles
Admin1
[Homepage]
user image
LIKE wird von MySQL wird unterstützt.
Welche Version von MySQL-Server benutzt du?


JOIN-Syntax bei MySQL
http://dev.mysql.com/doc/mysql/de/join.html

Wenn du die Bedingungen klammerst (Vermutung)?
Code: (dl )
1
2
3
4
SELECT datee, timee, host, logname, methodr, url, find, replacee, code, bytesd, other, ua, referer 
FROM dbo.testlog
INNER JOIN dbo.testcluster ON ( SUBSTRING(dbo.testcluster.find, 1, LEN(dbo.testcluster.find) - 1) = SUBSTRING(dbo.testlog.url, 1, LEN(dbo.testcluster.find) - 1) )
WHERE ( dbo.testcluster.find LIKE  '%*' OR dbo.testcluster.find = dbo.testlog.url );
\n\n

<!--EDIT|GwenDragon|1110895044-->
kescou
 2005-03-15 16:56
#33070 #33070
User since
2005-03-15
3 articles
BenutzerIn
[default_avatar]
ok sorry, ich versuch es nochmal ein bisschen besser zu beschreiben

die datenbank ist eine microsoft sql datenbank.
in dieser hab ich 2 tabellen.

in der einen stehen ein haufen logfiles drin und in der anderen stehen URL's welche ersetzt werden sollen durch einen eindeutigen Namen.

zb. "www.test.de/artikel_1234.htm" im Log soll zu "ARTIKEL" werden

in der cluster tabelle steht also die url (artikel_1234.htm und das mit dem er es ersetzen soll -> ARTIKEL)

um das ganze einfacher zu halten un nich für jeden artikel einen eintrag zu machen steht dann nurnoch
"www.test.de/artikel_*" in der tabelle.

mit dem oben erwähnten sql statement kann ich im Query Analizer vom Enterprise Manager genau die Logs abfragen die als URL "artikel*" haben.
Wenn ich das ganze in meinem Perl script laufen lasse kommt zwar kein fehler aber das ergebnis stimmt nicht.
es kommen alle logfiles zurück.
ich glaube das es am LIKE befehl hängt weil ich mit "=" schonmal alle gleichen runtergeladen habe.

hier mal das PERL Script: BITTE nich auf dem Code rumhacken ;p

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#!/usr/bin/perl -w
use strict;
use Win32::ODBC;


my $infile = shift; #parameter
my $out_file = shift; #parameter
my $DSN = shift; #parameter

my $DataBase;
my @FieldNames;
my $Cols;
my %Data;
my $iTemp;
my $infile_zeile;

$DataBase = new Win32::ODBC($DSN);


#4. Programm starten


&suche();

sub suche {

open(INFILE, '<'.$infile) or die "Unable to open $infile";

my $sql_state;
$sql_state = <INFILE>;

open(OUTFILE, '>'.$out_file) or die "Unable to open $out_file";

if (!$DataBase->Sql($sql_state))
{
#Zuweisung der Feldnamen in das Array: @FieldNames
@FieldNames = $DataBase->FieldNames();

#Berechnung der Anzahl der Spalten.
$Cols = $#FieldNames-1;

#Zeilenweises Durchgehen der Datenbank per while-Schleife
while($DataBase->FetchRow())
{
#Die Daten der Zeile wird dem assoziativen Array DATA zugewiesen.
undef %Data;
%Data = $DataBase->DataHash();

for ($iTemp = 0; $iTemp <= $Cols; $iTemp++)
{
if($iTemp != $Cols)
{
print OUTFILE $Data{$FieldNames[$iTemp]};
print OUTFILE " ";
}
else
{
print OUTFILE $Data{$FieldNames[$iTemp]} ,"\n";
}
}
}
#Datenbank wird geschlossen.
$DataBase->Close();
}
}
close(INFILE);
close(OUTFILE);
Relais
 2005-03-15 17:04
#33071 #33071
User since
2003-08-06
2244 articles
ModeratorIn
[Homepage] [default_avatar]
[quote=Relais,15.03.2005, 14:54]Du hast vergessen, den Fehler zu liefern, den Du dabei bekommst.[/quote]
Und Du hast Dich schon wieder davor gedrückt, uns die Fehlermeldung mitzuteilen.

Ohne die können wir Dir raten zum Tee kochen heißes Wasser zu verwenden, aber keinen fachlichen Rat zu Deinem SQL geben.

Warum sprichst Du im ersten Posting von DBI und MySQL und nun von Microsoft SQL Server?
Erst denken, dann posten --
26. Deutscher Perl- u. Raku -Workshop 15. bis 17.04.2024 in Frankfurt/M.

Winter is Coming
GwenDragon
 2005-03-15 17:25
#33072 #33072
User since
2005-01-17
14666 articles
Admin1
[Homepage]
user image
[quote=Guest,15.03.2005, 14:29]ich habe mir 2 Module für eine Verbindung über ODBC auf eine Datenbank geladen.
dbi und mysql modul[/quote]

Quote
die datenbank ist eine microsoft sql datenbank.
in dieser hab ich 2 tabellen.

Also NICHT mysql. Oder was!?
Bitte das nächste Mal richtige Infos!

Erst suche ich Infos für MySQL raus und dann heißt es: MSSQL

Kauf dir lieber mal ein Perl-Buch über Datenbanken. :angry:\n\n

<!--EDIT|GwenDragon|1110900579-->
Strat
 2005-03-15 17:42
#33073 #33073
User since
2003-08-04
5246 articles
ModeratorIn
[Homepage] [default_avatar]
MySql ist nicht MsSql, sondern ein voellig anderes Produkt... und um an MsSql dranzukommen, braucht man entweder DBI + DBD::ODBC (nicht DBD::mysql!), oder eventuell DBI + DBD::Sybase. Es gibt auch weitere Module fuer den Zugriff auf MsSql, z.B. Win32::ODBC... und letzteres scheinst du zu verwenden...

Mach mal eine vernuenftige Fehlerabfrage der einzelnen Stellen, wo was schief gehen kann, dann kannst du die Fehlermeldung posten, die Relais haben will, und woraufhin dir dann vermutlich geholfen werden kann...

Code: (dl )
1
2
3
4
5
6
7
8
if ($DataBase->Sql($sql_state))
# fehler: aufgetreten
die "Fehler: ", $Database->Error();
} # unless
else {
#Zuweisung der Feldnamen in das Array: @FieldNames
# ...
} # else

Nebenbei: auch "new" liefert einen Returncode zurueck, den man auswerten kann... wenn $DataBase undef ist, ist beim connect was fehlgeschlagen... bist du dir 100% sicher, dass da nie was schiefgehen kann?
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
kescou
 2005-03-16 10:01
#33074 #33074
User since
2005-03-15
3 articles
BenutzerIn
[default_avatar]
Quote
Wenn ich das ganze in meinem Perl script laufen lasse kommt zwar kein fehler aber das ergebnis stimmt nicht.
es kommen alle logfiles zurück.


ok also das mit dem mysql scheint falsch zu sein.
habe es nur damals gleich mitinstalliert wusste nich das das keine verwendung nimmt.
sorry gwendragon!

also wie gesagt in perl kommt KEINE fehlermeldung ich bin das ganze auch schon zeilenweise durchgegangen.

kann es sein das das sql statement zulang ist um vollständig verarbeitet zu werden?
der Perl code funktioniert 100% mit jeder anderen Abfrage krieg ich genau das was ich brauch.
nur wenn ich in der where klausel "LIKE" benutze stimmt nichts mehr.

die abfrage stimmt auch sie geht ja im "SQL Server Enterprise Manager".

ich tippe auf das modul das es den "like befehl" nicht interpretieren kann oder falsch entschlüsselt.

habe es auch mal mit
Code: (dl )
WHERE     RIGHT(dbo.TestCluster.find, 1) = '*'

probiert aber hat leider auch nur alles zurück geliefert

Naja ich glaube ich kanns nich so richtig rüberbringen.
Es gibt halt keine Fehlermeldung.
mit enterprise manager gehts und mit perl über ODBC nicht.
;(
kescou
 2005-03-16 10:13
#33075 #33075
User since
2005-03-15
3 articles
BenutzerIn
[default_avatar]
Leck mich am ******

jetz hab ichs

die where bedingung war nachm zeilenumbruch dann hat er da nen /n reingehaun.

es gibt tage da möchte man sich am liebsten erschießen.

danke nochmal an alle das ihr mir geholfen habt!

Viel Spass beim Coden ;)
<< >> 10 entries, 1 page



View all threads created 2005-03-15 15:38.