Oracle存储过程编译错误

时间:2017-04-05 03:41:10

标签: 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) 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;

2 个答案:

答案 0 :(得分:1)

试试这个:

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;
/

所做的更改:

  1. 从参数
  2. 中删除了尺寸
  3. 删除了declare关键字 - 不属于过程语法
  4. 的一部分
  5. 修改查询以便在找到行后立即停止搜索,否则返回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的行数可以任意大,则可以降低性能):

    select coalesce(max(1), 0)
    into varTmp
    from crm_admin.lty_user_store
    where usr_nm = userid
    
  6. 请勿将:与变量和参数一起使用。

答案 1 :(得分:0)

不要将":#34; 与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;