[NEWSboard IBMi Forum]

Hybrid View

  1. #1
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Hmmmm, also bei meiner Funktion klappt sowohl das Aufdröseln als auch das einfügen in eine Temporäre Tabelle als auch das wieder zusammensetzen.

    Hier ist meine Funktion (vielleicht hilfts ja):
    Code:
    Create Or Replace Function YourSchema.SplitStringIntoRows
                     (PARSTRING Varchar(1024),
                      PARSEP Varchar(1) Default ';')
       Returns Table(SPLITELEM Varchar(256))
       Language Sql
       Specific YOURSCHEMA.SPLITSTRR
       Not Deterministic
       Modifies Sql Data
       Called On Null Input
       Set Option Commit = *NONE,
                  Dbgview = *Source
                  
       Begin
          Declare POSSEP    Integer Default 1;
          Declare PrvPosSep Integer Default 0;
       
          Set ParString = Trim(ParString);        
          
       RepLoop: Repeat Set PrvPosSep = Case When PosSep <> 1 
                                         Then PosSep + 1
                                         Else 1 End;
                    If Length(Trim(ParString)) = 0 or ParString = ParSep
                       Then Leave RepLoop;
                    End If;                        
                    Set PosSep = Locate(ParSep, ParString, PrvPosSep);
                    If PosSep = 0 
                       Then Pipe(Trim(Substr(ParString, PrvPosSep)));
                            Leave RepLoop;
                    Else Pipe(Trim(Substr(ParString, PrvPosSep, PosSep - PrvPosSep)));     
                    End If;
             Until PosSep = 0 End Repeat;     
          Return;   
      End;
    ... und die folgenden Statements können problemlos ausgeführt werden:
    Code:
    Declare Global Temporary Table mytable
     ( MyId  Integer,
      MyText  VarChar(4096),
      MyElem  VarChar(256));
      
    Insert into mytable  
    With Data (Id, Text) as (Values(1, 'AB;CD;E;;FG;H'), 
                                   (2, 'A; B; C'), 
                                   (3, 'XXX;YY;ZZZZZ;AA'), 
                                   (4, ('AAA;D;DD;;BB;DD;EE')))  
    Select * 
       from Data, 
            Lateral(Select * from Table(SplitStringIntoRows(Text, ';')) x) c
       Where SplitElem like '%A%';
    
    With Data (Id, Text) as (Values(1, 'AB;CD;E;;FG;H'), 
                                   (2, 'A; B; C'), 
                                   (3, 'XXX;YY;ZZZZZ;AA'), 
                                   (4, ('AAA;D;DD;;BB;DD;EE')))  
    Select Id, ListAgg(SplitElem, ';') 
       from Data, 
            Lateral(Select * from Table(SplitStringIntoRows(Text, ';')) x) c
       Group By Id;
    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

  2. #2
    Registriert seit
    Oct 2015
    Beiträge
    109
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Dies könnte (mal wieder) ein CCSID-Problem sein, wenn der Job wieder auf CCSID 65535 steht.
    Gib mal definiert "varchar(nn) ccsid 273" oder besser noch NVARCHAR zurück, wobei 8K ja schon recht groß sind und sich bei NVarchar verdoppeln.
    Das hat leider auch nicht geholfen.

    Zitat Zitat von B.Hauser Beitrag anzeigen
    Hmmmm, also bei meiner Funktion klappt sowohl das Aufdröseln als auch das einfügen in eine Temporäre Tabelle als auch das wieder zusammensetzen.

    Hier ist meine Funktion (vielleicht hilfts ja):
    Code:
    Create Or Replace Function YourSchema.SplitStringIntoRows
                     (PARSTRING Varchar(1024),
                      PARSEP Varchar(1) Default ';')
       Returns Table(SPLITELEM Varchar(256))
       Language Sql
       Specific YOURSCHEMA.SPLITSTRR
       Not Deterministic
       Modifies Sql Data
       Called On Null Input
       Set Option Commit = *NONE,
                  Dbgview = *Source
                  
       Begin
          Declare POSSEP    Integer Default 1;
          Declare PrvPosSep Integer Default 0;
       
          Set ParString = Trim(ParString);        
          
       RepLoop: Repeat Set PrvPosSep = Case When PosSep <> 1 
                                         Then PosSep + 1
                                         Else 1 End;
                    If Length(Trim(ParString)) = 0 or ParString = ParSep
                       Then Leave RepLoop;
                    End If;                        
                    Set PosSep = Locate(ParSep, ParString, PrvPosSep);
                    If PosSep = 0 
                       Then Pipe(Trim(Substr(ParString, PrvPosSep)));
                            Leave RepLoop;
                    Else Pipe(Trim(Substr(ParString, PrvPosSep, PosSep - PrvPosSep)));     
                    End If;
             Until PosSep = 0 End Repeat;     
          Return;   
      End;
    ... und die folgenden Statements können problemlos ausgeführt werden:
    Code:
    Declare Global Temporary Table mytable
     ( MyId  Integer,
      MyText  VarChar(4096),
      MyElem  VarChar(256));
      
    Insert into mytable  
    With Data (Id, Text) as (Values(1, 'AB;CD;E;;FG;H'), 
                                   (2, 'A; B; C'), 
                                   (3, 'XXX;YY;ZZZZZ;AA'), 
                                   (4, ('AAA;D;DD;;BB;DD;EE')))  
    Select * 
       from Data, 
            Lateral(Select * from Table(SplitStringIntoRows(Text, ';')) x) c
       Where SplitElem like '%A%';
    
    With Data (Id, Text) as (Values(1, 'AB;CD;E;;FG;H'), 
                                   (2, 'A; B; C'), 
                                   (3, 'XXX;YY;ZZZZZ;AA'), 
                                   (4, ('AAA;D;DD;;BB;DD;EE')))  
    Select Id, ListAgg(SplitElem, ';') 
       from Data, 
            Lateral(Select * from Table(SplitStringIntoRows(Text, ';')) x) c
       Group By Id;
    Birgitta
    Mit diesem Split klappt es! Ich versuche noch heraus zu finden,
    weshalb meine Function da Probleme bereitet.

    Mein Problem ist aber behoben, vielen Dank!

Similar Threads

  1. SQL create function
    By KingofKning in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 09-10-15, 08:12
  2. Panel Function 20
    By KingofKning in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 15-07-15, 18:24
  3. SQL User Defined Function mit V5R1
    By Atomik in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 09-10-02, 09:57
  4. Remote Function Call -> SAP
    By areichelt in forum NEWSboard SAP
    Antworten: 2
    Letzter Beitrag: 24-02-02, 16:44
  5. Intersystem Communication Function
    By delphix in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 14-02-02, 16:14

Berechtigungen

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