我想要的只是从表中选择所有行,一旦选择并显示,就必须完全删除驻留在表中的数据。主要担心的是,这必须仅使用sql而不是plsql来完成。有没有办法在包内部执行此操作并在select语句中调用该包?请在这里赐教。
虚拟表如下:
ID NAME SALARY DEPT
==================================
1 Sam 50000 HR
2 Max 45000 SALES
3 Lex 51000 HR
4 Nate 66000 DEV
非常感谢任何帮助。
答案 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
.此功能可启用可重复读取,这尤其可确保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.