2009-04-02 13 views
0

Wir haben eine gespeicherte Prozedur geschrieben mit einer CL und RPG-Programmkombination. Wenn es lokal auf der iSeries aufgerufen wird, ist alles in Ordnung. Wenn das RPG-Programm extern aufgerufen wird (zum Beispiel von einem SQL-Frontend), kann es kein Haddle für die Spool-Datei erhalten, weil die Spool-Datei unter einer anderen (zufälligen?) Jobnummer und einem anderen Benutzer erscheint. Die Jobs werden im QUSRWRK-Subsystem als QUSER ausgeführt, die Spooldatei erhält jedoch die Benutzer-ID, deren Verbindung extern im Verbindungspool hergestellt wurde (d. H. USERA).iSeries Stored Procedure - Wie wird die Spool-Datei ausgegeben?

Gibt es eine Möglichkeit, die korrekte sppol-Datei während der Ausführung des Jobs zuverlässig zu handhaben (anstatt sich darauf zu verlassen, das letzte Spool-Feld aus dieser Warteschlange auszuwählen usw.).

Antwort

0

Ich brauche ein bisschen mehr Informationen, aber ich werde einige Annahmen treffen. Bitte klären Sie, ob ich falsch angenommen habe.

Der QUSER im QUSRWRK-Verhalten ist korrekt. Sie durchlaufen jetzt den SQL-Server (oder einen ähnlichen Server). Alle Verbindungen werden unter diesen Einstellungen ausgeführt.

Es gibt ein paar Ansätze.

1) Angenommen, das alles läuft in einem Job. Mit ‚*“ für die Auftragsinformationen sollten funktionieren.

2) Die andere Option ist RTVJOBA curuser (& ME) zu verwenden. Der aktuelle Benutzer ist die Person, die angemeldet ist. USER in diesem Fall nicht funktionieren würden.

0

Wenn Sie das RPG-Programm ändern können, können Sie die Job-Informationen von Program Status Data Structure abrufen, während die File Information Data Structure die Spool-Dateinummer aus dem offenen Feedback-Bereich hat.Ich bin mir jedoch nicht sicher, ob die Job-Informationen für den QUSER-Job sind Sie benötigen) oder für den USERA-Job (was Sie brauchen) Die Spool-Dateinummer könnte genug für eine Handle für nachfolgende Anrufe Print API

0

Der Job selbst weiß oder kann es herausfinden (siehe vorherige Antworten). Wenn alles andere fehlschlägt, ändern Sie das Programm so, dass eine Nachricht in eine Warteschlange gestellt wird, die die benötigten Informationen enthält. Lies es dir in Ruhe durch.

.

1

Wenn Sie eine gespeicherte Prozedur ausführen (die im Job QZDASOINIT ausgeführt wird), können Sie über die Programmstatusdatenstruktur nicht auf die gespoolte Ausgabe zugreifen. Diese gespoolten Dateien befinden sich in einem Job namens user/QPRTJOB, wobei der Benutzer der "aktuelle Benutzer" ist, der die gespeicherte Prozedur ausführt. Um auf die Spool-Dateien zuzugreifen, führen Sie api QSPRILSP aus, um eine Struktur zu erhalten, die Sie auf die Spool-Datei verweist.

Sowohl das Verhalten als auch die API sind im IBM Infocenter gut dokumentiert.

1

Ein Serverauftrag (z. B. eine Datenbankserverinstanz für ODBC/JDBC) wird unter einem Systembenutzerprofil ausgeführt. Bei gespeicherten Prozeduren ist der Systembenutzer normalerweise QUSER. Objekte, die in einem Job erstellt werden, gehören normalerweise dem Jobbenutzer.

Serveraufträge führen im Allgemeinen im Auftrag anderer Benutzer aus. Sie teilen dem Server-Job mit, welcher Benutzer beim Aufbau einer Verbindung ist. (Beachten Sie, dass ein bestimmter Serverjob während seiner Lebensdauer im Auftrag vieler verschiedener Benutzer funktionieren kann.)

Speziell für die gespoolte Ausgabe ist dies ein Problem, da das Spooling-Subsystem länger existiert als das "Web" "und bevor wir eine beträchtliche Anzahl von Benutzern hatten, die sich mit entfernten Datenbanken verbanden.Das Verhalten des Wechselns von Benutzer zu Benutzer ist einfach nicht Teil des Spooling-Subsystems, noch kann ein Anbieter wie IBM feststellen, wann eine Spool-Datei einem bestimmten Job-Benutzer oder Verbindungsbenutzer gehören sollte. (Spooling ist kein Hauptelement von Datenbankverbindungen.)

IBM hat die Ausgabe von Spooling für Benutzer angepasst, indem standardmäßig die Ausgabe von "Switched Users" in a job named QPRTJOB ausgegeben wurde, aber es passt nicht so wie gewünscht ein späteres RPG-Programm für die Ausgabe.

Wenn Sie jedoch einen gespeicherten Proc erstellen, der eine gespoolte Ausgabe generiert, kann der Proc auswählen, wem die Ausgabe gehört, und sich so dafür entscheiden, sie im selben Job zu behalten. Betrachten Sie diese Beispiel wird die Funktion ‚Run SQL Scripts‘ in die iSeries Navigator eingefügt werden kann:

call qsys2.qcmdexc ('OVRPRTF FILE(*PRTF) SPLFOWN(*JOB) OVRSCOPE(*JOB)' , 48); 
call qsys2.qcmdexc ('DSPMSGD RANGE(CPF9899) MSGF(QCPFMSG) OUTPUT(*PRINT)' , 51); 
call qsys2.qcmdexc ('DLTOVR FILE(*PRTF) LVL(*JOB)' , 28); 

Wenn Sie sie als Set laufen, sie Ausgabe zeigt die Attribute der Nachrichtenbeschreibung für CPF9899 gespult erstellen. Wenn Sie anschließend überprüfen, sollten Sie feststellen, dass QUSER jetzt eine Spooldatei mit dem Namen QPMSGD besitzt und sich im QZDASOINIT-Job befindet, der Ihre Remote-Datenbankanforderungen verarbeitet. Ein RPG-Programm in diesem Job kann in diesem Fall die Spool-Datei "* LAST" leicht finden. Wenn Sie das erste und das letzte CALL löschen und jetzt nur das mittlere CALL ausführen, sollten Sie feststellen, dass Sie die nächste Spooldatei besitzen.

(QUSER ist die IBM Standard Wenn Ihr System ein anderes Benutzerprofil verwendet, Ersatz, dass der Benutzer für "QUSER"..)

Empfehlung:

Ihre SP Ändern eines entsprechenden OVRPRTF Befehl zur Ausgabe von vor dem Spoolen der Ausgabe, die Sie im Job erfassen müssen, und zum Ausgeben von DLTOVR, nachdem die Ausgabe generiert wurde.

Sie könnten Befehle ähnlich den hier gezeigten verwenden, um eine Testprozedur zu erstellen. Experimentieren Sie mit verschiedenen OVRSCOPE() Einstellungen und mit FILE (* PRTF) oder mit speziell benannten Dateien. Erstellen Sie außerdem Ausgaben vor und nach den Übersteuerungsbefehlen, um zu sehen, wie unterschiedlich sie sich verhalten.

Beachten Sie, dass der Serverjob möglicherweise einen anderen Benutzer behandelt, nachdem Ihr SP beendet wurde (oder ein anderer SP später im Job aufgerufen wird). Sie sollten also sicherstellen, dass DLTOVR ausgeführt wird. (Das ist ein Grund, es in der Nähe des OVRPRTF zu halten.)