[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Jul 2002
    Beiträge
    331

    Procedure mit Datums Parameter aus SQLStatement aufrufen

    Moin moin,

    ich habe eine Problem ich will aus einem SQL Statement heraus eine Procedure aufrufen, die mir ein Datum aus einem Datum berechnet.
    Wenn ich sie "normal" aufrufe bekomme ich das richtige Datum zurück, wenn ich die Procedure nun aber innerhalb eines SQL Statements verwenden will mit einem Feld, welches das Datum enthält, bekomme ich folgende Fehlermeldung:

    Nachricht: [SQL0204] P_DATUM der Art *N in Bibliothek nicht gefunden. Ursache . . . . : P_DATUM der Art *N in Bibliothek wurde nicht gefunden. Ist der Teildateiname *ALL, ist die Tabelle nicht partitioniert. Handelt es sich um eine Anweisung ALTER TABLE und ist die Art *N, wurde eine Integritätsbedingung oder Partitionierung nicht gefunden. Ist dies keine Anweisung ALTER TABLE und ist die Art *N, wurde eine Funktion, eine Prozedur, ein Auslöser oder ein Sequenzobjekt nicht gefunden. Wurde eine Funktion nicht gefunden, ist P_DATUM das Serviceprogramm, das die Funktion enthält. Die Funktion wird nur gefunden, wenn der externe Name und der Verwendungsname exakt übereinstimmen. Im Jobprotokoll nach einer Nachricht suchen, die weitere Einzelheiten über den gesuchten Funktionsnamen und den nicht übereinstimmenden Namen enthält. Fehlerbeseitigung: Den Namen ändern und die Anforderung wiederholen. Ist das Objekt eine Knotengruppe, sicherstellen, dass DB2 Multisystem auf dem System installiert ist, und mit dem CL-Befehl CRTNODGRP eine Knotengruppe erstellen. Wurde eine externe Funktion nicht gefunden, das Groß-/Kleinscheibung des EXTERNAL NAME der Anweisung CREATE FUNCTION exakt mit der Groß-/Kleinschreibung des vom Serviceprogramm exportierten Namens übereinstimmen.

    Gruß
    Jo

  2. #2
    Registriert seit
    Oct 2013
    Beiträge
    171
    Höchstwahrscheinlich stimmt die Type des Übergabeparameters nicht.

  3. #3
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    ... nein, eine SQL Procedure kann nicht innerhalb eines SQL Statements aufgerufen werden.
    Dafür benötigst du eine SQL Function.

    lg Andreas

  4. #4
    Registriert seit
    Apr 2005
    Beiträge
    104
    Nein.

    Ich vemute (wie schon gesagt) vielmehr, daß bei den Parametern nicht sauber zwischen String und Date unterschieden wurde, und dann kanns sein, daß im interaktiven SQL ein automatisches Casting die Situation rettet, jedoch beim CREATE der Function bzw. Procedure nicht, weil da als erstes nach dem "Unterprogramm" mit der exakt interpretierten Signatur gesucht wird. Diese Suche ist leider gar nicht smart, und verzeiht keine Fehler. Sie sagt dann einfach, Funktion nicht gefunden.

    Der Unterschied zwischen Function und Procedure ist vor allem, daß die Procedure meistens was tut (Insert/update usw.), und daß sie über Parameter verfügt, während die Function meistens nichts tut, und meist nur über Input-Parameter und über ein Result, Result-Set der gar eine Result-Table verfügt (und keine Output-Parameter).

    Eine Function wird innerhalb einer Formel (im SQL) verwendet.
    Eine Prozedur wird innerhalb von SQL mit CALL aufgerufen.

    PS: Achte auch darauf, bei Änderungen einer SQL-Function oder SQL-Procedure die vorhergehende Version mit DROP zu entfernen, sonst ergibt sich später ein Chaos. In der Source gebe ich immer zuerst den DROP-Befehl mit der Signatur der aktuellen Version an, ...

  5. #5
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Wie sieht den die Paramter-Definition (oder das CREATE-Statement) der Funktion aus?

    Wenn Du es aus einem SQL-Statement aufrufen willst, muss es sich um eine (User Defined) Function handeln, d.h. einen Rückgabe-Wert ausgeben werden.
    Eine (Stored) Procedure dagegen wird immer mit einem CALL-Befehl aufgerufen.

    Sowohl Functions als auch Procedures können überladen werden, d.h. es können mehrere Prozeduren bzw. Funktionen mit dem gleichen Namen jedoch unterschiedlicher Parameter-Definition in der geleichen Bibliothek/Schema vorhanden sein.

    Aus diesem Grund muss der Parameter exakt, d.h. mit dem definierten Datentypen (die Länge wird nicht geprüft) übergeben werden. Ggf. muss der Parameter bei Übergabe explizit konvertiert/gecastet werden.

    Werden Konstanten oder Ausdrücke übergeben, so wird z.B. bei Zahlen ohne Nachkommastellen der Integer-Datentyp (und nicht etwa der DECIMAL-Datentyp angenommen). Für SQL sind Integer und Decimal unterschiedliche Datentypen und damit wird die Funktion nicht gefunden.

    Ähnliches gilt bei alphanumerischen Konstanten. Diese werden als VARCHAR-Datentyp (variable Länge) und nicht als CHAR-Datentyp (fixe Länge) interpretiert. Für SQL sind das unterschieldiche Datentypen und die Funktion wird u.U. nicht gefunden.

    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

  6. #6
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Zitat Zitat von UFK Beitrag anzeigen
    Nein.

    Ich vemute (wie schon gesagt) vielmehr, daß bei den Parametern nicht sauber zwischen String und Date unterschieden wurde, und dann kanns sein, daß im interaktiven SQL ein automatisches Casting die Situation rettet, jedoch beim CREATE der Function bzw. Procedure nicht, weil da als erstes nach dem "Unterprogramm" mit der exakt interpretierten Signatur gesucht wird. Diese Suche ist leider gar nicht smart, und verzeiht keine Fehler. Sie sagt dann einfach, Funktion nicht gefunden.
    Eine SQL Prozedur kann nur mit einem CALL aufgerufen werden.
    Eine SQL Prozedur kann nicht innerhalb eines SQL Statements wie SELECT, INSERT, ... aufgerufen werden. Das geht nur mit einer SQL Funktion.
    Man kann eine SQL Funktion vorgelagert verwenden, die dann die SQL Prozedur aufruft, wenn dies notwendig ist.

    Zitat Zitat von UFK Beitrag anzeigen
    Der Unterschied zwischen Function und Procedure ist vor allem, daß die Procedure meistens was tut (Insert/update usw.), und daß sie über Parameter verfügt, während die Function meistens nichts tut, und meist nur über Input-Parameter und über ein Result, Result-Set der gar eine Result-Table verfügt (und keine Output-Parameter).
    Eine SQL Prozedur kann genauso über ein (oder sogar mehrere) Cusor Result-Sets (Select Abfragen) verfügen.

    Zitat Zitat von UFK Beitrag anzeigen
    PS: Achte auch darauf, bei Änderungen einer SQL-Function oder SQL-Procedure die vorhergehende Version mit DROP zu entfernen, sonst ergibt sich später ein Chaos. In der Source gebe ich immer zuerst den DROP-Befehl mit der Signatur der aktuellen Version an, ...
    Wer 7.1 hat kann auch mit CREATE OR REPLACE FUNCTION/PROCEDURE arbeiten.

    lg Andreas

Similar Threads

  1. Performance bei MI Aufrufen
    By schatte in forum NEWSboard Programmierung
    Antworten: 10
    Letzter Beitrag: 30-11-14, 15:23
  2. ILE aus /36 aufrufen
    By Norbertf in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 14-10-14, 20:32
  3. QRY und PARAMeter
    By HoScHiE in forum IBM i Hauptforum
    Antworten: 28
    Letzter Beitrag: 17-01-08, 10:35
  4. Client Access aufrufen und ein Pgm mittgeben
    By Robi in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 08-04-03, 07:40
  5. Batch-Programm aus RPG aufrufen?
    By hansr in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 28-11-02, 16:38

Berechtigungen

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