[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Feb 2006
    Beiträge
    4

    Question SQL UDF Function ausführung mit Fehler

    Folgendes Problem:

    wir haben ein Userdefined function erstellt:
    ***************************************
    Funktion
    -- SQL generieren
    -- Version: V5R3M0 040528
    -- Generiert am: 20.07.06 07:49:00
    -- Relationale Datenbank: S441991A
    -- Standardauswahl: DB2 UDB iSeries

    SET PATH "QSYS","QSYS2","ZTSKDBFARO" ;

    CREATE FUNCTION ZTSKDBFARO.INT2DATE (
    INVAL INTEGER )
    RETURNS DATE
    LANGUAGE SQL
    SPECIFIC ZTSKDBFARO.INT2DATE
    DETERMINISTIC
    CONTAINS SQL
    CALLED ON NULL INPUT
    NO EXTERNAL ACTION
    RETURN ( DATE ( CONCAT ( CONCAT ( CONCAT ( CONCAT ( SUBSTR ( CAST ( INVAL AS CHAR ( 8 ) ) , 1 , 4 ) , '-' ) , SUBSTR ( CAST ( INVAL AS CHAR ( 8 ) ) , 5 , 2 ) ) , '-' ) , SUBSTR ( CAST ( INVAL AS CHAR ( 8 ) ) , 7 , 2 ) ) ) ) ;

    COMMENT ON SPECIFIC FUNCTION ZTSKDBFARO.INT2DATE
    IS 'Datumsumwandlung für Datumsabfragen im deutschen eingabeformat' ;
    ****************************************

    Wenn diese Funktion nun einem SQL-Statement benutz werden soll komm es immer zu einem Fehler.

    *****************************************
    Aufrufbeispiel:
    Select A2.A2AXNR AS A2AXNR_1, A1.A1AGNR AS A1AGNR_2,
    ZTSKDBFARO.INT2DATE(A1.A1DTAN) AS A1DTAN_3, ZTSKDBFARO.INT2DATE(A2.A2DTVO) AS A2DTVO_4,
    ZTSKDBFARO.INT2DATE(A2.A2DTBI) AS A2DTBI_5, ZTSKDBFARO.INT2DATE(A1.A1OPDT) AS A1OPDT_6,
    A1.A1OPKZ AS A1OPKZ_7, A2.A2AZLE AS A2AZLE_8, A2.A2LART AS A2LART_9,
    A2.A2LEC1 AS A2LEC1_10, A2.A2LEC2 AS A2LEC2_11, A2.A2LEC3 AS A2LEC3_12,
    A2.A2LEC4 AS A2LEC4_13, A2.A2LBE1 AS A2LBE1_14, A2.A2AZPP AS A2AZPP_15,
    A2.A2VKGP AS A2VKGP_16, A2.A2LART AS SORT1X, A2.A2LEC1 AS SORT2X,
    A2.A2LEC2 AS SORT3X, A2.A2LEC3 AS SORT4X, A2.A2DTVO AS SORT5X, A2.A2AXNR AS SORT6X
    from ZTSKDBFARO.A1#PF A1, ZTSKDBFARO.A2#PF A2
    where A1.A1AUNR = A2.A2AXNR and A1.A1FLGN =A2.A2FLGN and (A1.A1FOAR NOT LIKE 'ST'
    and ( A2.A2LART NOT LIKE 'BE' or A2.A2LART NOT LIKE 'BI' or A2.A2LART NOT LIKE 'LI' )
    and A2.A2LEC2 NOT LIKE '001' and A1.A1DTAN >= 20050101
    and (A1.A1DTAN <= 20050107 or A1.A1DTAN is NULL ))

    ******************************************

    Die Fehlermeldung die nun zurückkommt lautet:
    SQL0204] INT2DATE der Art *N in ZTSKDBFARO nicht gefunden. Ursache . . . . :
    INT2DATE der Art *N in ZTSKDBFARO wurde nicht gefunden.
    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 oder ein Auslöser nicht gefunden.
    Wurde eine Funktion nicht gefunden, ist INT2DATE 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.
    *******************************************

    Wir haben alles in der Fehlermeldung genannte überprüft, allerdings ohne Erfolg.

    Was läuft hier falsch?

    Danke

  2. #2
    Registriert seit
    Jul 2006
    Beiträge
    11
    Hallo,
    die UDFs werden nur gefunden, wenn auch der Aufrufparameter stimmt.

    Die INT2DATE Funktion will einen Integer haben. Ist das Feld aus der Tabelle denn ein Integer?
    Wenn nicht dann den Parameter ggf. casten.
    Z.B:
    ZTSKDBFARO.INT2DATE(INT(A1.A1DTAN))

    oder mehrere UDFs mit verschiedenen Parametertypen anlegen.

    Tschüß
    Benedikt

  3. #3
    Registriert seit
    Feb 2006
    Beiträge
    4
    Hallo Benedikt,

    Tip ging schon mal in die richtige Richtung !

    Allerdings: Die felder sind DECIMAL 8,0 wie mach ich denn dann den Typcast?

    Hab die UDF so umgebaut das sie DECIMAL(8,0) erwartet.

    Dank und Gruss
    Michael

Similar Threads

  1. Antworten: 11
    Letzter Beitrag: 18-07-16, 09:49
  2. Fehler im SQL bzw. Joblog
    By GraueEminenz in forum NEWSboard Programmierung
    Antworten: 1
    Letzter Beitrag: 10-07-06, 11:58
  3. SQL - Fehler
    By Kaufmann in forum IBM i Hauptforum
    Antworten: 11
    Letzter Beitrag: 28-06-06, 14:11
  4. problem mit eigener sql function
    By Stefan_Sk in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 26-05-06, 16:37
  5. SQL UDF Prob mit leeren Feldern
    By HACHIMAN in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 22-05-06, 09:48

Berechtigungen

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