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

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

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

id | first_name    | last_name      | phone
1  | check_first   | check_last     | 1234567890
2  | check_first2   | check_last2   | 1234567890
3  | check_first3   | check_last3   | 1234567890
4  | check_first4   | check_last4   | 1234567890
5  | check_first5   | check_last5   | 1234567890
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;否则,无法返回结果。
样品表:

SQL> select * From test;

        ID FIRST_N
---------- -------
         1 check 1
         2 check 2
         3 check 3
         4 check 4
         5 check 5
         6 check 6

6 rows selected.

功能:

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

Function created.

测试:

SQL> select f_test('2,3,4') from dual;   --> this is that "single statement"

F_TEST('2,3,4')
--------------------
CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

        ID FIRST_N
---------- -------
         1 check 1
         5 check 5
         6 check 6

SQL>

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

相关问题