corner image
home ·Wie man aus einer Oracle Datenbank Funktionen einer eigenen Shared-Lib (DLL) aufruft


letzte Änderung:
TCP-States
Netzwerk
Links
Australien
Wertpapiere

Wie man aus einer Oracle Datenbank Funktionen einer eigenen Shared-Lib (DLL) aufruft

Claus Ebert

Version 0.01

Kurzes Beispiel eines Aufrufes einer Funktion einer externen Library (hat zumindest mit Oracle 8 funktioniert)

1.Erstellung der Library


1. Erstellung der Library

1.1 Makefile und Source einer (sehr) simplen Shared-Lib

Da ich das ganze unter Sun Solaris am laufen habe ... ist das hier alles auf Oracle 8 unter Solaris 8 zugeschnitten.

Zuerst der Beispiel-Source in ANSI-C:

#include <stdio.h>
#include <stdlib.h>

int ExecCommand(char *cmd) 
{
    if (NULL != cmd) 
    {
        return system(cmd);
    }
    return 0;
}

Ich verwende hier den CC der Sun Workshops. Theoretisch sollte der GCC hier auch funktionieren
Jetzt das dazu passende Makefile:

CC=/opt/prod/studio8/SUNWspro/bin/cc

all: 
        @echo "Supported targets:" 
    @echo "   m32   - to build a 32 bit Version" 
    @echo "   m64   - to build a 64 bit Version" 
    @echo "   clean - remove all build files"
    @echo "   test  - build small test binary"

m32: 
    $(CC) -G -xarch=v7 -Kpic $(LDFLAGS) system_call.c -o system_call.so
m64: 
    $(CC) -G -xarch=v9 -KPIC system_call.c -o system_call.so
test:
    $(CC) -o test test.c system_call.so 
    @echo "Run test program with: LD_LIBRARY_PATH=. ./test" 


clean:
    rm -f system_call.o system_call.so test

top

1.2 Das Package erstellen, mit dem auf die external Lib zugegriffen werden kann

Das Zugriffs-Package wird wie folgt erstellt:

CREATE OR REPLACE LIBRARY SYSTEM_CALL 
AS '/opt/tdb/V/lib/system_call.so' 
/

Und nun der Package Header:

CREATE OR REPLACE PACKAGE CALL_TEST
IS
  FUNCTION ExecuteCommand ( 
        COMMAND                 IN OUT VARCHAR2 
  ) 
  RETURN BINARY_INTEGER;
END CALL_TEST; 
/

Der Package-Body:

CREATE OR REPLACE PACKAGE BODY CALL_TEST
AS 
/************************************************************************ 
 ExecuteCommand - Funktion zum ausfuehren eines UNIX Kommandos ueber 
 eine externe Prozedur. Bei externen Prozeduren tritt keine Ausnahme auf, 
 was die Fehlersuche etwas erschwert. Es wird lediglich ein Returncode 
 zurueckgegeben. Zur Fehlerverfolgung muss das aufgerufene UNIX Kommando 
 eine Log- bzw. Fehlerdatei schreiben. 
************************************************************************/ 
  FUNCTION ExecuteCommand ( 
        COMMAND  IN OUT VARCHAR2) 
    RETURN BINARY_INTEGER IS EXTERNAL 
   LIBRARY SYSTEM_CALL 
    NAME "ExecCommand" 
    LANGUAGE C 
    CALLING STANDARD C 
    WITH CONTEXT 
    PARAMETERS ( 
      COMMAND BY REFERENCE STRING, 
      CONTEXT, 
      RETURN INT 
    );
END; 
/

top
  ©2016· Claus Ebert · Emailemail senden