Sybase User Defined Functions

Kurt Klinner

Hallo zusammen,

nachdem es längere Zeit still auf mobux.de war gibt es nun
wieder regelmässig Neuigkeiten um den Sybase ASE, Perl und Linux

Los geht es mit einem der neuen Features der aktuelleren Sybase ASE Generation, den User Defined Functions oder kurz UDFs.

In der Version 15.0.2 wurden neben die sogenannten Scalar UDFs eingeführt.
Merkmale dieser UDF sind.

  • Es wird ein einziger Wert zurück gegeben
  • Innerhalb der Funktion können 1-n T-SQL Anweisungen stehen
  • können in alle TSQL eingebettet werde wo Expressions erlaubt sind.

Folgende TSQL Bestandteile dürfen in UDFs verwendet werden

  • Variablen- und Cursordeklaration
  • Variablenzuweisung via SELECT oder SET
  • CURSOR Anweisungen (open, close, deallocate)
  • Flusssteuerungsanweisungen (if else ...)
  • EXEC Extended Stored Procedures

Nicht erlaubt sind dagegen

  • INSERT, DELETE oder UPDATE statements die auf Objekte ausserhalb der UDF zugreifen
  • Statements, die der Transaktionssteuerung dienen (begin, commit, abort).
  • Anweisungen, die Daten direkt an den User zurücksenden

SQL UDFs können bis zu 2048 Parameter haben.
Der Aufruf muss inkl. des Besitzernamens erfolgen ala
dbo.sqlfunc()

Anbei zwei kleine Beispiele mit denen man ein Datum in die entsprechende Integer
Repräsentation bzw. aus einem Integer das zugehörige Datum erzeugen kann.

Dat2int - Datum in Int umwandeln

CREATE FUNCTION dat2int(@date datetime)
RETURNS int AS
BEGIN
DECLARE @unixintstartdate int
DECLARE @unixstartdate datetime
DECLARE @intdate int
SELECT @unixintstartdate = 719528, @unixstartdate = '01/01/1970'
SELECT @intdate = datediff(day, @unixstartdate, @date) + @unixintstartdate RETURN @intdate
END

Int2dat - Int zu Datum

CREATE FUNCTION int2dat(@intdate int)
RETURNS datetime AS
BEGIN
DECLARE @unixintstartdate int
DECLARE @unixstartdate datetime
DECLARE @datetime_date datetime
SELECT @unixintstartdate = 719528
SELECT @unixstartdate = '01/01/1970'
SELECT @datetime_date = dateadd (day, @intdate-@unixintstartdate,@unixstartdate)
RETURN @datetime_date
END

Viel Spaß beim Ausprobieren