Oracle存储过程编译错误

Oracle存储过程编译错误,oracle,plsql,procedure,Oracle,Plsql,Procedure,我是PL/SQL新手。有人能帮我修复编译错误吗?非常感谢你的帮助。另外,之后我想调用这个过程来检查并添加一个新用户 create or replace procedure CheckAddUser ( userid in varchar2(20)) as declare vartmp number; begin SELECT nvl((SELECT distinct 1 FROM crm_admin.LTY_USER_STORE WHERE usr_nm = userid ), 0)

我是PL/SQL新手。有人能帮我修复编译错误吗?非常感谢你的帮助。另外,之后我想调用这个过程来检查并添加一个新用户

create or replace procedure CheckAddUser ( userid in varchar2(20))
as
declare vartmp number;
begin
    SELECT nvl((SELECT distinct 1 FROM crm_admin.LTY_USER_STORE WHERE usr_nm = userid  ), 0) INTO :varTmp FROM dual;    
    IF (:varTmp = 0) THEN
       dbms_output.put_line('the user ' || ':userid' || ' does not exist');

    elsif (:varTmp = 1) THEN
       dbms_output.put_line('the user ' || ':userid' || '  already exist');
    End if;
end;
试试这个:

create or replace procedure checkadduser(userid in varchar2)
as
    vartmp number;
begin
    select coalesce(max(1), 0) into vartmp
    from dual
    where exists (
            select 1
            from crm_admin.lty_user_store
            where usr_nm = userid
            );
    if vartmp = 0 then
        dbms_output.put_line('the user ' || userid || ' does not exist');
    elsif vartmp = 1 then
       dbms_output.put_line('the user ' || userid || '  already exist');
    end if;
end;
/
所作的修改:

  • 已从参数中删除大小
  • 删除了
    declare
    关键字-不是过程语法的一部分
  • 修改查询以在找到行后立即停止搜索,并返回1,否则返回0

    select coalesce(max(1), 0) into varTmp
    from dual
    where exists (
            select 1
            from crm_admin.lty_user_store
            where usr_nm = userid
            );
    
    如果usr_nm在您的表中是唯一的,这也会很好地工作(即使它不是唯一的,也可以使用它,但如果每个usr_nm的行数可以任意大,则性能可能会稍差):

  • 不要将
    与变量和参数一起使用

  • 不要将:“与var一起使用。 我做了一些改动,我可能会用到:

    --I recommended to change procedure to function, then you can use it in SQL
    create or replace 
    procedure CheckAddUser ( userid in varchar2)
    as
      --Best practics, use self-describing variables
        isuserexist number(1,0); -- vartmp
        message_suff varchar2(30):=' does not exist';
    begin
      --Best practics, first check the parameters
      if trim(userid) is null then
        raise_application_error(-20000, 'Param userid is empty');
      end if;
    
        select count(*) into isuserexist
      from crm_admin.lty_user_store 
      where usr_nm = userid;
    
      --only one if, reads easier
      if isUserExist > 0 then
        message_suff:= ' already exist';
      end if;
    
      dbms_output.put_line('the user ' || ':userid' || message_suff);
    end;
    

    你看到的编译错误是什么?@Chetan在sqldeveloper中,我得到了几个:1。错误(2,44):PLS-00103:遇到符号“((当需要下列情况之一时:=),@%默认字符符号“:=”被替换为“(”以继续。2.错误(4,1):PLS-00103:遇到符号“声明”当需要下列操作之一时:开始函数pragma过程子类型当前光标删除存在于外部语言之前符号“开始”被替换为“声明”以继续。@GurV现在可以工作了。感谢您的帮助!开始2 checkadduser('MikeC'));3结束;4/用户MikeC已经存在感谢您的回答和良好实践提示。这很有帮助!@Farkhat
    trim(userid)='
    永远不会是真的。此外,如果我们讨论的是最佳实践,我们可以避免在
    if
    条件和
    count(*)周围使用不必要的括号
    是计算行数的标准表达式,而不是
    count(1)
    (另外,它的输入更少)。
    --I recommended to change procedure to function, then you can use it in SQL
    create or replace 
    procedure CheckAddUser ( userid in varchar2)
    as
      --Best practics, use self-describing variables
        isuserexist number(1,0); -- vartmp
        message_suff varchar2(30):=' does not exist';
    begin
      --Best practics, first check the parameters
      if trim(userid) is null then
        raise_application_error(-20000, 'Param userid is empty');
      end if;
    
        select count(*) into isuserexist
      from crm_admin.lty_user_store 
      where usr_nm = userid;
    
      --only one if, reads easier
      if isUserExist > 0 then
        message_suff:= ' already exist';
      end if;
    
      dbms_output.put_line('the user ' || ':userid' || message_suff);
    end;