[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte

Hybrid View

  1. #1
    Registriert seit
    Feb 2001
    Beiträge
    20.254
    Eine COBOL-Subroutine kann von außen nicht direkt aufgerufen werden.
    COBOL hat nicht dieselbe Unterstützung bzgl. der Prozeduren wie ILERPG.

    SQL erlaubt jedoch, jedes beliebige Hauptprogramm per Call mit Parametern aufzurufen.
    Diese sind in COBOL dann in der Linkage-Section passend zu definieren und abzufragen.

    Aber besser ist es auf jeden Fall, eine SQL-Prozedur als externe Prozedur mit passenden Aufrufkonventionen zu erstellen. Diese externe Prozedur darf dann wiederum ein anderes Hauptprogramm gerne aufrufen. Das nennt man dann Wrapper-Programm.

    Um eine Prozedur eines Programmes aufzurufen, bedarf es für SQL der Registrierung einer Prozedur in einem Service-Programm.
    Dies ist auch in COBOL möglich, wenn man ein COBOL-Modul erstellt und dieses dann in ein Service-Programm verpackt.

    Die typische Subroutiene in COBOL wird mit PERFORM aufgerufen und entspricht im RPG der EXSR-Anweisung. Dahinter verbirgt sich nur leider kein CALL sondern ein GOTO mit einem Return, der wie ein "go to ." und einem passenden "Alter Label to proceed to" wirkt.
    Daher ist ein Perform auch nicht rekursiv aufrufbar.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  2. #2
    Registriert seit
    Oct 2019
    Beiträge
    32
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Eine COBOL-Subroutine kann von außen nicht direkt aufgerufen werden.
    COBOL hat nicht dieselbe Unterstützung bzgl. der Prozeduren wie ILERPG.

    SQL erlaubt jedoch, jedes beliebige Hauptprogramm per Call mit Parametern aufzurufen.
    Diese sind in COBOL dann in der Linkage-Section passend zu definieren und abzufragen.

    Aber besser ist es auf jeden Fall, eine SQL-Prozedur als externe Prozedur mit passenden Aufrufkonventionen zu erstellen. Diese externe Prozedur darf dann wiederum ein anderes Hauptprogramm gerne aufrufen. Das nennt man dann Wrapper-Programm.

    Um eine Prozedur eines Programmes aufzurufen, bedarf es für SQL der Registrierung einer Prozedur in einem Service-Programm.
    Dies ist auch in COBOL möglich, wenn man ein COBOL-Modul erstellt und dieses dann in ein Service-Programm verpackt.

    Die typische Subroutiene in COBOL wird mit PERFORM aufgerufen und entspricht im RPG der EXSR-Anweisung. Dahinter verbirgt sich nur leider kein CALL sondern ein GOTO mit einem Return, der wie ein "go to ." und einem passenden "Alter Label to proceed to" wirkt.
    Daher ist ein Perform auch nicht rekursiv aufrufbar.
    Beim Versuch der Erstellung einer externen Stored Procedure mit LANGUAGE COBOL hat es im ersten Effekt daran gescheitert das ich nicht mehr als 29 Parameter festlegen konnte. Zum Aufruf des Programmes sind mindestens 49 IN Parameter notwendig. Dies ist auch unabhängig von der Größe des Datenfeldes bei 29 war Schluß .. Liege ich da richtig oder ist der Layer 8 das Problem?

  3. #3
    Registriert seit
    Aug 2001
    Beiträge
    2.877
    Wie hast Du denn versucht die Routine zu definieren?
    Mit irgendeinem Tool?

    Lt. der aktuellen Dokumentation sind selbst bei der Registrierung von OPM Programmen 254 Parameter und bei ILE programms 2000 Parameter zulässig.

    Und auf welchem IBM i Release bist Du überhaupt?

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  4. #4
    Registriert seit
    Oct 2019
    Beiträge
    32
    Wie hast Du denn versucht die Routine zu definieren?
    Mit irgendeinem Tool? --> Nativ mit SQL auf dem System I Navigator

    Lt. der aktuellen Dokumentation sind selbst bei der Registrierung von OPM Programmen 254 Parameter und bei ILE programms 2000 Parameter zulässig. --> ja ist mir auch rätselhaft

    Und auf welchem IBM i Release bist Du überhaupt? --> System I Navigator Version 7 Release 1 / Windows 10 Pro ..

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.254
    Dann poste mal die SQL-Definition der Prozedur/Funktion und ebenso die Linkage Section deines COBOL-Programmes.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  6. #6
    Registriert seit
    Oct 2019
    Beiträge
    32
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Dann poste mal die SQL-Definition der Prozedur/Funktion und ebenso die Linkage Section deines COBOL-Programmes.
    --************************************************** ******************
    --SP TEST
    CREATE OR REPLACE PROCEDURE SCHEMA_NAME.STORED_PROCEDURE_NAME(
    IN //...52 Parameter...//
    )
    DYNAMIC RESULT SETS 1
    LANGUAGE COBOL
    SPECIFIC SCHEMA_NAME."STORED_PROCEDURE_NAME"
    DETERMINISTIC
    MODIFIES SQL DATA
    CALLED ON NULL INPUT
    EXTERNAL NAME 'SCHEMA_NAME/COBOL_PGM_NAME'
    PARAMETER STYLE GENERAL
    PROGRAM TYPE SUB;

  7. #7
    Registriert seit
    Oct 2019
    Beiträge
    32
    wieso kann ich in einer externen Procedure nur maximal 29 Parameter deklarieren? Gibt es da eine SYS Einstellung?

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.254
    "The maximum number of parameters can be further limited by the maximum
    number of parameters allowed by the language."

    Ändere dein Programmtyp auf CBLLE, dann kannst du im SQL COBOLLE angeben. Ggf. erlaubt dir SQL dann mehr Parameter. COBOL braucht im Gegensatz zu RPG da keine Konvertierung.

    Allerdings finde ich persönlich schon mehr als 10 Parameter bedenkenswert.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  9. #9
    Registriert seit
    Oct 2019
    Beiträge
    32
    Also grundsätzlich kann ich COBOL Programme per SQL aufrufen, das habe ich mit einem Testprogramm auch getestet. Funktioniert wunderbar, erzeugt eine Spool Datei mit einem Parameterwert den ich mir auch dann auch anzeigen lassen kann.

    Das mit dem Programmtyp probiere ich mal. Da es aber um mehrere COBOL Programme geht die ich damit ansprechen will wäre das ja schon fast ein komplettes Update auf die Sourcen ..

    Gibt es einen SYS-Wert der die Parameteranzahl limitieren könnte??

  10. #10
    Registriert seit
    Oct 2019
    Beiträge
    32
    Zitat Zitat von Fuerchau Beitrag anzeigen
    "The maximum number of parameters can be further limited by the maximum
    number of parameters allowed by the language."

    Ändere dein Programmtyp auf CBLLE, dann kannst du im SQL COBOLLE angeben. Ggf. erlaubt dir SQL dann mehr Parameter. COBOL braucht im Gegensatz zu RPG da keine Konvertierung.

    Allerdings finde ich persönlich schon mehr als 10 Parameter bedenkenswert.
    Also ich habe jetzt das SQL Statement mit "LANGUAGE COBOLLE" initialisiert und jetzt nimmt die DB2 alle 51 Parameter. *freu Jetzt noch auf der Gegenseite das COBOL Programm umkonvertieren?

  11. #11
    Registriert seit
    Oct 2019
    Beiträge
    32
    Zitat Zitat von B.Hauser Beitrag anzeigen
    Wie hast Du denn versucht die Routine zu definieren?
    Mit irgendeinem Tool?

    Lt. der aktuellen Dokumentation sind selbst bei der Registrierung von OPM Programmen 254 Parameter und bei ILE programms 2000 Parameter zulässig.

    Und auf welchem IBM i Release bist Du überhaupt?

    Birgitta
    Hast du da bitte mal einen Link für mich zur Dokumentation? Ich such mir da grade den Wolf ...

  12. #12
    Registriert seit
    Aug 2001
    Beiträge
    2.877
    Zitat Zitat von ChookaA Beitrag anzeigen
    Hast du da bitte mal einen Link für mich zur Dokumentation? Ich such mir da grade den Wolf ...
    Hier ist der Link: Create Or Replace Procedure (External)

    Man kann COBOL, CL oder auch RPG Programme zwar direkt aus einer SQL-Umgebung aufrufen, aber das geht allenfalls solange gut solange es sich nur um alphanumerische Parameter mit fixer Länge handelt. Deshalb wird immer empfohlen die (HLL) Programme oder Prozeduren als SQL Stored Procedures oder User Defined Functions zu registrieren.

    Was mir an Deinem SQL Skript (CREATE OR REPLACE PROCEDURE) auffällt ist zweierlei:
    1. Wenn Du in Deiner Umgebung mit Dezimal-Trennzeichen Komma arbeitest, musst Du, wenn das Komma als Trennzeichen im SQL-Befehl verwendet wird, ein Blank hinzufügen.
    IN IBELNR_ETTIK DECIMAL(1,0) müsste zu einem Fehler Führen, da nach dem Komma kein Blank folgt.
    2. Du gibst PROGRAM TYPE SUB and, was eigentlich nur für Prozeduren in Service-Programmen erlaubt ist. Ändere den PROGRAM TYP auf MAIN ab.

    Ansonsten kann ich mit deinem SQL-Skript auf meinem System problemlos eine Stored Procedure erstellen.

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

Similar Threads

  1. Anzahl offener Datenpfade mittels API auslesen
    By wilfried in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 19-07-17, 07:49
  2. Datei-Übertragung mittels Websphere MQ
    By jlindner in forum IBM i Hauptforum
    Antworten: 0
    Letzter Beitrag: 02-12-16, 14:02
  3. ILE aus /36 aufrufen
    By Norbertf in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 14-10-14, 20:32
  4. Erstellen einer STMF mittels CL-Programm
    By systemer in forum IBM i Hauptforum
    Antworten: 7
    Letzter Beitrag: 19-02-03, 08:33
  5. Entfernen externer HDD's mittels STRSST
    By vogeste0 in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 03-04-02, 13:21

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •