PL/SQL: Fehler beim erstellen von Sequenzen
Ich bin ganz neue PL/SQL, und bin mit Oracle SQL Developer zu schreiben eine Prozedur, die verwendet eine Sequenz zu generieren, die einen Primärschlüssel für einige vorhandene Daten, zum schreiben in eine andere DB.
Den code in Frage, ist unter NDA.. im Grunde hab ich die folgenden:
create or replace
PROCEDURE Generate_Data
(
output IN VARCHAR2
)
AS
-- Variables here --
CURSOR myCursor IS
SELECT data1, data2
FROM table;
CREATE SEQUENCE mySequence <-- error on this line
START WITH 0
INCREMENT BY 1;
BEGIN
LOOP
-- snip --
Es stellt sich die Fehler PLS-00103, sagen, es mal mit dem-symbol ERSTELLEN, wenn Sie erwartet, auf der die folgende: beginnen, Funktions -, package -, pragma -, Verfahrens -, ...
Habe ich das Beispiel an:
http://www.techonthenet.com/oracle/sequences.php
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Grund, warum man immer diesen Fehler ist, dass du versuchst zu führen DDL, in diesem Fall die Erstellung einer Sequenz, innerhalb von PL/SQL. Es ist möglich, dies zu tun, aber Sie muss Verwendung
execute immediate
.Als Alex sagt, Sie würde auch nicht in der Lage sein, dies zu tun in der
declare
Abschnitt. Es würde in etwa so Aussehen:Jedoch, wie Padmarag auch sagt, es ist höchst unwahrscheinlich, dass Sie wollen, dies zu tun innerhalb von PL/SQL. Es wäre eher normal, eine Sequenz zu erzeugen, die außerhalb und klicken Sie dann verweisen Sie diese später. Mehr im Allgemeinen, die Durchführung von DDL-innerhalb eines PL/SQL-block eine schlechte Idee ist; es sollte keine Notwendigkeit für Sie, es zu tun.
Du nicht erwähnt, welche version von Oracle, die Sie verwenden. Aus 11g-die Möglichkeiten, in denen Sie Zugriff auf Sequenzen verlängert wurde. Wenn Sie mit 11g und Sie können die Sequenz durch die Schaffung einer Variablen und zuweisen der nächste Wert in der Sequenz, die
.nextval
, auf diese variable:Wenn Sie vor 11g müssen Sie (außerhalb der DML) verwenden Sie eine select-Anweisung, um den nächsten Wert:
Bitte beachten Sie, dass eine Sequenz gemeint ist, die ein persistentes Objekt in der Datenbank. Es gibt keine Notwendigkeit, Sie zu löschen und neu erstellen jedes mal, wenn Sie es verwenden möchten. Wenn Sie Ihr Skript ausführen soll, dann erneut ausführen, es würde die Reihenfolge gerne beibehalten Erhöhung der zurückgegebene Wert.
Weiter Lesen
execute immediate
. Gibt es einen Grund, warum Sie nicht erstellen Sie die Sequenz außerhalb des Blocks?Kann man nicht erstellen, die Reihenfolge, in der DECLARE-block-Verfahren. Verschieben Sie es nach BEGINNEN. Es ist diskutabel, ob es Sinn macht, aber. Sie wahrscheinlich brauchen, um es zu schaffen, die außerhalb Ihrer Vorgehensweise in den ersten Platz.
Update
Eigentlich, wenn Sie wirklich wollen, dass es in BEGIN/END verwenden Sie die folgenden:
CREATE
direkt. Verwenden müssenEXECUTE IMMEDIATE
, obwohl es die Nützlichkeit ist noch vertretbar.Würden Sie brauchen, um die Sequenz zu erstellen, bevor Sie es.
Und in der PL/SQL-code verwenden
-- Variables here --1
v_seq_val number;
BEGIN
Select mySequence.nextval from dual into v_seq_val
In Allgemeinen SQL ist für DDL(Data Definition Language) und PL/SQL ist für DML(Data Manipulation Language) und Logik.
Wenn Sie wollten, könnten Sie tun, Erstellen von PL/SQL, aber ich denke, dass ist nicht das, was Sie wollen hier.