Announcement

Collapse
No announcement yet.

Stored Procedure Result in where clause

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Stored Procedure Result in where clause

    Hallo zusammen,

    ich habe ein Problem, bei dem ich jetzt nach stundenlangem Suchen immer noch hänge.
    Und zwar habe ich eine Abfrage wie folgt:

    Code:
    select da.Id, 
              da.AuftragsNr, 
              (select Result from GetArtikel(da.Id)) as Artikelname
    from Druckauftrag da
      where Artikelname = 'test';
    GetArtikel ist folgende stored procedure:

    Code:
    CREATE PROCEDURE GETARTIKEL(
      DAID INTEGER)
    RETURNS(
      RESULT VARCHAR(255) CHARACTER SET NONE COLLATE NONE)
    AS
    DECLARE VARIABLE Artikel VARCHAR(255);
    BEGIN    
    Result = '';    
    for select a.Name from Artikelzuordnung az join Artikel a on az.ArtikelId = a.Id where az.AuftragId = :DAID into :Artikel    
    do begin      
    Result = Result || Artikel || ', ';    
    end    
    SUSPEND;  
    END
    Die Abfrage ohne die where Klausel funktioniert einwandfrei. Versuche ich jedoch nach der Spalte "Artikelname" zu filtern bekommen ich folgeden Fehlermeldung:

    Dynamic SQL Error.
    SQL error code = -206.
    Column unknown.
    Artikelname.

    Getestet habe ich das ganze mit Firebird 1.5 sowie 2.5 auf einem Window XP Professional sowie auf Debian 6.0.4 mit Firebird 2.5 und bekommen immer den gleichen Fehler.

    Besteht überhabt die Möglichkeit nach dieser erzeugten Spalte zu filtern?

    Danke für eure Hilfe
    Marcus

  • #2
    Ich bin kein Fb Fachmann, aber Deine Abfrage kann mit dieser Where Bedingung erstmal keine Daten zurückliefern, oder?.

    Die SP liefert minimal ein '' (Leerstring), falls wenigstens ein Wert vorkommt, wird ein Komma+Space angehängt. Das müsste in der Where Clause der Abfrage dann auch mitberücksichtigt werden. Ok, das ist nicht die Erklärung für die Fehlermeldung, aber vielleicht ein Ansatz.

    Letztlich kenne ich die Regeln nicht, nach denen FB den Zugriff auf diese Funktionen erlaubt. Vielleicht ist es auch ein Bug. Ich würde allerdings annehmen, dass eine Schachtelung des Selects Abhilfe schafft.

    So ungefähr
    Code:
    Select * from 
    (
    [Dein Select ohne Where Clause]
    )
    where artikelname = ...
    Gruß, defo

    Comment


    • #3
      Filtern nach erzeugten Spalten geht, Stichwort dazu ist having.
      Die geschachtelte select ist ebenso eine Möglichkeit.
      Wenn Du willst, kannst Du auch einen join zwischen der table und der sp bauen.
      Wie mein Vorschreiber schon ausgeführt hat, kommt aus der Abfrage aber eh nichts raus, die SP liefert entweder eine leere Zeichenkette zurück oder zumintest eine, die mit einem Komma endet. Das kann niemals test ergeben.
      Guck Dir für die SP mal select list an.

      Gruß aus dem hohen Norden

      Thomas

      Comment


      • #4
        Problem gelöst

        Hallo ihr beiden,

        danke für eure Hilfe. Das war der Schubs in die richtige Richtung. Das geschachtelte select funktioniert bestens.

        Code:
        select * from (
          select da.Id, 
                 da.AuftragsNr,
                 (select Result from GetArtikel(da.Id)) as Artikelname
          from Druckauftrag da
        ) where Artikelname like '%test%'
        Das als Ergebnis der sp niemals 'test' rauskommen kann stimmt. In dem Programm sieht die Suche auch ehr wie oben beschrieben aus.

        Den Lösungsansantz mit "having" habe ich mir eben angesehen, bin aber zu keinem Ergebis gekommen. Und da der Kunde drängelt nehme ich das geschachtelte select.

        Besten Dank noch mal.
        MfG
        Marcus

        Comment

        Working...
        X