Процедура plsql, которая удалит строки - PullRequest
0 голосов
/ 03 июля 2019

У меня есть таблица USERS со столбцами username,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');

Ответы [ 2 ]

3 голосов
/ 03 июля 2019

Вот как.

Сначала тестовый пример:

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.

Несколько замечаний:

  • не называть параметры столбцами таблицы; Oracle не будет знать, что есть что. Используйте префикс, такой как p_
  • использовать псевдонимы таблиц, всегда
  • см. Пример использования 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>

Не относится к вашей проблеме, но - обычно помогает, если вы публикуете код, который фактически компилируется.

  • dmbs_ недействительно
  • если вы назвали процедуру delete_user, не звоните detele_user
1 голос
/ 04 июля 2019

Тогда у вас есть 3 варианта.
1. Добавьте в таблицу пользователей столбец, указывающий, что «пользователь удален».Установите это, но НЕ удаляйте пользователя.
2. Измените FK на дочерних таблицах на «УДАЛИТЬ КАСКАД».(Если администратор базы данных разрешит это - многие / большинство не будут).
3. Измените процедуру для удаления дочерних строк: Ниже приведена одна возможность.

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 ;
...