【问题标题】:Create procedure with if in oracle sql在oracle sql中使用if创建过程
【发布时间】: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

标签: oracle if-statement stored-procedures plsql


【解决方案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 从未进入表格,因为其电子邮件地址已存在于表格中。

    【讨论】:

      猜你喜欢
      • 2013-10-07
      • 1970-01-01
      • 2021-10-17
      • 2020-09-18
      • 2017-12-21
      • 1970-01-01
      • 2020-05-01
      • 2016-03-03
      • 1970-01-01
      相关资源
      最近更新 更多