在oracle sql中使用if创建过程
Posted
技术标签:
【中文标题】在oracle sql中使用if创建过程【英文标题】:Create procedure with if in oracle sql 【发布时间】:2020-07-20 07:13:31 【问题描述】:我需要创建一个在表格中搜索电子邮件的过程,如果它不存在,该过程会使用该电子邮件创建一条新记录。
类似这样的:
CREATE PROCEDURE check_email (in @email varchar2(99)) AS
BEGIN
IF SELECT email FROM user u WHERE u.email:=email
dbms_output.put_line('This email exists');
ELSE
BEGIN
INSERT INTO user (id, name, surname, city, address, age, email) VALUES (id_user.nextval,'David','Alcatraz','Sevilla', 'Avd miguel de unamuno', 23, email || '@gmail.com')
END
【问题讨论】:
您可以先查询 SELECT count(1) into v_count FROM user u WHERE u.email:=email 如果 v_count > 0 那么 dbms_output.put_line('This email exists'); else 现有代码 这里有什么问题?你很清楚你的要求,是什么阻止你这样做?您能谈谈您面临的问题吗? 每个begin
都需要一个end
,每个if
都需要一个end if
。 @
字符为数据库链接保留。 email
表中的每一行肯定都有email = email
。
【参考方案1】:
考虑到这一点:
用于存储来自表的电子邮件计数器的变量。 您必须用分号结束每个语句。 输入变量的定义是没有长度的类型。看起来像
CREATE PROCEDURE check_email (p_email in varchar2 ) AS
v_counter pls_integer;
BEGIN
SELECT count(*) into v_counter FROM user WHERE upper(email) = upper(p_email);
if v_counter = 1
then
dbms_output.put_line('This email exists');
ELSE
INSERT INTO user (id, name, surname, city, address, age, email) VALUES
(id_user.nextval,'David','Alcatraz','Sevilla', 'Avd miguel de unamuno', 23, p_email ||
'@gmail.com');
commit;
END IF;
exception when others then raise;
END;
【讨论】:
【参考方案2】:何必呢?让数据库来处理。
方法如下:由于电子邮件地址必须是唯一的,因此在该列上创建一个唯一键约束:
SQL> create table t_user
2 (id number constraint pk_user primary key,
3 name varchar2(20) not null,
4 e_mail varchar2(30) not null,
5 --
6 constraint uk_user_mail unique (e_mail)
7 );
Table created.
序列将用于ID
列值。
SQL> create sequence tseq;
Sequence created.
程序:如果存在唯一密钥违规,则不要执行任何操作。其他错误(如果有)将由 Oracle 自动引发。如果你愿意,你可以处理它们。
SQL> create or replace procedure p_user
2 (par_name in t_user.name%type,
3 par_email in t_user.e_mail%type)
4 is
5 begin
6 insert into t_user (id, name, e_mail)
7 values (tseq.nextval, par_name, par_email);
8 exception
9 when dup_val_on_index then null;
10 end;
11 /
Procedure created.
测试:
SQL> exec p_user('Little', 'lf@mail.com');
PL/SQL procedure successfully completed.
SQL> exec p_user('Foot' , 'lf@mail.com');
PL/SQL procedure successfully completed.
SQL> exec p_user('Victor', 'victor@mail.com');
PL/SQL procedure successfully completed.
SQL> select * From t_user;
ID NAME E_MAIL
---------- -------------------- ------------------------------
1 Little lf@mail.com
3 Victor victor@mail.com
SQL>
如您所见,Foot 从未进入表格,因为其电子邮件地址已存在于表格中。
【讨论】:
以上是关于在oracle sql中使用if创建过程的主要内容,如果未能解决你的问题,请参考以下文章