Schrift
[thread]3535[/thread]

Perl/DBI - UPDATE "hängt"



<< |< 1 2 >| >> 19 Einträge, 2 Seiten
ptk
 2005-02-01 17:02
#32976 #32976
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Mit DBI_TRACE debuggen. Wie, das steht in der Doku zu DBI.
format_c
 2005-02-01 17:33
#32977 #32977
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Du hast doch entweder den interessanten Teil weggelassen, oder die DEBUG Stufe ist zu nierdig. Außerdem würde ich das Update so machen wenns nicht gerade interiert ausgeführt wird:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
my $affected_rows = $dbh->do(
q{
UPDATE DGKTO_BASIS
SET SVT_BEITRAGSKONTONUMMER = ?
WHERE VERSICHERUNGSTRAEGERCODE = ? and DIENSTGEBERKONTONUMMER = ?
},
undef,
$upd,
$key1,
$key2
) or die $dbh->errstr();


Gruß Alex
nes
 2005-02-01 17:50
#32978 #32978
User since
2005-01-24
14 Artikel
BenutzerIn
[default_avatar]
Es sieht leider mit Debug-Level 9 auch kaum anders aus. Ich stell mal ein umfangreicheres Log rein, mit DBI_TRACE = 9

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
main::(mist.pl:16):     my $sth = $dbh->prepare(q{
main::(mist.pl:17): UPDATE DGKTO_BASIS
main::(mist.pl:18): SET SVT_BEITRAGSKONTONUMMER = ?
main::(mist.pl:19): WHERE VERSICHERUNGSTRAEGERCODE = ? and DIENSTGEBERKO
NTONUMMER = ?})
main::(mist.pl:20): || die "Can't prepare statement: $DBI::errstr";
DB<1>
>> prepare DISPATCH (DBI::db=HASH(0x2352d0c) rc1/1 @2 g0 ima201 pid#4048
) at mist.pl line 16
-> prepare for DBD::Oracle::db (DBI::db=HASH(0x2352d0c)~0x235bdb8 '
UPDATE DGKTO_BASIS
SET SVT_BEITRAGSKONTONUMMER = ?
WHERE VERSICHERUNGSTRAEGERCODE = ? and DIENSTGEBERKONTONUMMER = ?') thr#0183
F32C
New DBI::st (for DBD::Oracle::st, parent=DBI::db=HASH(0x235bdb8), id=)
dbih_setup_handle(DBI::st=HASH(0x216c85c)=>DBI::st=HASH(0x235bd1c), DBD::Ora
cle::st, 216c934, Null!)
dbih_make_com(DBI::db=HASH(0x235bdb8), DBD::Oracle::st, 240) thr#0183F32C
dbih_setup_attrib(DBI::st=HASH(0x235bd1c), Err, DBI::db=HASH(0x235bdb8)) SCA
LAR(0x1a5e2c8) (already defined)
dbih_setup_attrib(DBI::st=HASH(0x235bd1c), State, DBI::db=HASH(0x235bdb8)) S
CALAR(0x1a5e340) (already defined)
dbih_setup_attrib(DBI::st=HASH(0x235bd1c), Errstr, DBI::db=HASH(0x235bdb8))
SCALAR(0x1a5e304) (already defined)
dbih_setup_attrib(DBI::st=HASH(0x235bd1c), Debug, DBI::db=HASH(0x235bdb8)) 0
(already defined)
dbih_setup_attrib(DBI::st=HASH(0x235bd1c), FetchHashKeyName, DBI::db=HASH(0x
235bdb8)) 'NAME' (already defined)
dbih_setup_attrib(DBI::st=HASH(0x235bd1c), HandleError, DBI::db=HASH(0x235bd
b8)) undef (not defined)
dbd_preparse scanned 3 distinct placeholders
dbd_st_prepare'd sql f5
dbd_describe skipped for non-select (sql f5, lb 80, csr 0x234d564)
<- prepare= DBI::st=HASH(0x216c85c) at mist.pl line 16
main::(mist.pl:22): my $upd = "00000000099";
DB<1>
main::(mist.pl:23): my $key1 = "04";
DB<1>
main::(mist.pl:24): my $key2 = "00000015";
DB<1>
main::(mist.pl:26): $sth->execute($upd, $key1, $key2) or die $dbh->errstr;
DB<1>
>> execute DISPATCH (DBI::st=HASH(0x216c85c) rc1/1 @4 g0 ima41 pid#4048)
at mist.pl line 26
-> execute for DBD::Oracle::st (DBI::st=HASH(0x216c85c)~0x235bd1c '000000000
99' '04' '00000015') thr#0183F32C
bind :p1 <== '00000000099' (type 0)
bind :p1 <== '00000000099' (size 11/12/0, ptype 4, otype 1)
bind :p1 <== '00000000099' (size 11/11, otype 1, indp 0)
bind :p1 done
bind :p2 <== '04' (type 0)
bind :p2 <== '04' (size 2/3/0, ptype 4, otype 1)
bind :p2 <== '04' (size 2/2, otype 1, indp 0)
bind :p2 done
bind :p3 <== '00000015' (type 0)
bind :p3 <== '00000015' (size 8/9/0, ptype 4, otype 1)
bind :p3 <== '00000015' (size 8/8, otype 1, indp 0)
bind :p3 done
dbd_st_execute (for sql f5 after oci f62, out0)...


Mehr kommt nicht - an der Stelle hängt er schon.

Und ja, wird mir eh nichts anderes über bleiben als das mit $dbh->do(...) zu machen, wobei ich aber befürchte, daß der Script dadurch sehr langsam wird. Es kann u.U. um bis zu eine Million Datensätze gehen, was ich hier gepostet hab war ja nur ein kleiner Ausschnitt des wirklichen Scripts.

Ich hab Active Perl v5.6.1 für MSWin32-x86-multi-thread, build 638 - plus den dazugehörigen Oracle Modulen. Ich befürchte schon, daß die defekt sind ...

Wie gesagt, wird mir wohl eh nichts anderes überbleiben als es mit $dbh->do(...) zu versuchen, die Zeit um mich lang mit der Installation rumzuspielen hab ich leider grad nicht. *g*

lg., nes
nes
 2005-02-01 18:46
#32979 #32979
User since
2005-01-24
14 Artikel
BenutzerIn
[default_avatar]
Hallo nochmals,

imho kann es nicht an meiner lokalen Perl-Installation liegen.

Ich habe den Script unverändert auf eine AIX in unserem Netzwerk kopiert, funktioniert genauso nicht! Gleicher Fehler. IMHO muss es also wohl irgendwie an Oracle liegen?!?

Zum Vergleich, diverseste DB-Lade-Scripts (INSERT), ebenfalls in Perl geschrieben, funktionieren problemlos. Reines lesen von der DB ebenfalls. Nur das 'UPDATE' eben nicht, weder auf der AIX, noch auf meinem Win-Rechner. Unabhängig davon ob ich's mit 'prepare', oder direkt mit 'do' ausführen will.

Hätte bitte noch jemand eine Idee?

Verzweifelt den Fehler suchend, nes
format_c
 2005-02-02 09:16
#32980 #32980
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Ein ausführen auf der Console (Weis nicht ob Oracle so was hat) würde IMHO auch sehr interessant sein.

Kannst du mal ne test Tabelle anlegen und versuchen ob da ein UPDATE funktioniert?
Was ich mir noch denken könnte wären Berechtigungsprobleme oder falsche Datentypen.

Gruß Alex
Dubu
 2005-02-03 16:42
#32981 #32981
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
(verschoben zu Datenbanken)
nes
 2005-02-01 16:54
#32982 #32982
User since
2005-01-24
14 Artikel
BenutzerIn
[default_avatar]
Hallo allseits,

Folgender Script bleibt beim Abarbeiten beim "$sth->execute" einfach stehen und tut nichts mehr. Keine Eingabe möglich, nichts, er kommt einfach aus dem execute nicht mehr zurück ... und ich hab leider keine Ahnung wieso bzw. auf was ich noch achten muesste:

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
use strict;
use DBI;
use DBD::Oracle;

my $db_user="xx";
my $db_pass="xxxxxxxx";
my $db_host="xxxxxx";

my $dbh = DBI->connect( "dbi:Oracle:$db_host", $db_user, $db_pass,
) || die "Database connection not made: $DBI::errstr";

# $dbh->{RaiseError} = 1;
# $dbh->{PrintError} = 1;
# $dbh->{AutoCommit} = 0;

my $sth = $dbh->prepare(q{
UPDATE DGKTO_BASIS
SET SVT_BEITRAGSKONTONUMMER = ?
WHERE VERSICHERUNGSTRAEGERCODE = ? and DIENSTGEBERKONTONUMMER = ?})
|| die "Can't prepare statement: $DBI::errstr";

my $upd = "00000000099";
my $key1 = "04";
my $key2 = "00000015";

$sth->execute($upd, $key1, $key2) or die $dbh->errstr;

print "ok";


Wie gesagt, zum "print" kommt er nie, im Debugger ist schön zu sehen, dass er beim execute stehenbleibt. Danach ist nur mehr das Abbrechen mittels Ctrl+C möglich. Der gleiche Befehl mit Oracle SQL*Plus funktioniert (mit gleichen Werten) völlig problemlos ...

Any hints?

Danke, nes
nes
 2005-02-01 17:08
#32983 #32983
User since
2005-01-24
14 Artikel
BenutzerIn
[default_avatar]
Hallo ptk,

dazu muesste mir aber die Ausgabe irgendwas sagen, das tut's leider nicht ... Hier die Ausgabe mit DBI_TRACE = 2

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
main::(mist.pl:24):     my $key2 = "00000015";
DB<1>
main::(mist.pl:26): $sth->execute($upd, $key1, $key2) or die $dbh->errstr;
DB<1>
-> execute for DBD::Oracle::st (DBI::st=HASH(0x216c384)~0x23849f8 '000000000
99' '04' '00000015') thr#0183F32C
bind :p1 <== '00000000099' (type 0)
bind :p1 <== '00000000099' (size 11/12/0, ptype 4, otype 1)
bind :p2 <== '04' (type 0)
bind :p2 <== '04' (size 2/3/0, ptype 4, otype 1)
bind :p3 <== '00000015' (type 0)
bind :p3 <== '00000015' (size 8/9/0, ptype 4, otype 1)
dbd_st_execute (for sql f5 after oci f62, out0)...


lg., nes
format_c
 2005-02-01 17:34
#32984 #32984
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Ob das mit dem undef bei DBD::Oracle auch so ist siehtst du in der Doku.

Gruß Alex
nes
 2005-02-01 18:01
#32985 #32985
User since
2005-01-24
14 Artikel
BenutzerIn
[default_avatar]
Hallo ALex,

[quote=format_c,01.02.2005, 16:33]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
my $affected_rows = $dbh->do(
q{
UPDATE DGKTO_BASIS
SET SVT_BEITRAGSKONTONUMMER = ?
WHERE VERSICHERUNGSTRAEGERCODE = ? and DIENSTGEBERKONTONUMMER = ?
},
undef,
$upd,
$key1,
$key2
) or die $dbh->errstr();
[/quote]
Hmpf - Gut gemeint, danke, aber das bringt genau den gleichen Fehler :(

Jetzt hab ich ein wirkliches Problem ...

lg., nes
<< |< 1 2 >| >> 19 Einträge, 2 Seiten



View all threads created 2005-02-01 17:02.