将删除行的 plsql 过程

plsql procedure that will delete rows

我有一个 table USERSusername,fname, lname, age.

我需要创建一个程序,如果年龄小于 18 岁,将从参数中删除用户名。

我写了一些代码,但它不起作用:

create procedure delete_user(username in varchar2)
as    
begin
    if exists (delete from username  where age < 18);

    dmbs_output.put_line(username);
end;
exec detele_user('mrgreen');

方法如下。

首先测试用例:

SQL> create table users
  2    (username varchar2(10),
  3     age      number);

Table created.

SQL> insert into users
  2    select 'LF'  , 10 from dual union all
  3    select 'Marc', 20 from dual;

2 rows created.

一个程序:

SQL> create or replace procedure delete_user (p_username in varchar2)
  2  is
  3  begin
  4    delete from users u
  5      where u.username = p_username
  6        and u.age < 18;
  7
  8    dbms_output.put_line('User ' || p_username ||
  9      case when sql%rowcount = 0 then ' NOT ' end ||
 10      ' deleted');
 11  end;
 12  /

Procedure created.

几点说明:

  • 不要将参数命名为 table 列;甲骨文不知道哪个是哪个。使用前缀,例如 p_
  • 始终使用table别名
  • 查看使用 sql%rowcount 的示例,它可以帮助您了解受影响的行数

最后,测试:

SQL> set serveroutput on;
SQL> exec delete_user('LF');
User LF deleted

PL/SQL procedure successfully completed.

SQL> exec delete_user('Marc');
User Marc NOT  deleted

PL/SQL procedure successfully completed.

SQL>

与您的问题无关,但是 - 如果您 post 实际编译的代码通常会有所帮助。

  • dmbs_无效
  • 如果您将过程命名为 delete_user,则不要调用 detele_user

那么你基本上有3个选择。
1. 为用户table 添加一列,表示"user has been deleted"。设置此项但实际上不删除用户。
2. 将 child table(s) 上的 FK 修改为 "ON DELETE CASCADE"。 (如果 DBA 允许 - many/most 不会)。
3.修改程序删除child行:下面是一种可能。

create or replace procedure delete_user (p_username in varchar2)
is
begin
   delete from child_table c
    where c.username = p_username
      and exists (select null 
                    from users u 
                   where u.username = p_username
                     and u.age < 18
                  );

   delete  from users u
    where u.username = p_username
      and u.age < 18; 

  dbms_output.put_line('User ' || p_username ||
                       case when sql%rowcount = 0 then ' NOT ' end ||
                       ' deleted');
end  delete_user ;