在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创建过程的主要内容,如果未能解决你的问题,请参考以下文章

oracle存储过程中写IF ELES

在SQL中存储过程的一般语法是啥?

oracle的存储过程

水晶报表可以连接oracle的存储过程吗

oracle存储过程中if条件后的sql没有执行

oracle储存过程中,if条件为某变量不等于1,怎么写