[NEWSboard IBMi Forum]

Hybrid View

  1. #1
    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, ...

  2. #2
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    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 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  3. #3
    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
  •