Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: Hash in Klartext?

  1. #1
    sly
    sly ist offline Neuer Benutzer
    Registriert seit
    05.10.2010
    Beiträge
    20

    Standard Hash in Klartext?

    Hallo,
    wenn ich in PL/Perl eine SELECT Abfrage formuliere, die einen boolean zurückgeben sollte, dann bekomme ich "HASH(0x9a70578)" zurück.

    Wie komme ich an "den Kern des Ganzen"? Oder habe ich hier eine riesige Verständnislücke?

    Bin gerade dabei plperl zu lernen/verstehen.

    Die Abfrage lautet:

    my $sel = spi_exec_query("SELECT ST_INTERSECTS(x.first_set,y.second_set) FROM
    (SELECT poly AS first_set FROM polys WHERE id=$eins) AS x,
    (SELECT poly AS second_set FROM polys WHERE id=$zwei) AS y;");

    ST_INTERSECTS ist eine von postgis bereitgestellte Funktion. poly ist eine Tabelle mit einer Spalte voller Polygone (polys).

    Die Abfrage soll mir sagen, ob sich zwei überlappen oder nicht?

    Für Hilfe wäre ich sehr dankbar.

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

    Standard

    Nun, und wie sieht der Rest vom Code aus, der das "ARRAY" produziert?
    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

  3. #3
    sly
    sly ist offline Neuer Benutzer
    Registriert seit
    05.10.2010
    Beiträge
    20

    Standard

    Unten habe ich die ganze Funktion angehängt. Ich würde mir gerne das Ergebnis des SELECT als boolean zurückgeben lassen.

    Code:
    CREATE OR REPLACE FUNCTION ueberschneidung(INTEGER, INTEGER)
    RETURNS boolean
    AS
    $$
    
    my $ueber = false;
    my $eins = $_[0];
    my $zwei = $_[1];
    
    elog(NOTICE,"ausgabe: $eins");
    elog(NOTICE,"ausgabe: $zwei");
    
    my $sel = spi_exec_query("SELECT ST_INTERSECTS(x.first_set,y.second_set) FROM
    (SELECT poly AS first_set FROM polys WHERE id=$eins) AS x,
    (SELECT poly AS second_set FROM polys WHERE id=$zwei) AS y;");
    
    elog(NOTICE,"select: $sel");
    
    my $status = $sel->{status};
    my $nrows = $sel->{processed};
    elog(NOTICE,"status: $status");
    elog(NOTICE,"nrows: $nrows");
    
    my $row = $sel->{rows}[0];
    elog(NOTICE,"row: $row");
    
    
    return $ueber;
    
    $$
    LANGUAGE plperl;
    
    SELECT * FROM ueberschneidung(1,2);

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

    Standard

    In $sel steht erst mal nur das Ergebnis der Anfrage drin. Du musst auf die einzelnen Zeilen des Ergebnisses zugreifen.

    Hier ein Beispiel:

    Kapitel 10 - Serverseitige Programmierung [PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler]
    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

  5. #5
    sly
    sly ist offline Neuer Benutzer
    Registriert seit
    05.10.2010
    Beiträge
    20

    Standard

    ok, das klingt plausibel. Ich dachte allerdings das tue ich durch folgenden Befehl

    Code:
    my $row = $sel->{rows}[0];
    elog(NOTICE,"row: $row");
    Und da lautet dann eben die Antwort:

    Code:
    psql:test.pl:71: HINWEIS:  status: SPI_OK_SELECT
    psql:test.pl:71: HINWEIS:  nrows: 1
    psql:test.pl:71: HINWEIS:  row0: HASH(0x9a70080)
    psql:test.pl:71: HINWEIS:  row1:
    In dem link wird ja auf "Seite 366" explizit auf "daten" zugegriffen. Leider liefert meine Select-Anfrage aber keinen Spaltennamen wie "daten". Wie kann ich denn bei der ST_INTERSECT Funktion drauf zugreifen. Das verstehe ich leider nicht. Kannst Du es mir bitte näher erläutern?

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

    Standard

    Du könntest deine Ergebnisse mit Namen versehen:
    Code:
    SELECT ST_INTERSECTS(x.first_set,y.second_set) AS spalte1
    Und $row ist letztendlich nur wieder ein Zeiger auf ein Array. Du musst also da drin noch auf den passenden Schlüssel zugreifen.

    Wenn du die untrusted Version von pl/Perl verwendest (das wäre "plperlu"), könntest du mittels dem Modul Data:umper in die jeweiligen Variablen hineinschauen.
    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

  7. #7
    sly
    sly ist offline Neuer Benutzer
    Registriert seit
    05.10.2010
    Beiträge
    20

    Standard

    vielen, vielen Dank. Das benenne mit AS klappt wunderbar, denn dann habe ich ja einen "Namen" auf den ich zugreifen kann. plperlu werde ich im Hinterkopf behalten. Als Neuling in Datenbanken & co war mir das Attribut untrusted zu abschreckend. So nach dem Motto "wer nicht weiß was er tut sollte lieber die Finger...."

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

    Standard

    In dem Fall empfehle ich dir mal die Dokumentation zu CREATE LANGUAGE. Dort werden die Unterschiede zwischen trusted und untrusted Sprachen dargestellt.
    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

  9. #9
    sly
    sly ist offline Neuer Benutzer
    Registriert seit
    05.10.2010
    Beiträge
    20

    Standard

    Ist es möglich die Funktion - wenn sie einmal angelegt ist - auch "direkt" aufzurufen. Also innerhalb einer anderen plperl Funktion nur über den Namen und Attribute? Würde es gerne in einer if-Abfrage nutzen.

    Oder grundsätzlich auch aus anderen plperl Funktionen heraus nur in der Form
    Code:
    my $sel = spi_exec_query("SELECT * FROM ueberschneidung($i,$j);");
    my $sel0 = $sel->{rows}[0]->{ueberschneidung};
    if($sel0 eq t)
    Finde das etwas umständlich. Direktes auswerten in der Form
    Code:
    if(ueberschneidung(X,Y) == true)
    wäre eleganter. Ist das irgendwie möglich? Ich gebe zu, mein Verständnis von dem prozeduralen Ansatz scheint sich noch in Grenzen zu halten.

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

    Standard

    Nein. Die Funktionen sind ja nur innerhalb der Datenbank bekannt.

    Was du allerdings machen könntest: deine in der Datenbank erstellte Funktion ist bloß ein Wrapper über deine eigentliche Funktion.
    Die richtige Funktion stellst du dann in einem Modul bereit und rufst sie wahlweise aus Perl heraus oder aus dem Wrapper aus der Datenbank heraus auf.
    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

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Antworten: 0
    Letzter Beitrag: 16.06.2008, 11:51

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