Oracle SQL删除读取锁定

3
我想问的问题是,在读取时如何删除记录?我在使用带有Roguewave DB Layer的Oracle和AIX C++应用程序。
我已经在谷歌上搜索了这个答案,但似乎只有简单的例子。是否有一个SQL语句可以返回已删除的行?
这将大大提高我的应用程序性能,因为只有0.1%的情况需要留在这个表中,换句话说,我将0.1%重新插入到表中。
我唯一找到的提示是“Into”子句,我认为使用delete into就可以完成工作,但我从未使用过它。

http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/returninginto_clause.htm

3个回答

5
根据Oracle文档,确实可以一次性删除和读取:
DELETE FROM employees
   WHERE job_id = 'SA_REP' 
   AND hire_date + TO_YMINTERVAL('01-00') < SYSDATE 
   RETURNING salary INTO :bnd1;

我自己从未使用过...但是你可以尝试一下。

我认为这是我想要的语法,目前它无法运行,但我会尝试让它工作。 - Oliver
好的回答。然而,这只能在存储过程中使用,是吗?还是可以直接从JDBC等工具中使用它? - sleske
@sleske:我在使用OCCI时,在没有存储过程的情况下,使用了select语句中的returning子句,它完美地工作了。但由于这是一个不同的场景(其他数据库层),我不能确定是否适用。 - nabulke
似乎需要将bnd1转换为行表,并提取每个字段,似乎没有简单的语句可以返回已删除的行。 - Oliver
实际上,您已经为我提供了我所要求的内容,如果能够提供一个实际的查询来返回表格,那就太棒了,但是您的答案是正确的。 - Oliver

1

不,没有SQL结构可以一次读取和删除一行。

您可以编写一个存储过程来完成此操作。或者您可以将已经读取的记录缓存到内存中(以便不再读取它们),然后稍后进行批量删除(DELETE FROM table WHERE id in (?))。这应该比许多单个DELETE更快。

或者您可能考虑采用不同的方法来解决问题。为什么需要在读取它们时删除这么多行?您是否使用DB表传递消息?也许有其他技术更适合您的问题?如果您觉得必须违反技术的既定惯例,那可能表明您没有使用正确的工具来完成工作...


0

你尝试过像构建审计触发器这样的东西吗?

一个很好的描述,用于构建选择触发器。

创建:

begin
  dbms_fga.add_policy
  ( object_schema=>'SCOTT'
  , object_name=>'EMP'
  , policy_name=>'SAL_ACCESS_HANDLED'
  , audit_column => 'SAL'
  , audit_condition => 'SAL>= 1500'
  , handler_schema => 'SCOTT'
  , handler_module => 'AUDIT_HANDLER.HANDLE_EMP_SAL_ACCESS'
  );
end;
/

函数签名:

PROCEDURE HANDLE_EMP_SAL_ACCESS
( object_schema VARCHAR2
, object_name VARCHAR2
, policy_name VARCHAR2
);

那会如何帮助楼主?行被删除在哪里? - sleske
我实际上没有考虑触发器作为解决方案,我的假设是触发器的工作方式类似于分叉选择-->数据(分叉触发器)-->将数据返回给应用程序,如果我的理解不正确,请告诉我。 - Oliver
通过将调用过程中的插入更改为删除?我必须承认,我还没有尝试在函数内部修改表格而不再次触发 - 所以可能需要添加一个检查。 - Eggi
所以你需要解析语句(获取WHERE子句),并将其修改为DELETE语句,然后执行该语句。 - Eggi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接