2017-02-22 2 views
0

Все, что я хочу, - это выбрать все строки из таблицы и после ее выбора и отображения данные, находящиеся в таблице, должны быть полностью удалены. Основная проблема заключается в том, что это нужно делать, используя только sql, а не plsql. Есть ли способ сделать это внутри пакета и вызвать этот пакет в инструкции select? Пожалуйста, просветите меня здесь.Удалите все данные из таблицы после выбора всех данных из той же таблицы.

пустышки Таблица выглядит следующим образом:

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

Любая помощь будет принята с благодарностью.

+0

Выберите * из таблицы; удалить из таблицы, где 1 = 1; -OR-- обрезать стол ;? –

+0

отображает данные, но не удаляет их. кстати, спасибо за помощь. – hashir

+0

Вы совершаете? ^.^ –

ответ

0

select * from Table_Name;

Удалить из table_name

0

Чтобы выбрать данные из запроса SQL попробуйте использовать конвейерную функцию.

Функция может определять курсор для данных, которые вы хотите (или все данные в таблице), циклически перемещать курсор по каждой строке, когда она идет.

Когда цикл курсора завершается, то есть все данные были использованы вашим запросом, функция может выполнять таблицу TRUNCATE.

Для выбора функции используйте следующий синтаксис;

SELECT * 
FROM TABLE(my_function) 

Смотрите следующую Oracle документации для информационных конвейерных функций - https://docs.oracle.com/cd/B28359_01/appdev.111/b28425/pipe_paral_tbl.htm

+0

Получение строк не вызывает беспокойства, но когда я пытаюсь выполнить DML-элемент удаления внутри функции, оракул ограничивает меня тем, что я ошибаюсь, говоря: «Невозможно выполнить операцию DML внутри запроса. – hashir

+0

ОК. Я не пытался удалить себя, но это сообщение имеет смысл. Я бы предположил, что это может оказаться невозможным по своему желанию (без PL/SQL). – BriteSponge

+0

да, да! вот в чем проблема. – hashir

0

Это не может быть сделано в пакете, потому что «это должно быть сделано с использованием SQL только и не PLSQL». Пакет - PL/SQL.

Однако это очень просто. Вы хотите две вещи: выберите данные таблицы и удалите ее. Две вещи, две команды.

select * from mytable; 
truncate mytable; 

(Вы можете заменить truncate mytable; с delete from mytable;, но это медленнее, и нужно следовать commit; для подтверждения удаления и завершения транзакции.)

+0

это не решит проблему, она не отображается и не удаляется в одно и то же время. – hashir

+0

Итак, что это * проблема? Я представляю себе приложение: 1. он выбирает данные; 2. он удаляет данные; 3. Если все прошло хорошо, оно отображает данные. Что было бы так плохо с этим подходом? Почему этого не хватит? –

+0

Он должен отображать данные в любом случае и удалять данные, чтобы следующая запись данных могла быть вставлена ​​для следующей транзакции. Это возможно и довольно легко, но не тогда, когда вам запрещено использовать только sql. Двигатель или (скажем) инструмент, где я должен поставить запрос, принимает только sql и ничего больше, Когда я пишу два типа подкладки - выберите * from mytable; удалить из таблицы, где 1 = 1; он выдает сообщение об ошибке «Недействительный charecter»; Возможно, это инструмент, который не подходит для требуемых результатов. – hashir

0

Без PL/SQL это не представляется возможным.

Использование PL/SQL вы можете создать функцию, которая будет заполнять строку, а затем удалить

Вот пример:

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

Мне нужно отобразить данные пользователю, а затем удалить их после опекунов. – hashir

+0

да, вы можете отображать, заполняя строку в функции и параллельно удаляя их –

+0

вы можете продумать или отбросить фрагмент кода? – hashir

0

вы можете использовать ниже запрос

select * from Table_demo delete from Table_demo 
0

функция, которую вы ищете, - SERIALIZABLE ISOLATION LEVEL. Эта функция позволяет воспроизводить , что в частности гарантирует, что и SELECT и DELETE будут считывать и обрабатывать одни и те же идентичные данные.

Пример

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

он хочет удалить записи, когда операторы select заканчиваются, с одним запросом –

+0

@ Kamil в долгосрочной перспективе число или выбранная запись должны совпадать с числом вставленных вставленных. Это гарантируется этим решением, другие aproaches могут * утешать * записи, т. Е. Вы можете вставить запись, которая никогда не выбирается. –

+0

В функции мы можем заблокировать вставку новых строк, я думаю, что ваше решение является ответом на другой вопрос. –

Смежные вопросы