Ergebnis 1 bis 8 von 8

Thema: verschachtelte Case Abfrage

  1. #1
    ThommyW ist offline Neuer Benutzer
    Registriert seit
    03.06.2009
    Beiträge
    11

    Standard verschachtelte Case Abfrage

    Hallo,

    ich habe folgendes Problem.
    Ich bin totaler Anfänger was stored procedures angeht, jedoch relativ geübt, was Delphi und VBA angeht, sprechend ist mein Code ent-standen....
    Wie es scheint, wird die gesamte Funktionsbezeichnung von Postgres selber erstellt. Ich habe jedoch noch nicht verstanden, inwieweit die EIngangs oder Ergebnisargumente noch in den Deklarationen stehen müssen. Unklar ist mir auch noch inwieweit If - then Strukturen oder ähnliche Programm Strukturen problemlos neben SQL Abfragen stehen können.

    Könnte mir jemand helfen, den Syntax in folgender verschachtelter Case-Abfrage so zu korrigieren, dass es dem Datenbank PL-PG- SQL konform ist ? Irgendwie kriege ich immer eine Fehlermeldung. Zwar gibt es realtiv viele Info's zu stored procedures PL-PG-SQL im Internet, aber weniger zu PL-Pg-SQL als zu den anderen, so dass ich mir nicht sicher bin, ob da nicht auch was durcheinander geraten ist:

    Code:
    CREATE FUNCTION is_valid(pconreac, pconpro: text) RETURNS boolean AS 
    declare @Return boolean
    BEGIN
    Select pcon.pcontype as typepro
    from pcon
    where (pcon.symbol = pconpro);
    case
      when (pcon.typepro = 'SecondaryMaster')
       then 
        begin
        Select pcon.pcontype as typereac
        from pcon
        where (pcon.symbol = pconreac);
        case
        when (pcon.typereac = 'PrimaryMaster')
        then   @return = true;
        else
    @return = false;
        end case;
     when (pcon.typepro = 'Product')
       then 
        begin
        Select pcon.pcontype as typereac
        from pcon
        where (pcon.symbol = pconreac);
        case
        when (pcon.typereac = 'PrimaryMaster')
        then   @return = true;
        when (pcon.typereac = 'SecondaryMaster')
        then   @return = true;
        else
    @return = false;
        end case;
    when (pcon.typepro = 'MineralsSolids')
       then 
        begin
        Select pcon.pcontype as typereac
        from pcon
        where (pcon.symbol = pconreac);
        case
        when (pcon.typereac = 'PrimaryMaster')
        then   @return = true;
        when (pcon.typereac = 'SecondaryMaster')
        then   @return = true;
        else
    @return = false;
        end case;
     else
    @return = false;   
     
    case end;
    $$ LANGUAGE SQL;


    In dem Code geht es darum, dass in einer (hier nicht näher erwähnten Tabelle reactions) Einträge gemacht werden, die aus einer anderen Tabelle pcon entnommen werden und nur bestimmte charakteristiken besitzen dürfen. Wenn z.B. das Reactionendsprodukt pconpro den Status 'Secondary-Master' -species hat, dann werden als Reaktionsausgangsprodukte nur Einträge mit dem Status 'PrimaryMaster' zugelassen. Entsprechende Einschränkungen gelten auch für andere Spezies. Die Procedure soll dann in einem Trigger zu der Tabelle Reactions aufgerufen werden, wobei die erwähnten Variablen pconPro dann dort New.PconProduct und pconReac dem Eintrag New.PconReactant entsprechen sollen.

    Ich kenne die Postgres-SQL Dokumentation und habe 2 bis 3 Tutorials mir angeschaut, aber die betrafen entweder ganz andere Themen, waren zu einfach oder nicht ausführlich genug.

    Kann jemand neben Tipps zur Lösung dieser Aufgabe ein gutes Gratis-Tutorial empfehlen oder, falls nicht vermeidbar, auch ein wirklich gutes (und günstiges) Buch, das von ganz einfachen Anfängen zu komplexen Beispielen führt ?

    Vielen Dank für jede Hilfe.

    ThommyW

  2. #2
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von ThommyW Beitrag anzeigen
    Hallo,

    ich habe folgendes Problem.
    Ich bin totaler Anfänger was stored procedures angeht, jedoch relativ geübt, was Delphi und VBA angeht, sprechend ist mein Code ent-standen....
    Wie es scheint, wird die gesamte Funktionsbezeichnung von Postgres selber erstellt. Ich habe jedoch noch nicht verstanden, inwieweit die EIngangs oder Ergebnisargumente noch in den Deklarationen stehen müssen. Unklar ist mir auch noch inwieweit If - then Strukturen oder ähnliche Programm Strukturen problemlos neben SQL Abfragen stehen können.
    Also. Was meinst Du mit 'gesamte Funktionsbezeichnung von Postgres selber erstellt'?.

    Controllstrukturen: Was ist so schwer, mal die Doku zu lesen?
    PostgreSQL: Documentation: Manuals: PostgreSQL 8.3: Control Structures
    Ein CASE wirst Du dort nicht finden, nur hier: Control Structures

    Mit anderen Worten: entweder Dein CASE in IF ... THEN umschreiben oder auf 8.4 warten.

    Außerdem: diese Dinge hast Du nicht in SQL, sondern nur in PLPGSQL. Also solltest Du Deine Procs auch in dieser Sprache schreiben.



    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  3. #3
    ThommyW ist offline Neuer Benutzer
    Registriert seit
    03.06.2009
    Beiträge
    11

    Standard

    Hallo Andreas,

    zumindest habe ich meinen Projektleiter jetzt klargemacht, dass, auch wenn es um Trigger geht, es am sinnvollsten ist, die Tests als Stored procedure zu formulieren.

    ---Controllstrukturen: Was ist so schwer, mal die Doku zu lesen?
    ---PostgreSQL: Documentation: Manuals: PostgreSQL 8.3: Control ----- Structures
    ----Ein CASE wirst Du dort nicht finden, nur hier: Control Structures


    Da Du den Code sicherlich aufmerksam gelesen hast, hast Du sicherlich bemerkt, dass ich "end case" und die "when .. then" Struktur verwendet habe. Dies rührt daher, dass ich mir einige procedures von postgresSQL angesehen habe..... wenn auch nicht nur in der doku.
    In der Tat setzen wir PostgresSQL 8.1.5 ein, danke für den Hinweis. Mir war nicht aufgefallen, dass da so gravierende Unterschiede sind. Ein Upgrade auf 8.3 oder 8.4 könnte bei der nächsten Servermigration erfolgen, aber das wird noch dauern.....

    Und ich weiss nicht wieso dass falsch rüber gekommen ist, aber
    "procedure in PL pg SQL schreiben"
    hey, ...... das ist genau das was ich will und dachte bereits weitgehend getan zu haben, wenn auch mit Fehlern....

    Ok, dann schreibe ich sie mal nach if .. then um..

    Schon mal danke

    Thomas

  4. #4
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von ThommyW Beitrag anzeigen
    Hallo Andreas,


    Da Du den Code sicherlich aufmerksam gelesen hast,
    Nein. Nur flüchtig überflogen, da schon in der 2. Zeile mehr als nur ein Fehler ist.


    hast Du sicherlich bemerkt, dass ich "end case" und die "when .. then" Struktur verwendet habe.
    Ja.

    Dies rührt daher, dass ich mir einige procedures von postgresSQL angesehen habe..... wenn auch nicht nur in der doku.
    Ich finde ja, daß man insbesondere bei Syntaxfragen erstmal NUR die Doku befragen sollte. Warum? Stell Dir vor, ein Anfänger will seine ersten Versuche mit PG machen und liest Dein Beitrag. Es wäre fatal, würde er annehmen, dies würde so (von der Syntax her) funktionieren.

    In der Tat setzen wir PostgresSQL 8.1.5 ein, danke für den Hinweis. Mir war nicht aufgefallen, dass da so gravierende Unterschiede sind. Ein Upgrade auf 8.3 oder 8.4 könnte bei der nächsten Servermigration erfolgen, aber das wird noch dauern.....
    Oh, zwischen den Majer-Versionen von PG passiert schon so einiges...

    Und ich weiss nicht wieso dass falsch rüber gekommen ist, aber
    "procedure in PL pg SQL schreiben"
    hey, ...... das ist genau das was ich will und dachte bereits weitgehend getan zu haben, wenn auch mit Fehlern....
    PostgreSQL: Documentation: Manuals: PostgreSQL 8.3: CREATE FUNCTION , Parameter langname.



    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  5. #5
    ThommyW ist offline Neuer Benutzer
    Registriert seit
    03.06.2009
    Beiträge
    11

    Standard neue Version

    Hallo,

    Nach einiger Nacharbeitung des vorgenannten Codes bin ich zu folgendem Code gelangt:
    Code:
    DECLARE passed BOOLEAN;
    BEGIN
    Select pcon.pcontype as typepro
    from pcon
    where (pcon.symbol = pconpro);
     
    if  (typepro = 'SecondaryMaster')   then 
    begin   
      Select pcon.pcontype as typereac
      from pcon
      where (pcon.symbol = pconreac);
     
     if  (typereac = 'PrimaryMaster') then 
      passed: = true;
     else
      passed := false;
     end if;
    end;
     
    if (typepro = 'Product') or (typepro = 'MineralsSolids')  then 
    begin
       Select pcon.pcontype as typereac
       from pcon
       where (pcon.symbol = pconreac);
     
      if  (typereac = 'PrimaryMaster')  or  (typereac = 'SecondaryMaster') then   
        passed := true;
       else
       passed : = false;
      end if;
     
    end;
    
    liefert folgenden " Funktionstext und Fehlermeldung:

    SQL Fehler:
    FEHLER: Fehler »syntax error« am Ende der Eingabe at character 781
    In der Anweisung:
    Code:
       
    CREATE FUNCTION "IsvalidEntry" (IN pconpro text,IN pconreac text) as '
    DECLARE passed BOOLEAN;
     (obiger Code mit verdoppelten Hochkommas)
    LANGUAGE "plpgsql"
    Sicher könnte ich auch noch ein paar Stunden mehr daran rumprobieren, aber das erscheint mir uneffectiv. Ein Buch zu dieser Postgres-SQL Version wurde eher abgelehnt, da ja sowieso eine neue Version für irgendwann geplant ist. Der Fehler taucht angeblich an einer Stelle auf, die jedoch gar nicht existiert, da die Anzahl der Zeichen kleiner ist als die angegebene Stelle...
    was mich zu dem Schluss verleitet, dass entweder
    kein Ende gefunden wird oder er irgendein Zeichen vermisst und dieses bis zur letzten Zeile sucht....
    Das Einzige was mir aufgefallen ist, besteht in dem nicht vorhandenem
    Bezeichner für das Boolean -Ergebnis: returns boolean as .....
    danach kommt gar nichts, jedoch sehe ich nicht wie ich das ändern kann, da
    1. die gesamte Funktionsbezeichnung aus den Einträgen bei der Funktionserstellung entsteht, wo bei mir kein Feld mit einem verfügbarem Eintrag ist,
    2. bei Reinkopieren und Modifikation dieser erzeugten Zeile gar nichts mehr funktioniert, da diese Zeile dann auch noch mal erzeugt wird und zu Chaos führt (einer meiner ersten Fehler, da das nirgends geschrieben steht).

    Ferner ist mir aufgefallen:
    Wenn ich alles eingetragen habe, sieht meine Vorgabe etwa so aus (Nach x Versuchen eine Graphik o. ä. einzufügen, nun die Beschreibung per Schrift):

    Block: Name Liefert Sprache
    "IsValidEntry" "(leeresFeld1)" "Boolean" "(leeres Feld2)" "PLPGSQL"

    Block: Mode Name Type (Block zum hinzufügen)
    "IN" "pconpro" "Text"
    "IN" "pconreac" "Text"

    leeres Feld1: "Set of" auswählbar
    leeresFeld2 nur "[]" auswählbar


    Das Feld links neben der Sprache (PL-PG SQL) ist mir zwar nicht ganz klar, aber ich hätte dort irgendwo den Bezeichner hinter dem "as" gesucht...

    Wenn ich dann versuche, die Funktion zu erstellen und ein Fehler auftritt, dann ändert sich die Vorgabe zu folgendem Bild:


    Block: Name Liefert Sprache
    "IsValidEntry" "(leeresFeld1)" "Boolean" "(leeres Feld2)" "PLPGSQL"

    Block: Mode Name Type (Block zum hinzufügen)
    "(leeresFeld3)" "pconpro" "(leeresFeld45)"
    "(leeresFeld3)" "pconpro" "(leeresFeld45)"

    leeres Feld1: "Set of" auswählbar
    leeresFeld2: nur "[]" auswählbar
    leeresFeld3: nur " " auswählbar
    leeresFeld45: 2 dicht nebeneinander liegende leere Felder, die nur etwa 3 mm breit sind, nur Leerzeichen auswählbar (statt Text)

    Diese sinnlose neue Vorgabe führt dann bei einem neuen Erstellungsversuch zum Fehler:
    "Typ p schon definiert."

    Also muss ich alle Argumente neu eintragen, mindestens bei jedem 2.Mal...

    Weiss jemand woher das kommt ?

    Kann mir jemand den Fehler im Code sagen ?

    Vielen Dank im voraus...

    Thomas

  6. #6
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von ThommyW Beitrag anzeigen

    Kann mir jemand den Fehler im Code sagen ?

    Vielen Dank im voraus...

    Thomas
    Ist leider alles schwer nachvollziehbar bei Dir...

    Wenn Du den Body der Funktion mit ' einleitest (und kein Dollar-Quoting verwendest) mußt Du Stringst in doppelten ' quoten, also zwei mal das ' drum herum.

    Code:
    ...
    test'#   end if;
    test'#
    test'# end;
    test'# ' LANGUAGE "plpgsql";
    ERROR:  syntax error at or near "SecondaryMaster"
    LINE 8: if  (typepro = 'SecondaryMaster')   then
    Bitte verwende für Code passende Code-Tags, also [ auf, dann code, dann ]. Und wenn fertig, [, dann /code, und ]. Und Funktionsdefinitionen bitte komplett angeben.

    Das 'Begin' nach dem IF ist übrigens auch falsch.

    Ich schlage Dir vor, Du schaust nun endlich mal in die Doku und versuchst mal, ein Beispiel von dort fehlerfrei abzutippen.


    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  7. #7
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von ThommyW Beitrag anzeigen
    Ferner ist mir aufgefallen:
    Wenn ich alles eingetragen habe, sieht meine Vorgabe etwa so aus (Nach x Versuchen eine Graphik o. ä. einzufügen, nun die Beschreibung per Schrift):

    Block: Name Liefert Sprache
    "IsValidEntry" "(leeresFeld1)" "Boolean" "(leeres Feld2)" "PLPGSQL"

    Block: Mode Name Type (Block zum hinzufügen)
    "IN" "pconpro" "Text"
    "IN" "pconreac" "Text"

    leeres Feld1: "Set of" auswählbar
    leeresFeld2 nur "[]" auswählbar


    Das Feld links neben der Sprache (PL-PG SQL) ist mir zwar nicht ganz klar, aber ich hätte dort irgendwo den Bezeichner hinter dem "as" gesucht...

    Wenn ich dann versuche, die Funktion zu erstellen und ein Fehler auftritt, dann ändert sich die Vorgabe zu folgendem Bild:


    Block: Name Liefert Sprache
    "IsValidEntry" "(leeresFeld1)" "Boolean" "(leeres Feld2)" "PLPGSQL"

    Block: Mode Name Type (Block zum hinzufügen)
    "(leeresFeld3)" "pconpro" "(leeresFeld45)"
    "(leeresFeld3)" "pconpro" "(leeresFeld45)"

    leeres Feld1: "Set of" auswählbar
    leeresFeld2: nur "[]" auswählbar
    leeresFeld3: nur " " auswählbar
    leeresFeld45: 2 dicht nebeneinander liegende leere Felder, die nur etwa 3 mm breit sind, nur Leerzeichen auswählbar (statt Text)

    Diese sinnlose neue Vorgabe führt dann bei einem neuen Erstellungsversuch zum Fehler:
    "Typ p schon definiert."

    Also muss ich alle Argumente neu eintragen, mindestens bei jedem 2.Mal...

    Weiss jemand woher das kommt ?

    Kann mir jemand den Fehler im Code sagen ?

    Vielen Dank im voraus...

    Thomas

    Zu dieser Orgie kann ich nur folgendes sagen:

    Nehme eine Editor Deines geringsten Mißtrauens und schreibe Deine Funktion damit. Speichere das ab. Und in psql, (das ist der Kommandozeilen-Client von PG) verwendest Du ganz simpel \i <Deine_Datei>, um das einzulesen. Wenn dann ein Fehler kommt, gehst Du zurück zu Start, ähm, Editor.

    Mag sein, daß das alles auch in PGAdminIII geht. Aber das ist (mir zumindest) deutlich schwerer damit und ich bin echt zu faul, die Bedienung dieser GUI zu erlernen und zu erlernen, was ich in welcher Reihenfolge drücken muß, um das zu erreichen, was ich will, und von dem ich weiß, wie es geht.

    Andreas, viele Terminals unter KDE nutzend...
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  8. #8
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.056

    Standard

    Was akretschmer dir sagen möchte: speichere deine Funktion in einer Datei und lies diese Datei direkt in die Datenbank ein. Das erleichtert die Fehlersuche, da du den vollständingen Funktionstext im Editor deines geringsten Misstrauens vorliegen hast. pgAdminIII ist dafür etwas *äh* ungeeignet.

    Als zweites würde ich dir raten: probiere das ganze Stück für Stück. Du schreibst große und umfangreiche Funktionen (ok, für mich sind die nicht groß, aber für dich) und stolperst dabei über jeden Fehler. Wenn du vorn anfängst und zuerst mal Kleinigkeiten probierst und siehst wie die funktionieren, kommst du sicherlich schneller voran.

    Und wie akretschmer auch schon gesagt hat: da verstecken sich schon diverse Fehler gleich am Anfang. Nur ist hier ehrlich gesagt niemand dafür da, dir dein Debugging abzunehmen und/oder dir die Sprache beizubringen.
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

Ähnliche Themen

  1. Case
    Von minor_73 im Forum SQL
    Antworten: 9
    Letzter Beitrag: 18.07.2011, 14:02
  2. case when - Probleme mit where
    Von toni_83 im Forum SQL
    Antworten: 3
    Letzter Beitrag: 18.05.2011, 13:16
  3. sql syntax case
    Von absbegin im Forum Andere Datenbanken
    Antworten: 4
    Letzter Beitrag: 03.05.2010, 07:59
  4. case when in where-Bedingung?
    Von toni_83 im Forum SQL
    Antworten: 2
    Letzter Beitrag: 16.03.2010, 15:42
  5. Probleme mit CASE
    Von beho im Forum SQL
    Antworten: 4
    Letzter Beitrag: 11.02.2008, 13:31

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum