从同一个表中选择所有数据后,从表中删除所有数据

时间:2017-02-22 09:28:22

标签: sql database oracle

我想要的只是从表中选择所有行,一旦选择并显示,就必须完全删除驻留在表中的数据。主要担心的是,这必须仅使用sql而不是plsql来完成。有没有办法在包内部执行此操作并在select语句中调用该包?请在这里赐教。

虚拟表如下:

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

非常感谢任何帮助。

6 个答案:

答案 0 :(得分:0)

从Table_Name中选择*;

从Table_Name中删除

答案 1 :(得分:0)

要从SQL查询中选择数据,请尝试使用流水线函数。

该函数可以为您想要的数据(或表中的所有数据)定义一个游标,循环遍历每一行的光标。

当游标循环结束时,即查询消耗了所有数据时,该函数可以执行TRUNCATE表。

要从函数中选择,请使用以下语法;

SELECT * 
FROM   TABLE(my_function)

有关管道功能的信息,请参阅以下Oracle文档 - https://docs.oracle.com/cd/B28359_01/appdev.111/b28425/pipe_paral_tbl.htm

答案 2 :(得分:0)

这不能在包内完成,因为“这必须只使用sql而不是plsql”。包 PL / SQL。

然而它很简单。您需要两件事:选择表数据并将其删除。两件事,两个命令。

select * from mytable;
truncate mytable;

(您可以将truncate mytable;替换为delete from mytable;,但速度较慢,需要commit;后面确认删除并结束交易。)

答案 3 :(得分: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

答案 4 :(得分:0)

您可以使用以下查询

select * from Table_demo delete from Table_demo 

答案 5 :(得分:0)

您寻求的功能是SERIALIZABLE ISOLATION LEVEL.此功能可启用可重复读取,这尤其可确保SELECTDELETE同时读取并处理相同的相同内容数据

实施例

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.