CREATE OR REPLACE PROCEDURE login_p (
   username   IN       VARCHAR2,
   userpwd    IN       VARCHAR2,
   userid     OUT      NUMBER
)
AS
   num   NUMBER;
BEGIN
   SELECT userid
     INTO num
     FROM right_user
    WHERE username = '|| username ||' AND userpwd = '|| userpwd ||';   IF num IS NOT NULL
   THEN
      userid := num;
   END IF;
END;测试:
declare   
    username varchar2(255);
    userpwd varchar2(255);   
    userid      number; 
begin 
    username := 'admin';
    userpwd :='96E79218965EB72C92A549DD5A330112';
exec login_p(username,userpwd,userid);
    dbms_output.put_line(userid);
end;
总是提示:ORA-06550: 第 8 行, 第 7 列: 
PLS-00103: 出现符号 "LOGIN_P"在需要下列之一时:
 := . ( @ % ;
符号 ":=" 被替换为 "LOGIN_P" 后继续。

解决方案 »

  1.   

    难道要这样exec login_p(username,userpwd);
      

  2.   

    BEGIN
      SELECT userid
      INTO num
      FROM right_user
      WHERE username = '|| username ||' AND userpwd = '|| userpwd ||';
      
      userid := num;EXCEPTION
      WHEN NO_DATA_FOUND then
         userid:=0;
         
      WHEN others then
         userid:=0;
    END;
      

  3.   

    是不是参数userid和字段userid起了同样的名字所致;参数改各名字试试;
      

  4.   


    CREATE OR REPLACE PROCEDURE login_p (
      username IN VARCHAR2,
      userpwd IN VARCHAR2,
      userid OUT NUMBER
    )
    AS
      num NUMBER;
      sqlstr varchar2(4000);
    BEGIN
      sqlstr:='SELECT userid
      FROM right_user
      WHERE username = '''|| username ||''' AND userpwd = '''|| userpwd ||'''';
      execute immediate sqlstr into num;
      IF num IS NOT NULL
      THEN
      userid := num;
      END IF;
    END;
      

  5.   

    CREATE OR REPLACE PROCEDURE login_p (
      username IN VARCHAR2,
      userpwd IN VARCHAR2,
      userid OUT NUMBER
    )
    AS
      num NUMBER;
    BEGIN
    execute immediate 'SELECT userid FROM right_user WHERE username = '''|| username ||''' AND userpwd = '''|| userpwd ||'''' INTO num;
    IF num IS NOT NULL THEN
      userid := num;
      END IF;
    END;declare   
      username varchar2(255);
      userpwd varchar2(255);   
      userid number;  
    begin  
      username := 'admin';
      userpwd :='96E79218965EB72C92A549DD5A330112';
      login_p(username,userpwd,userid);
      dbms_output.put_line(userid);
    end;--or 过程代码这样CREATE OR REPLACE PROCEDURE login_p (
      username IN VARCHAR2,
      userpwd IN VARCHAR2,
      userid OUT NUMBER
    )
    AS
      num NUMBER;
    BEGIN
      SELECT userid
      INTO num
      FROM right_user
      WHERE username =username AND userpwd =userpwd;  IF num IS NOT NULL
      THEN
      userid := num;
      END IF;
    END;
      

  6.   

    使用了:
    CREATE OR REPLACE PROCEDURE login_p (
      username IN VARCHAR2,
      userpwd IN VARCHAR2,
      userid OUT NUMBER
    )
    AS
      num NUMBER;
      sqlstr varchar2(4000);
    BEGIN
      sqlstr:='SELECT userid
      FROM right_user
      WHERE username = '''|| username ||''' AND userpwd = '''|| userpwd ||'''';
      execute immediate sqlstr into num;
      IF num IS NOT NULL
      THEN
      userid := num;
      END IF;
    END;调用:
    set serveroutput on
    DECLARE 
      iusername varchar2(255);
      iuserpwd varchar2(255);
      iuserid number;
    BEGIN 
        iusername:='admin';
        iuserpwd:='123456';
       exec rightuser_p (iusername, iuserpwd, iuserid);
      dbms_output.put_line('userid:' ||iuserid);
      COMMIT; 
    END; 
    还是出现
    ORA-06550: 第 8 行, 第 9 列: 
    PLS-00103: 出现符号 "RIGHTUSER_P"在需要下列之一时:
     := . ( @ % ;
    符号 ":=" 被替换为 "RIGHTUSER_P" 后继续
    有啥米工具可以单步的调试的啊
      

  7.   


    你看我的没 老大 都写的很明白了DECLARE 
      iusername varchar2(255);
      iuserpwd varchar2(255);
      iuserid number;
    BEGIN 
        iusername:='admin';
        iuserpwd:='123456';
    rightuser_p (iusername, iuserpwd, iuserid);  ---这里仔细看 
      dbms_output.put_line('userid:' ||iuserid);
      COMMIT; 
    END; 
      

  8.   

    总算明白了
    1。不能加exec
    2.字段变量与自定义的变量不能重复TOAD用起来真不方便