2017-02-22 4 views
0

Alles was ich will ist, alle Zeilen aus einer Tabelle zu markieren und sobald sie ausgewählt und angezeigt werden, müssen die Daten in der Tabelle vollständig gelöscht werden. Die Hauptsorge ist, dass dies nur mit sql und nicht mit plsql geschehen muss. Gibt es eine Möglichkeit, dies innerhalb eines Pakets zu tun und dieses Paket in einer SELECT-Anweisung aufzurufen? Bitte erleuchte mich hier.Löschen Sie alle Daten aus einer Tabelle nach der Auswahl aller Daten aus der gleichen Tabelle

Dummy Tabelle ist wie folgt:

ID NAME SALARY DEPT 
================================== 
    1 Sam 50000  HR 
    2 Max 45000  SALES 
    3 Lex 51000  HR 
    4 Nate 66000  DEV 

Jede Hilfe wäre sehr geschätzt.

+0

Select * aus der Tabelle; aus der Tabelle löschen, wobei 1 = 1; - ODER-- Tabelle abschneiden; –

+0

zeigt die Daten an, löscht sie aber nie. Übrigens, danke für die Hilfe. – hashir

+0

Begehen Sie? ^.^ –

Antwort

0

Wählen Sie * aus Table_Name;

Löschen von Table_Name

0

Um die Daten aus einer SQL-Abfrage versuchen, wählen Sie eine Pipeline-Funktion verwenden.

Die Funktion kann einen Cursor für die gewünschten Daten (oder alle Daten in der Tabelle) definieren, durchläuft den Cursor, indem er jede Zeile so leitet, wie sie geht.

Wenn die Cursorschleife endet, d. H. Alle Daten wurden von Ihrer Abfrage verbraucht, kann die Funktion eine TRUNCATE-Tabelle ausführen.

Um von der Funktion auszuwählen, verwenden Sie die folgende Syntax;

SELECT * 
FROM TABLE(my_function) 

finden Sie in der folgenden Oracle-Dokumentation Funktionen Informationen pipelined - https://docs.oracle.com/cd/B28359_01/appdev.111/b28425/pipe_paral_tbl.htm

+0

das Abrufen der Zeilen ist kein Problem, aber wenn ich versuche, eine DML-Delete innerhalb einer Funktion durchzuführen, beschränkt Orakel mich einen Fehler zu werfen, der besagt, dass eine DML-Operation in einer Abfrage nicht durchgeführt werden kann. – hashir

+0

OK. Ich habe das Löschen nicht selbst versucht, aber diese Nachricht macht Sinn. Ich würde vorschlagen, dass dies nicht möglich ist, so wie Sie es wollen (ohne PL/SQL). – BriteSponge

+0

ja, ja! Das ist das Problem. – hashir

0

Dies kann nicht in einem Paket durchgeführt werden, weil „dies darf nur und nicht PLSQL mit SQL getan werden“. Ein Paket ist PL/SQL.

Es ist jedoch sehr einfach. Sie möchten zwei Dinge: Wählen Sie die Tabellendaten aus und löschen Sie sie. Zwei Dinge, zwei Befehle.

select * from mytable; 
truncate mytable; 

(Sie könnten truncate mytable; mit delete from mytable;, ersetzen aber das ist langsamer und muss von commit; gefolgt werden, um die Löschung zu bestätigen und um die Transaktion zu beenden.)

+0

Dies löst das Problem nicht, es wird nicht angezeigt und gleichzeitig gelöscht. – hashir

+0

Also was * ist * das Problem? Ich stelle mir eine App vor: 1. Sie wählt die Daten aus; 2. es löscht die Daten; 3. Wenn alles gut gegangen ist, zeigt es die Daten an. Was wäre so schlecht mit diesem Ansatz? Warum würde es nicht ausreichen? –

+0

Er muss die Daten trotzdem anzeigen und die Daten löschen, damit der nächste Datensatz für die nächste Transaktion eingefügt werden kann. Es ist möglich und ziemlich einfach, aber nicht, wenn Sie nur sql verwenden dürfen. Die Engine oder (sagen) Werkzeug, wo ich die Abfrage setzen muss akzeptiert nur sql und nichts anderes, wenn ich einen zwei Liner schreiben wie - * aus mytable auswählen; löschen aus mytable wo 1 = 1; Es wird ein Fehler mit ungültigem Zeichen ";" Vielleicht ist es das Werkzeug, das für die erforderlichen Ergebnisse nicht geeignet wäre. – hashir

0

Ohne PL/SQL nicht möglich ist es.

Mit PL/SQL können Sie eine Funktion erstellen, die eine Zeile eingefügt wird, und löschen dann

Hier ist Beispiel:

drop table tempdate; 
create table tempdate as 
select '1' id from dual 
UNION 
select '2' id from dual 


CREATE TYPE t_tf_row AS OBJECT (
    id   NUMBER 
); 


CREATE TYPE t_tf_tab IS TABLE OF t_tf_row; 




CREATE OR REPLACE FUNCTION get_tab_tf RETURN t_tf_tab PIPELINED AS 
    PRAGMA AUTONOMOUS_TRANSACTION; 
BEGIN 
    FOR rec in (select * from tempdate) LOOP 
    PIPE ROW(t_tf_row(rec.id)); 
    END LOOP; 
    delete from tempdate ; commit; 
END; 

select * from table(get_tab_tf) -- it will populate and then delete 

select * from tempdate --you can check here result of deleting 
+0

Ich muss die Daten dem Benutzer anzeigen und danach löschen. – hashir

+0

Ja, Sie können anzeigen, indem Sie Zeile in Funktion ausfüllen und sie parallel löschen –

+0

können Sie bitte ein Stück Code ausarbeiten oder löschen? – hashir

0

Sie können

unter Abfrage verwenden
select * from Table_demo delete from Table_demo 
0

Die Funktion, die Sie suchen, ist SERIALIZABLE ISOLATION LEVEL. Diese Funktion ermöglicht wiederholbare liest, die insbesondere garantieren, dass beide SELECT und DELETE lesen und verarbeiten dieselben identischen Daten.

Beispiel

Alter session set isolation_level=serializable; 

select * from tempdate; 

--- now insert from other session a new record 

delete from tempdate ; 
commit; 

-- re-query the table old records are deleted, new recor preserved. 
+0

Er möchte Datensätze löschen, wenn die Select-Anweisungen Ende ist, mit einer Abfrage –

+0

@Kamil auf lange Sicht die Zahl oder der ausgewählte Datensatz sollte gleich der Anzahl der eingefügten Recorded sein. Dies wird durch diese Lösung garantiert, andere Prozeduren können Datensätze * lecken *, d. H. Sie könnten einen Datensatz einfügen, der niemals ausgewählt wird. –

+0

In Funktion können wir das Einfügen neuer Zeilen blockieren, ich denke, Ihre Lösung ist die Antwort für andere Fragen. –

Verwandte Themen