oracle-gespeicherten Prozedur - select -, update-und gibt einen zufälligen Satz von Zeilen
oracle möchte ich einige wenige Zeilen nach dem Zufallsprinzip aus einer Tabelle, eine Spalte aktualisieren, die in diesen Zeilen und kehren Sie mithilfe der gespeicherten Prozedur
PROCEDURE getrows(box IN VARCHAR2, row_no IN NUMBER, work_dtls_out OUT dtls_cursor) AS
v_id VARCHAR2(20);
v_workname VARCHAR2(20);
v_status VARCHAR2(20);
v_work_dtls_cursor dtls_cursor;
BEGIN
OPEN v_work_dtls_cursor FOR
SELECT id, workname, status
FROM item
WHERE status IS NULL
AND rownum <= row_no
FOR UPDATE;
LOOP
FETCH v_work_dtls_cursor
INTO v_id ,v_workname,v_status;
UPDATE item
SET status = 'started'
WHERE id=v_id;
EXIT
WHEN v_work_dtls_cursor % NOTFOUND;
END LOOP;
close v_work_dtls_cursor ;
/* I HAVE TO RETURN THE SAME ROWS WHICH I UPDATED NOW.
SINCE CURSOR IS LOOPED THRU, I CANT DO IT. */
END getrows;
BITTE HELFEN
InformationsquelleAutor user503647 | 2010-07-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Anschluss an Sjuul Janssen ausgezeichnete Empfehlung:
Ein paar Hinweise:
Dies ist ungetestet.
Müssen Sie ersetzen die Klammern den Abschnitt in Typ-Deklarationen mit den entsprechenden Arten für Ihre schema.
Müssen Sie kommen mit einem entsprechenden Wert in der PROBE-Klausel der SELECT-Anweisung; es könnte möglich sein, passieren, dass als ein argument, aber das kann erfordern die Verwendung von dynamischem SQL. Allerdings, wenn Ihre Forderung ist, um zufällige Zeilen aus der Tabelle -, die nur die Filterung durch ROWNUM nicht erreichen-Sie werden möchten, so etwas zu tun.
Weil Sie die Auswahl FÜR das UPDATE, eine Sitzung sperren. Wenn Sie in 11g, möchten Sie vielleicht zu prüfen, das ÜBERSPRINGEN GESPERRT-Klausel der SELECT-Anweisung, die es ermöglichen mehrere gleichzeitige Sitzungen, um code auszuführen, wie diese.
InformationsquelleAutor Adam Musch
Nicht sicher, wo Sie tun Ihrer Begehung, sondern basiert auf dem code, so wie es steht, alle sollten Sie tun müssen, ist die SELECT ... FROM ARTIKEL WHERE STATUS='gestartet'
Wenn es kleine zahlen, könnten Sie halten eine Sammlung von ROWIDs.
wenn es größer ist, dann würde ich eine
Dann wieder einen cursor, der
InformationsquelleAutor Gary Myers
Vielleicht kann dies Ihnen helfen, zu tun, was Sie wollen?
http://it.toolbox.com/blogs/database-solutions/returning-rows-through-a-table-function-in-oracle-7802
InformationsquelleAutor Sjuul Janssen
Eine mögliche Lösung:
Wenn die Anzahl der Zeilen ist besonders groß, der die Globale temporäre Lösung besser sein könnte.
InformationsquelleAutor Allan