将删除行的 plsql 过程
plsql procedure that will delete rows
我有一个 table 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');
方法如下。
首先测试用例:
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 ;
我有一个 table 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');
方法如下。
首先测试用例:
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 ;