如何在一条sql语句中从一个oracle表中删除和选择行

cl25kdpy  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(406)

我有一张4列的table。我想删除某个列中某个值与之匹配的某些行,并在一条sql语句中检索其余的所有行。有可能吗?
数据表名

  1. id | first_name | last_name | phone
  2. 1 | check_first | check_last | 1234567890
  3. 2 | check_first2 | check_last2 | 1234567890
  4. 3 | check_first3 | check_last3 | 1234567890
  5. 4 | check_first4 | check_last4 | 1234567890
  6. 5 | check_first5 | check_last5 | 1234567890
  7. 6 | check_first6 | check_last6 | 1234567890

如果将id传递为(2,3,4),则必须删除这些行(2,3,4)并在一个oracle sql语句中检索1,5,6

h6my8fg2

h6my8fg21#

好吧,您可以使用一个语句(在它之前输入更多的内容之后)来实现这一点。不过,你能做到并不意味着你应该做到。我不会的。
不管怎样,这里你去:这个“单语句”是一个函数调用内 select . 为什么?因为它能够返回结果集。一个程序会是一个更好的选择,但你必须把它 OUT 参数的结果,这需要比单个语句多一点类型。
现在我们来解释为什么不应该这样做:delete是一个dml,不能在函数中完成。实际上,它可以,但它(功能)必须是一个自治事务。此外,必须首先提交(或回滚)该dml;否则,无法返回结果。
样品表:

  1. SQL> select * From test;
  2. ID FIRST_N
  3. ---------- -------
  4. 1 check 1
  5. 2 check 2
  6. 3 check 3
  7. 4 check 4
  8. 5 check 5
  9. 6 check 6
  10. 6 rows selected.

功能:

  1. SQL> create or replace function f_test (par_id in varchar2)
  2. 2 return sys_refcursor
  3. 3 is
  4. 4 pragma autonomous_transaction;
  5. 5 rc sys_refcursor;
  6. 6 begin
  7. 7 delete from test
  8. 8 where id in (select regexp_substr(par_id, '[^,]+', 1, level)
  9. 9 from dual
  10. 10 connect by level <= regexp_count(par_id, ',') + 1
  11. 11 );
  12. 12 commit;
  13. 13 open rc for select * from test;
  14. 14 return rc;
  15. 15 end;
  16. 16 /
  17. Function created.

测试:

  1. SQL> select f_test('2,3,4') from dual; --> this is that "single statement"
  2. F_TEST('2,3,4')
  3. --------------------
  4. CURSOR STATEMENT : 1
  5. CURSOR STATEMENT : 1
  6. ID FIRST_N
  7. ---------- -------
  8. 1 check 1
  9. 5 check 5
  10. 6 check 6
  11. SQL>

再一次,重复人们已经说过的话:不要那样做。先删除,然后选择下一步。两种说法。

展开查看全部

相关问题