PDA

View Full Version : Objlck bei ILESQL



Seiten : [1] 2

Jamikl
06-05-04, 10:22
Hallo,

ich habe da mal wieder ein Problem.
In einem ILERPG Programm habe ich eine Dateioperation mit ILESQL (Fetch) usw.
Wenn ich das Programm verlasse habe ich aber immernoch einen Objlck auf die Datei die ich mit SQL verarbeitet habe.

Habe ich da vieleicht eine Möglichkeit dass ich das ganze explizit mache?? so wie in RPG mit Usercontrol??

Bin wie immer über jede hilfreiche Antwort dankbar!!!


Servas

Fuerchau
06-05-04, 10:30
Die SQL-Umgebung ist ggf. noch aktiv, sowie dein Programm (Aktivierungsgruppen).
Schließt du den Cursor ?
Verläßt du das Programm mit *INLR = *ON ?

Das Problem ist hier der SQL-Optimizer, der ODP's offenhält um wiederkehrende Zugriffe zu beschleunigen.
Solange also die Aktivierungsgruppe aktiv bleibt, bleibt auch der ODP offen.

Lösung: RCLACTGRP

Jamikl
06-05-04, 10:57
Hallo Fuerchau,

das Programm endet mit *INLR und auch der Cursor wird geschlossen. Ich habe auch schon RCLACTGRP getestet, aber der OBJLCK bleibt auf der Datei.

Ich habe in der Hilfe was von einem Befehl LOCK TABLE gelesen :confused: muss ich den setzten damit bei CLOSE die Datei geschlossen wird?

Ich hatte mich bislang noch nie so mit SQL auseinandersetzen müssen.

Danke

Fuerchau
06-05-04, 11:20
LOCK TABLE sperrt die gesamte Tabelle gegen Parallelverarbeitung (entspricht dem ALCOBJ ... *EXCL) und ist nicht die Ursache.

Über DSPJOB Auswahl 18 siehst du, welche Aktivierungsgruppen aktiv sind und über Auswahl 14 siehst du, welche Aktivierungsgruppe die Datei geöffnet hält.

Ist die Datei nicht in Auswahl 14, wird sie nicht vom SQL gesperrt sondern manuell durch ALCOBJ.

Fährst du mit Journal und Commit ?
Dann fehlt ggf. der Commit im Programm (nur nach Update/Delete/Insert).

Jamikl
06-05-04, 12:29
Ich sehe die Datei mit DSPJOB Auswahl 14 und habe auch schon versucht mit RCLACTGRP die Aktivierungsgruppe zu deaktivieren. Das klappt aber so nicht. Wenn ich den Namen 00000000002 angebe bekomme ich den Hinweis, dass das nicht gültig sei und mit RCLACTGRP *ELIGIBLE wird zwar eine Gruppe gelöscht aber nicht die die meine Datei sperrt.

Mit DLCOBJ habe ich die Sperre herausbekommen, heißt das dass nicht der SQL schuld ist :confused: .

Wegen deiner Antwort zu COMMIT:
Ich habe im Programm lediglich eine Leseschleife mit Declare und Fetch, kein Delete, update, oder Insert.


Über weitere Möglichkeiten wäre ich noch sehr dankbar.

B.Hauser
06-05-04, 12:32
Hallo,

1. Verwendest Du die Datei als Input oder Update-Datei?
Wenn Du die Datei nur als Input verwenden möchtest, füge am Ende deines Declare Statements "For Read Only" hinzu.
Anderenfalls wird die Datei als immer Update-Datei verarbeitet, wenn bestimmte Bedingungen nicht zutreffen. (z.B. wenn Dateien gejoint werden werden sie als Input-Files behandelt)
2. Unter welchem Commitent-Level arbeites Du?
Vielleicht fehlt irgendwo ein Commit

Birgitta

Fuerchau
06-05-04, 12:46
@Jamikl

/exec sql set option commit = *none
/end-exec

Füge auf jeden Fall obiges als 1. SQL-Anweisung ein.

Schließt du den Cursor ?

/exec sql close cursor
/end-exec

Wenn nicht ergänze den "set option" mit ", clossqlcsr = *modul"

In der H-Bestimmung würde ich eine Aktivierungsgruppe benennen:

h dftactgrp(*none) actgrp(myname)

Du erstellst beim Aufruf immer eine neue Aktivierungsgruppe. Besser ist es schon, einen Namen zu verwenden. Alle Programme mit dem gleichen Namen laufen dann in derselben und sind auch mit einem einzelnen RCLACTGRP zu deaktivieren.

Jamikl
06-05-04, 12:56
@ Fuerchau

Danke für deinen Lösungsansatz, aber die Antwort von B.Hauser hat mein Problem gelöst.
Ich wusste ja nicht, dass SQL die Dateien standardmäßig im UpdateModus öffnet.

@ B.Hauser

kurze knackige Antwort.....kurze knackige Lösung....kurz gesagt................RESPEKT!!!!


@ all

Danke, dass ich euch was von euerer Zeit rauben durfte!!!!

MFG Jamikl

Fuerchau
06-05-04, 13:43
Das kann ich so nicht ganz stehen lassen.

Wenn ich einen Cursor eröffne dann wird die Datei im Input-Modus eröffnet (über DSPJOB nachzuschauen).
Wenn ich den Cursor schließe, ist die Datei auch zu !

Ich kann daher Birgittas Aussage nicht nachvollziehen.

Um beim Select einen Open im Update-Modus hinzukriegen muss ich schon "for update" kodieren. Dann wird allerdings jeder Satz beim Lesen gesperrt um ggf. "update ... current of ..." zu verwenden.

Jamikl
06-05-04, 13:53
Da möchte ich dir rechtgeben!!
Ich habe mitlerweile festgestellt, dass dies an unserem Pre-PreCompiler hängt und ich weiß jetzt noch nicht wer von euch recht hat!
Es geht ja hier nicht darum wer der bessere ist ODER?????
Ich melode mich wenn ich das Problem entdeckt habe!!

schönen Tag noch!!