• Link zu Xing
  • Link zu LinkedIn
  • Link zu X
  • Link zu Rss dieser Seite
  • Link zu GitHub
  • Newsletter
  • Kontaktieren Sie mich
Frank W. Rahn
  • Meine BlogbeiträgeZeigt meinen Blog an
  • RessourcenZeigt Ihnen eine Auswahl von Ressourcen
    • Franks aktueller IT-Werkzeugkasten
      • Diese Werkzeuge setze ich zur Zeit ein
    • Meine Präsentationen
      • Zeigt Ihnen meine Präsentationen
    • Weblinks
      • Meine Linksammlung
    • Buchtipps
      • Eine Liste von mir empfohlener Literatur
    • XML-Namespace
      • Zeigt meinem XML-Namespace
  • Franks aktueller IT-WerkzeugkastenDiese Werkzeuge setze ich zur Zeit ein
  • Meine PräsentationenZeigt Ihnen meine Präsentationen
  • WeblinksMeine Linksammlung
  • BuchtippsEine Liste von mir empfohlener Literatur
  • XML-NamespaceZeigt meinem XML-Namespace
  • Über mich …Die persönlichen Informationen über den Softwarearchitekt Frank Rahn
  • Click to open the search input field Click to open the search input field Suche
  • Menü Menü
Artikel, Beispiele und Vorträge

Stored Procedure mit User-defined Types unter PostgreSQL

Die Stored Procedure "searchPersons" mit User-defined Types (UDT)

Zuletzt geändert oder ergänzt am 21.06.2026!

In diesem Beitrag möchte ich zeigen, wie eine Stored Procedure mit User-defined Types (UDT) in einer PostgreSQL Datenbank programmiert wird. Im übergeordneten Beitrag Spring und Stored Procedure mit User-defined Types wird das Aufrufen dieser Stored Procedure aus Java heraus gezeigt. Im Beitrag Stored Procedure mit User-defined Types unter Oracle wird dieses Beispiel anhand einer Oracle Database beschrieben.

Inhaltsverzeichnis [anzeigen]

  • Die Installation des PostgreSQL Datenbankservers
  • Das Anlegen einer Datenbank
  • Das Erzeugung einer Stored Function per Konsolenanwendung
  • Das Erzeugung der Stored Procedure mit User-defined Types

Dieser Beitrag beschreibt …

  • das Installieren eines PostgreSQL Datenbankservers
  • das Anlegen einer Datenbank unter PostgreSQL
  • das Erzeugen einer Stored Procedure mit User-defined Types (UDT)

Die Installation des PostgreSQL Datenbankservers

Der PostgreSQL Datenbankservers wird unter dem Betriebssystem Ubuntu mit folgenden Befehlen installiert.

$ sudo apt-get install postgresql
...
$ sudo service postgresql status
Running clusters: 9.1/main

Der Datenbankserver wurde installiert, direkt konfiguriert und gestartet.

Nun wird noch der Datenbankbenutzer dba eingerichtet. Dazu muss der sudo Befehl mit der Option -u postgres ausgeführt werden, da die Instanz der Datenbankservers dem Betriebssystembenutzer postgres gehört. Die Option -P sorgt dafür, dass das Passwort abgefragt wird.

$ sudo -u postgres createuser -P dba
Enter password for new role: 
Enter it again: 
Shall the new role be a superuser? (y/n) y

Das Anlegen einer Datenbank

Dieser Befehl erzeugt die Datenbank TEST_SPRING_JDBC. Die Option -O dba legt den Datenbankbenutzer dba als Eigentümer der Datenbank fest.

$ sudo -u postgres createdb -O dba TEST_SPRING_JDBC "Test Datenbank für test-spring-jdbc"

Dieser Befehl macht die prozedurale Programmiersprache PL/pgSQL in dieser Datenbank verfügbar.

Mögliche Alternativen: PL/Tcl, PL/Perl, PL/Python, PL/Java, …

$ sudo -u postgres createlang plpgsql TEST_SPRING_JDBC

Das Erzeugung einer Stored Function per Konsolenanwendung

Als erstes wird über die Konsolenanwendung psql eine Funktion erzeugt.

$ psql TEST_SPRING_JDBC
psql (9.1.7)
Type "help" for help.
 
TEST_SPRING_JDBC=#

Die Eingabe des SQL Befehls zur Erzeugung der Funktion fn_info().

TEST_SPRING_JDBC=# CREATE OR REPLACE FUNCTION fn_info() RETURNS text AS $
TEST_SPRING_JDBC$# BEGIN
TEST_SPRING_JDBC$# RETURN 'Eine einfache Funktion';
TEST_SPRING_JDBC$# END;
TEST_SPRING_JDBC$# $ LANGUAGE plpgsql;
CREATE FUNCTION
TEST_SPRING_JDBC=#

Mit dem folgenden SQL Befehl wird die gerade erzeugte Funktion getestet.

TEST_SPRING_JDBC=# SELECT fn_info();
        fn_info         
------------------------
 Eine einfache Funktion
(1 row)
 
TEST_SPRING_JDBC=#

Die Anzeigen der erzeugten Funktionen.

TEST_SPRING_JDBC=# df
                                              List of functions
 Schema |     Name      | Result data type |                  Argument data types                   |  Type  
--------+---------------+------------------+--------------------------------------------------------+--------
 public | fn_info       | text             |                                                        | normal
(1 rows)
 
TEST_SPRING_JDBC=#

Das Erzeugung der Stored Procedure mit User-defined Types

Mit dem folgendem Skript wird die Stored Procedure und die User-defined Types angelegt.

Zunächst werden aber die existierenden Prozeduren bzw. Typen kaskadierend gelöscht.

DROP FUNCTION IF EXISTS searchPersons(
    INTEGER, s_User 
) CASCADE;
DROP DOMAIN IF EXISTS a_Person CASCADE;
DROP TYPE IF EXISTS s_User CASCADE;
DROP TYPE IF EXISTS s_Person CASCADE;

In den folgenden Zeilen werden die benutzerdefinierten Typen des aktuellen Benutzers und einer Person angelegt.

CREATE TYPE s_User AS ( -- Der aktuelle Benutzer
    id      CHAR(10),
    name    VARCHAR(30),
    dept    VARCHAR
);

CREATE TYPE s_Person AS ( -- Eine Person
    id          BIGINT,
    name        VARCHAR(30),
    salary      DECIMAL,
    dateOfBirth DATE
);

PostgreSQL vergibt für jeden komplexen Typ implizit einen speziellen Namen für Arrays (z. B. _s_Person für s_Person[] und _s_User für s_User[]).

Da andere Datenbanken diese Konzept nicht kennen, werden hier benutzerdefinierte Wertebereiche (DOMAIN) verwendet.

CREATE DOMAIN a_Person AS s_Person[]; -- Collection der Person

In folgenden Zeilen wird die eigentliche Stored Procedure erzeugt.

  • In den Zeilen 24 und 25 sind die Eingabeparameter der Prozedur definiert.
  • In der Zeile 26 ist der Rückgabeparameter als ein Liste von Personen definiert.
  • In den Zeilen 29 bis 32 sind die Variablen dieser Prozedur definiert.
  • In der Zeile 32 wird das Geburtsdatum mit dem aktuellen Datum vorbelegt.
  • In der Zeile 34 wird eine Meldung auf die Kommandozeile geschrieben.
  • In der Zeile 38 wird eine neue Person angelegt.
  • In der Zeile 42 wird die konstant Kreiszahl Pi (π) verwendet, um ein Gehalt auszurechnen.
  • In der Zeile 43 wird die veränderte Person zurück in das Array gestellt.
CREATE FUNCTION searchPersons( -- Suche Personen
    p_num       IN  INTEGER, 
    p_user      IN  s_User, 
    p_persons   OUT a_Person
) AS
$BODY$  -- Beginn der PL/pgSQL Funktion
    DECLARE -- Deklarationsblock
        i       INTEGER;
        p       s_Person;
        dateOfBirth DATE := current_date;
    BEGIN -- Ausführungsteil
        RAISE NOTICE 'Die Stored Procedure searchPersons wurde aufgerufen. User=%',
            p_user;
        FOR i IN 1..p_num
        LOOP -- Fake der Suche
            p := p_persons[i];
            p.id := i;
            p.name := p_user.name;
            p.dateOfBirth := dateOfBirth;
            p.salary := pi() * i * 100;
            p_persons[i] := p;
        END LOOP;
    END;
$BODY$ -- Ende der Funktion
LANGUAGE plpgsql; -- Die Sprache des Funktionskörpers

Die Ausführung dieses Skriptes mit dem Kommando psql liefert folgende Konsolenausgaben.

$ psql --file=src/sql/postgresql/init.sql TEST_SPRING_JDBC
psql:src/sql/postgresql/init.sql:3: NOTICE:  function searchpersons() does not exist, skipping
DROP FUNCTION
psql:src/sql/postgresql/init.sql:4: NOTICE:  type "a_person" does not exist, skipping
DROP DOMAIN
psql:src/sql/postgresql/init.sql:5: NOTICE:  type "s_user" does not exist, skipping
DROP TYPE
psql:src/sql/postgresql/init.sql:6: NOTICE:  type "s_person" does not exist, skipping
DROP TYPE
CREATE TYPE
CREATE TYPE
CREATE DOMAIN
CREATE FUNCTION

Mit den Kommandos df und dT+ in der Konsolenanwendung psql können die Details über die Stored Procedures bzw. UDTs abgefragt werden. Mit dem Kommando q wird die Konsolenanwendung verlassen.

$ psql TEST_SPRING_JDBC
psql (9.1.6)
Type "help" for help.
 
TEST_SPRING_JDBC=# df
                                              List of functions
 Schema |     Name      | Result data type |                  Argument data types                 |  Type
--------+---------------+------------------+------------------------------------------------------+--------
 public | fn_info       | text             |                                                      | normal
 public | searchpersons | a_person         | p_num integer, p_user s_user, OUT p_persons a_person | normal
(2 row)
 
TEST_SPRING_JDBC=# dT+
                         List of data types
 Schema |   Name   | Internal name | Size  | Elements | Description 
--------+----------+---------------+-------+----------+-------------
 public | a_person | a_person      | var   |          | 
 public | s_person | s_person      | tuple |          | 
 public | s_user   | s_user        | tuple |          | 
(3 rows)
 
TEST_SPRING_JDBC=# q
$

Das folgende Skript dient der Überprüfung der angelegten Prozedur.

  • In den Zeilen 1 bis 11 wird eine Funktion definiert, die ein Benutzer erzeugt.
CREATE OR REPLACE FUNCTION get_user() RETURNS s_User AS
$$
    DECLARE
        u s_User;
    BEGIN
        u.id := 4711;
        u.name := 'Frank Rahn';
        u.dept := 'Entwicklung';
        RETURN u;
    END;
$$ LANGUAGE plpgsql;

SELECT * FROM searchPersons(5, get_user());

DROP FUNCTION IF EXISTS get_user();

Die Konsolenausgabe dieses Skripts zeigt, dass die Stored Procedure aufgerufen wurde.

$ psql --file=src/sql/postgresql/test.sql TEST_SPRING_JDBC
CREATE FUNCTION
psql:src/sql/postgresql/test.sql:13: NOTICE:  Die Stored Procedure searchPersons wurde aufgerufen. User=("4711      ","Frank Rahn",Entwicklung)
DROP FUNCTION
$

Die folgenden Ausgaben zeigen die Rückgabe der Stored Procedure.

p_persons
----------------------------------------------------------------------------------------------
 {"(1,"Frank Rahn",314.159265358979,2012-10-27)","(2,"Frank Rahn",628.318530717959,2012...

  • Über
  • Letzte Artikel
Frank Rahn
Frank Rahn
Frank Rahn ist Softwarearchitekt. Er unterstützt bei der Konzeption von Softwarearchitekturen mit Java-Technologie. Folge Sie ihm auf Facebook oder Twitter.

Benötigen Sie Unterstützung? Kontaktieren Sie ihn.

Hat Ihnen dieser Beitrag gefallen? Wir würden uns über Ihren Kommentar freuen! Bitte verwenden Sie Ihren bürgerlichen Namen.
Frank Rahn
Letzte Artikel von Frank Rahn (Alle anzeigen)
  • Wer ist der optimale Java Bean Mapper? - Freitag, 22. September 2023
  • Spring Boot Webanwendung: Die ersten Schritte (Tutorial) - Montag, 28. März 2016
  • Mainframe-Zugriff via Java - Sonntag, 04. Mai 2014
1 Kommentar/von Frank Rahn
Schlagworte: Linux, Shell, SQL, User-defined Type
Eintrag teilen
  • Teilen auf X
  • Teilen auf WhatsApp
  • Teilen auf LinkedIn
  • Per E-Mail teilen
  • Teilen auf Xing
https://www.frank-rahn.de/wp-content/uploads/Stored-Procedure-mit-User-defined-Types.png 624 1184 Frank Rahn /wp-content/uploads/logo.png Frank Rahn2012-12-24 17:04:212026-06-21 17:49:26Stored Procedure mit User-defined Types unter PostgreSQL
Das könnte Dich auch interessieren
Bild einer Sicherungen von MySQL Datenbanken Sicherungen von MySQL Datenbanken
Der Branch Graph vor dem Merge Großes Beispiel mit Git und GitHub
Eine Festplatte Einige Tipps mit defekten Festplatten oder Partitionen
Klassendiagramm dieses Beispiels Spring mit JPA und Hibernate (Tutorial)
Die Stored Procedure "searchPersons" mit User-defined Types (UDT) Spring und Stored Procedure mit User-defined Types (Tutorial)
Bild von Linux Dateimanager Nautilus Dateioperationen: umbenennen, kopieren, suchen, …
1 Kommentar

Trackbacks & Pingbacks

  1. Stored Procedure mit User-defined Types unter Oracle | Frank W. Rahn sagt:
    Mittwoch, 17. Juni 2015 um 21:03 Uhr Uhr

    […] User-defined Types wird das Aufrufen dieser Stored Procedure aus Java heraus gezeigt. Im Beitrag Stored Procedure mit User-defined Types unter PostgreSQL wird dieses Beispiel anhand einer PostgreSQL Datenbank […]

    Antworten

Hinterlasse einen Kommentar

An der Diskussion beteiligen?
Hinterlasse uns deinen Kommentar!

Schreibe einen Kommentar Antwort abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Ihre E-Mail-Adresse wird nicht veröffentlicht. Ihr Kommentar wird verschlüsselt an meinen Server gesendet. Erforderliche Felder sind mit * markiert.

Weitere Informationen und Widerrufshinweise finden Sie in meiner Datenschutzerklärung.

Wollen Sie kein neuen Beiträge mehr verpassen?
Dann abonnieren Sie bitte meinen Newsletter.
Meinen Newsletter abonnieren

Themen

  • Wer ist der optimale Java Bean Mapper?
  • Einführung in das Spring Framework, Boot, Batch, Data, REST, Security, Web, …
  • Franks aktueller IT-Werkzeugkasten
  • Git, GitHub, EGit, …

Navigation

  • Buchtipps
  • Newsletter
  • Weblinks
Search Search

Werbung

  • JProfiler
Beliebt
  • Das Klassendiagramm für den Java Bean Mapper Test am Beispiel "ByHand"
    Wer ist der optimale Java Bean Mapper?Freitag, 22. September 2023 - 20:59 Uhr
  • Das offizielle Logo von EGit
    GitHub mit Eclipse (EGit)Freitag, 26. Oktober 2012 - 16:15 Uhr
  • Grobe Übersicht üder den Spring Framework Container
    Einführung in das Spring FrameworkSonntag, 01. Mai 2011 - 18:30 Uhr
  • Die Stored Procedure "searchPersons" mit User-defined Types (UDT)
    Spring und Stored Procedure mit User-defined Types (Tut...Freitag, 26. Oktober 2012 - 21:45 Uhr
  • Spring Boot Webanwendung
    Spring Boot Webanwendung: Die ersten Schritte (Tutorial...Montag, 28. März 2016 - 16:29 Uhr
Schlagworte
Annotations AOP Architektur Autorisierung Cookies CRUD DAO DI Git HTML HTTP IoC Java Java EE Java SE JPA JSR Linux MVC Open Source Software PDF POJO REST (RESTful) ROCA Self-contained Systems Serviceorientierte Shell Sicherheit (Security) SOAP Spring SQL SVN Test Toolchain URI URL URN User-defined Type Versionsverwaltung VPN Webservice WS-* WSDL XML XML-Schema

Blogarchiv

Links

Mastodon
Twitter
LinkedIn
Xing
GitHub

Lizenz

Creative Commons Lizenzvertrag Die Texte (nicht Bilder) von Frank Rahn stehen unter einer Creative Commons Namensnennung - Keine Bearbeitungen 4.0 Deutschland Lizenz.

Affiliate-Links

Die mit (*) gekennzeichnete Links sind sogenannte Affiliate-Links. Kommt über einen solchen Link ein Einkauf zustande, werde ich mit einer Provision beteiligt. Für Sie entstehen dabei keine Mehrkosten. Wo, wann und wie Sie ein Produkt kaufen, bleibt natürlich Ihnen überlassen.

Blogkategorien

Copyright © Frank W. Rahn
  • Impressum / HaftungsausschlussDie notwendigen gesetzlichen Angaben dieser Webseite von Frank Rahn
  • DatenschutzerklärungDie Datenschutzerklärung von Frank Rahn
  • NewsletterKeine neuen Beiträge mehr verpassen!
  • BildnachweisDer komplette Bildnachweis von Frank Rahn
Link to: Spring und Stored Procedure mit User-defined Types (Tutorial) Link to: Spring und Stored Procedure mit User-defined Types (Tutorial) Spring und Stored Procedure mit User-defined Types (Tutorial)Die Stored Procedure "searchPersons" mit User-defined Types (UDT) Link to: Stored Procedure mit User-defined Types unter Oracle Link to: Stored Procedure mit User-defined Types unter Oracle Die Stored Procedure "searchPersons" mit User-defined Types (UDT)Stored Procedure mit User-defined Types unter Oracle
Nach oben scrollen Nach oben scrollen Nach oben scrollen

Wir setzen auf unserer Webseite verschiedene Arten von Cookies ein, die auf Ihrem Gerät gespeichert werden. Einige dieser Cookies sind für die einwandfreie Funktion der Webseite notwendig, während andere Cookies Ihnen ein besseres Besuchererlebnis bieten.

DatenschutzerklärungImpressumAlle Cookies akzeptierenKeine Cookies akzeptierenIndividuelle Cookie-Einstellungen vornehmen

Cookie- und Datenschutzeinstellungen



Wie wir Cookies verwenden

Wir setzen auf unserer Webseite verschiedene Arten von Cookies ein, die auf Ihrem Gerät gespeichert werden.

Einige dieser Cookies sind für die einwandfreie Funktion der Webseite notwendig, während andere Cookies Ihnen ein besseres Besuchererlebnis bieten.

Klicken Sie links auf die verschiedenen Reitern, um mehr zu erfahren. Sie können auch einige Cookie-Einstellungen individuell anpassen. Beachten Sie, dass das Blockieren einiger Cookies die einwandfreie Funktion unserer Webseite beeinträchtigt.

Technisch notwendige Cookies

Diese Cookies sind unbedingt erforderlich, denn sie ermöglichen grundlegende Funktionen und sind für die einwandfreie Funktion der Webseite erforderlich.

Sie können diese Cookies jederzeit blockieren oder löschen, indem Sie Ihre Browsereinstellungen ändern und die Blockierung aller Cookies auf dieser Webseite erzwingen. Leider werden Sie dann immer wieder gefragt, ob Sie Cookies akzeptieren oder ablehnen wollen, wenn Sie unsere Webseite erneut besuchen.

Wir setzen die Cookies aviaPrivacyEssentialCookiesEnabled, aviaPrivacyMustOptInSetting, aviaPrivacyRefuseCookiesHideBar und aviaCookieConsent ein, um Ihre individuellen Cookie-Einstellungen zu speichern. Diese Informationen geben wir an keinen Drittanbietern weiter.

Diese Cookies haben eine Laufzeit von einem Jahr, dann müssen Sie die Einstellungen wiederholen.

Die VG WORT setzt das Sitzungscookie srp zur Messung von Zugriffen auf Texten, um die Kopierwahrscheinlichkeit des Textes zu erfassen. Damit partizipieren ich an den Ausschüttungen der VG WORT, welche die gesetzliche Vergütung für die Nutzungen urheberrechtlich geschützter Werke gemäß § 53 UrhG sicherstellen. Das Cookie wird dazu verwendet, um den Nutzer zu identifizieren und ggf. Daten mehrerer Aufrufe von Texten miteinander verknüpfen zu können.

Nach Angaben der VG WORT stellt das eingesetzte Verfahren sicher, dass einzelne Nutzer oder ihr Leseverhalten nicht ermittelbar sind, wenn die Anzahl der Textaufrufe gezählt wird. Alle von der VG Wort erfassten Daten werden sofort sicher verschlüsselt. Der Einsatz des Zählpixels wurde durch das Bayerische Landesamt für Datenschutzaufsicht begutachtet und als datenschutzkonform bewertet.

Datenschutzerklärung der VG WORT

Marketing-Cookies

Die Marketing-Cookies werden von Drittanbietern oder Publishern, wie z. B. Google Analytics, verwendet, um personalisierte Werbung anzuzeigen. Sie tun dies, indem sie Besucher über Webseiten hinweg verfolgen (Tracking).

Wir setzen keine Marketing-Cookies ein.

Datenschutzbestimmungen

Sie können unsere Cookies und Datenschutzeinstellungen im Detail in unserer Datenschutzerklärung nachlesen.

Cookie-Einstellungen übernehmenKeine Cookies akzeptieren
Nachrichtenleiste öffnen Nachrichtenleiste öffnen Nachrichtenleiste öffnen