Announcement

Collapse
No announcement yet.

substr(s,m,n) => function SUBSTR is not defined

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • substr(s,m,n) => function SUBSTR is not defined

    <br>Hi,...
    <br>
    <br>folgendes habe ich im isql eingegeben
    <br>SQL-Statement:
    <br>Select
    <br>substr(KDAuftrNr,1,4) AS MyKDAuftrNr
    <br>from KDAuftr
    <br>
    <br>Fehlermeldung:
    <br>Statement failed, SQLCODE = -104
    <br>Details:
    <br>invalid request BLR at offset 63
    <br>-function SUBSTR is not defined
    <br>-module name or entrypoint could not be found
    <br>
    <br>Nun dachte ich mir OK dann mache ich eben noch das declare, wie es im <br>Manual steht:
    <br>DECLARE EXTERNAL FUNCTION substr
    <br>CSTRING(80), SMALLINT, SMALLINT
    <br>RETURNS CSTRING(80) FREE_IT
    <br>ENTRY_POINT “IB_UDF_substr” MODULE_NAME “ib_udf”;
    <br>
    <br>Das half aber auch nicht; Fehlermeldung blieb bestehen
    <br>
    <br>Danke für eure Hilfe!
    <br>
    <br>mfg
    <br>PS

  • #2
    Patrick,

    sofern es sich um Interbase 6 handelt, muss sich 'ib_udf.dll' im Interbase Unterverzeichnis 'UDF' (z.B.: C:\Programme\Interbase\UDF\) befinden.<br><br>
    Thoma
    Thomas Steinmaurer

    Firebird Foundation Committee Member
    Upscene Productions - Database Tools for Developers
    Mein Blog

    Comment


    • #3
      <br>Hallo Thomas,
      <br>
      <br>IB 5.x wird eingesetzt
      <br>bei mir befindet sich die Datei ib_udf.dll in C:\Programme\Interbase Corp\Interbase\lib\
      <br>
      <br>Muß ich eigentlich dieses Declare ausführen?
      <br>bekomme dabei eine Fehler Meldung:
      unsuccessful metadata update
      <br>-DEFINE FUNCTION failed
      <br>-attempt to store duplicate value (visible to active transactions) in unique index "RDB$INDEX_9"
      <br>
      <br>ausgeführt wurde:
      <br>DECLARE EXTERNAL FUNCTION substr
      <br>CSTRING(80), SMALLINT, SMALLINT
      <br>RETURNS CSTRING(80) FREE_IT
      <br>ENTRY_POINT 'IB_UDF_substr' MODULE_NAME 'ib_udf';
      <br>
      <br>Was kann man denn noch machen um diese Funktion nutzen zu können?
      <br>Habe ich vieleicht bei der Installation was falsch gemacht? Sonst müßte ja dieser Fehler auch bei allen anderen IB usern auftreten.
      <br>
      <br>mfg
      <br>p

      Comment


      • #4
        Unter IB 5.x müssen sich die UDF-Libraries im Unterverzeichnis \Bin (z.B.: C:\Programme\Interbase Corp\Interbase\bin\) od. im Windows Systemverzeichnis befinden.<br><br>
        Das DECLARE muss nur einmal ausgeführt werden.<br><br>
        Thoma
        Thomas Steinmaurer

        Firebird Foundation Committee Member
        Upscene Productions - Database Tools for Developers
        Mein Blog

        Comment


        • #5
          <br>Habe nun die UDF Datei ins Verzeichnis bin und ins Windows Systemverzeichnis kopiert. (Muß ich den Rechner danach neustarten, oder diese Dll neu registrieren?)
          <br>
          <br>Bei dem Declare habe ich aus SubStr SubStry gemacht und schon konnte ich das declare ausführen (ohne Fehlermeldung). Ich vermute die Fehlermeldung bei dem Declare kommt dadurch zustande, das ich SubStr schon zuvor einmal erfolgreich initialisiert hatte.
          <br>
          <br>Jedoch bekomme ich bei der Ausführung des Select Statements immer noch die selbe Fehlermeldung (auch dann wenn SubStr durch SubStry getauscht wird)
          <br>
          <br>Was kann man noch machen? Gibt es vieleicht einen anderen Weg ein solches Select Statement zu realisieren?
          <br>
          <br>mfg
          <br>P

          Comment


          • #6
            Hallo,

            jede UDF-Funktion muss einmal pro Datenbank über DECLARE EXTERNAL FUNCTION registriert werden. Ich würde daher zur Fehlereingrenzung den Versuch mit einer frisch angelegten InterBase-Datenbank wiederholen und dabei darauf achten, dass sowohl <i>ib_util.dll</i> als auch <i>ib_udf.dll</i> beim InterBase 5.x im <b>Bin</b>-Verzeichnis liegen. Die exakte DECLARE EXTERNAL FUNCTION-Syntax sollte aus der Datei <i>InterBase\examples\Udf\ib_udf.sql</i> entnommen werden

            Comment


            • #7
              Danke!

              Was vieleicht noch zu erwähnen wäre:
              Den Rechner nach dem kopieren der DLL neustarten und dann erst das Declare starten.

              MfG
              P

              Comment


              • #8
                Hallo Andreas

                Ich habe auch schon einige UDF's (für Windows Plattform) selbst geschrieben mit C++ Builder. Aber mit welchem Tool du das machst
                ist eigentlich egal, ob mit Delphi,Assembler oder sonst was.
                Wichtig ist nur die DLL und wie der Name exportiert wurde der
                in der DECLARE EXTERNAL FUNCTION dann erscheinen muss.
                (Mit einem def File kann der Name der Funktion abweichend von dem im Quellcode beliebig verbogen werden dieser wird dann bei DECLARE ein-
                gesetzt).

                Für die DLL ist nur wichtig,dass das Betriebsystem diese findet
                d.h Sie muss im 1.) windows/system (winnt/system32) verzeichnis sein oder 2.) im gleichen Verzeichnis von dem aus der Interbase Server Prozess gestartet wurde oder es muss 3.) die Umgebungsvariable PATH
                auf dieses Directory zeigen wo die DLL ist. (eleganteste Lösung).

                Habe z.B: die gds32.dll vom auf winnt/system32 des Servers und auch des Client gelöscht un in ein Verzeichnis sagen wir /serverdir/ib/bin kopiert.
                Beide Maschinen Server und Client zeigen nun in der PATH Variable
                auf das Verzeichnis /serverdir/ib/bin. So brauche ich auch nicht auf
                jedem client das client-Kit mit setup installieren, sondern setze
                auf jedem client nur die Umgebungsvariable auf das Verzeichnis auf dem sich die DLL befindet.

                gruesse [email protected]

                Comment

                Working...
                X