Marco: Sequenzwert über Stored Procedure abfragen

Hi,

kennt jemand den Rückgabetyp eines Sequenzwerts? Möchte den nächsten Wert einer Sequenz über eine Prozedur abfragen. Dafür müsste ich aber wissen wie der Rückgabetyp ist. Habe mal mit number und integer probiert. Fehlermeldung ist die gleiche (findet ihr weiter unten): Hier der PHP-Code

<?PHP
$sql = "begin seqwert_tj(:seqwert);end;";
$result = oci_parse($con, $sql);

OCIBindByName($result, ":seqwert", $nextid);

oci_execute($result);

$err2=OCIError($result);
 if($err2==TRUE){ echo " <font size=2>Oracle-Fehler: $err2[message]</font><br> ";}
$nextid = $nextid-1;
echo $nextid;

?>

Fehlermeldung:
Oracle-Fehler: ORA-06502: PL/SQL: numerischer oder Wertefehler: Zeichenfolgenpuffer zu klein ORA-06512: in Zeile 1

  1. OCIBindByName($result, ":seqwert", $nextid);

    Fehlermeldung:
    Oracle-Fehler: ORA-06502: PL/SQL: numerischer oder Wertefehler: Zeichenfolgenpuffer zu klein ORA-06512: in Zeile 1

    Wir blickens auch nicht so genau, aber schau mal hier:
    http://de2.php.net/OCIBindByName
    "OCIBindByName() bindet die PHP Variable variable an den Oracle Platzhalter ph_name. Es wird genutzt um den benötigten Speicherplatz fuer die Ein/Ausgabe zu Laufzeit festzulegen."
    "OCIBindByName($stmt,":empno",&$empno,32);" (bsph. Funktionsaufruf)

    1. <?PHP
      $sql = "begin seqwert_tj(:seqwert);end;"; // hier wird die Stored Procedure aufgerufen die einfach den nächsten Sequenzwert zurückgibt
      .
      .
      .
      .
      .
      Dort ist also einfach der Aufurf der Prozedur die den nächsten Sequenzwert zurückgibt. Jetzt müsste ich den nur noch in PHP ausgeben können. Das funktioniert nicht, da die im 1. Eintrag angegebene Fehlermeldung kommt. Kann sein das der Fehler in der Prozedur selbst ist, da ich den Rückgabetype des Sequenzwerts nicht kenne. Habe mit Number und Integer probiert. Fehlermeldung bleibt gleich. Bindung der Variable in PHP müsste eigentlich stimmen.

      1. yo,

        mach doch mal eine ganz normale abfrage draus, wobei es eigentlich keinen sinn macht, es in einer abfrage zu benutzen, sondern direkt in einer INSERT anweisung.

        select seqwert_tj.NEXTVAl from dual;

        Ilja

        1. Hi,

          ja, das ist kein Problem, über ne normale Abfrage funktioniert es auch. Aber aus bestimmten Gründen müsste ich das über ne Prozedur abfragen.
          Das will aber nicht funktionieren. Denke es liegt am Rückgabetyp, wird evtl. kein number oder integer sein. Nur was?

          1. Hi,

            Aber aus bestimmten Gründen müsste ich ...

            Aha.

            Warum schreibst du nicht eine Prozedur/Package oder wie auch immer das genau in Oracle heisst und machst da drin ein "SELECT seq.NEXTVAL FROM dual;" ... vielleicht verbandelst du das mit der Zuweisung in eine Variable (mit einem definierten Typ, der mit dem Typ des Sequenz-Objektes kompatibel ist) und machst düse zum Rückgabewert der Prozedur.

            Grüße, Frank

            1. @ frank:

              Hast du dir überhaupt meinen Eintrag durchgelesen? Das hab ich doch so gemacht. Es geht um den Rückgabetyp, den müsste man kennen...

          2. Hallo,

            Hi,

            ja, das ist kein Problem, über ne normale Abfrage funktioniert es auch. Aber aus bestimmten Gründen müsste ich das über ne Prozedur abfragen.
            Das will aber nicht funktionieren. Denke es liegt am Rückgabetyp, wird evtl. kein number oder integer sein. Nur was?

            NEXTVAL funktioniert nur wie Ilja schreibt als SELECT seq_xy.NEXTVAL FROM dual; oder direkt beim Insert als INSERT INTO tab (id) VALUES (seq_xy.NEXTVAL); Alles andere liefert einen Fehler. Wenn du den nächsten Wert wissen willst bleibt dir nichts anderes übrig als das beschriebene Select in eine Funktion zu schreiben.

            Grüße
            Marcus

            --
            si vis pacem, para iustitiam
      2. Schon mal lully- bzw. mock-mässig den Funktionsaufruf gestaltet?

        1. Schon mal lully- bzw. mock-mässig den Funktionsaufruf gestaltet?

          Wie bitte? Sorry, mit den Begriffen kann ich nichts anfangen.

          1. Schon mal lully- bzw. mock-mässig den Funktionsaufruf gestaltet?

            Wie bitte? Sorry, mit den Begriffen kann ich nichts anfangen.

            statt: OCIBindByName($result, ":seqwert", $nextid);

            bspw.: OCIBindByName($result, ":seqwert", &$nextid,-1);

            Man beachte die _unterschiedliche_ Syntax.

  2. yo,

    ich kann noch nicht ganz erkennen, was genau du machen willst, wobei ich eine procedure noch nie über php ausgeführt habe. aber den nächsten wert einer sequenz bekommst du über folgende syntax:

    sequenzname.NEXTVAL

    Ilja

  3. Hallo,

    OCIBindByName($result, ":seqwert", $nextid);

    Ohne mich jetzt mit PHP auszukennen würde ich nach der Lektüre von http://de2.php.net/OCIBindByName sagen, dass Du eine Fehler in dieser Zeile hast. Ich denke es müsste irgenbdwie so lauten:

    OCIBindByName($result, ":seqwert", &$nextid,-1);

    Aber wie gesagt, ich kenn mich bei dem PHP zeuchs nicht wirklich aus.

    Grüße
      Klaus