1.字符型变量声明,要给出长度
  returnValue CHAR := '00';
  lxbh CHAR;
  改为:
  returnValue CHAR(10) := '00';
  lxbh CHAR(10);
 
2. 在Procedure中,select必须是select into语句

解决方案 »

  1.   


    LINE/COL ERROR
    -------- -----------------------------------------------------------------
    26/3     PLS-00103: Encountered the symbol "BEGIN" when expecting one of
             the following:
             ; is with authid deterministic parallel_enable as
             The symbol ";" was substituted for "BEGIN" to continue.45/2     PLS-00103: Encountered the symbol "END"
      

  2.   

    into 后面该接什么?
    SELECT *  INTO ???FROM SYSTEM.DUANXXLX_NEW WHERE LEIXBH = lxbh;
      

  3.   

    into 后面接变量,你select 出几个字段,就into几个变量.
      

  4.   

    你的
    IF SQL%ROWCOUNT < 0
      rtVALUE := '04';
      END IF;
    改为:
    IF SQL%ROWCOUNT < 0 then
    rtVALUE := '04';
    END IF;
      

  5.   

    w_tsinghua:
      这个错我已经该了,可是还是不行:
     6/3     PLS-00103: Encountered the symbol "BEGIN" when expecting one of
             the following:
             ; is with authid deterministic parallel_enable as
             The symbol ";" was substituted for "BEGIN" to continue.45/2     PLS-00103: Encountered the symbol "END"
      

  6.   

    现在代码已经修改为:
    CREATE OR REPLACE PACKAGE sdsms AS
      FUNCTION checkUSER(uname IN VARCHAR2,
      passwd IN VARCHAR2,sjtype IN CHAR,dxtype IN CHAR) RETURN CHAR;
      PROCEDURE sendtoTABLE(username IN VARCHAR2,password IN VARCHAR2,
      mobiletype IN VARCHAR2,smstype IN VARCHAR2,sender IN VARCHAR2,
      receiver IN VARCHAR2,rtVALUE OUT CHAR);
    END sdsms;
    /
    CREATE OR REPLACE PACKAGE BODY sdsms AS
      FUNCTION checkUSER(uname IN VARCHAR2,passwd IN VARCHAR2,
         sjtype IN CHAR,dxtype IN CHAR) RETURN CHAR IS
     
      returnValue CHAR(4) := '00';
      lxbh CHAR(6);
      wjlx SYSTEM.DUANXXLX_NEW.WENJLX%TYPE;
      ser_num SYSTEM.USERS.C_SPEC_SERV_NUM%TYPE;
      BEGIN
      lxbh :=sjtype + dxtype;
      SELECT C_SPEC_SERV_NUM INTO ser_num FROM SYSTEM.USERS WHERE  C_USER_NAME = uname AND C_PASSWORD = passwd;
      IF SQL%NOTFOUND THEN
      returnValue := '02';
      END IF;
      SELECT WENJLX INTO wjlx FROM SYSTEM.DUANXXLX_NEW WHERE LEIXBH = lxbh;
      IF SQL%NOTFOUND THEN
      returnValue :='05';
      END IF;
      EXCEPTION
      WHEN OTHERS THEN
      RETURN '05';
      RETURN returnValue; 
      END checkUSER;
      PROCEDURE sendtoTABLE(username IN VARCHAR2,password IN VARCHAR2,
            mobiletype IN VARCHAR2,smstype IN VARCHAR2,
            sender IN VARCHAR2,receiver IN VARCHAR2,rtVALUE OUT CHAR)
     
      BEGIN   
      COMMIT;
    SET TRANSACTION READ WRITE ;
      rtVALUE := checkUSER(username ,password ,
            mobiletype ,smstype );
      IF(rtVALUE = '00') THEN
      INSERT INTO SYSTEM.SPRECORD (C_USERNAME,C_PASSWORD,
      C_SENDER,C_RECEIVER ,I_MOBILE_TYPE,I_SMS_TYPE,I_STATUS,
      I_SEND_TIME) VALUES(username ,password ,
                 sender,receiver, mobiletype ,smstype ,
                 0,0,SYSDATE);
      IF SQL%ROWCOUNT < 0 THEN
      rtVALUE := '04';
      END IF;
      END IF;
      EXCEPTION
      WHEN OTHERS THEN
      rtVALUE := '04';
      END sendtoTABLE;
     END sdsms;
    /-----------------------------------
    错误提示:
    警告: 创建的包体带有编译错误。PACKAGE BODY SDSMS 出现错误:LINE/COL ERROR
    -------- -----------------------------------------------------------------
    28/3     PLS-00103: Encountered the symbol "BEGIN" when expecting one of
             the following:
             ; is with authid deterministic parallel_enable as
             The symbol ";" was substituted for "BEGIN" to continue.47/2     PLS-00103: Encountered the symbol "END"
      

  7.   

    PROCEDURE sendtoTABLE(username IN VARCHAR2,password IN VARCHAR2,
            mobiletype IN VARCHAR2,smstype IN VARCHAR2,
            sender IN VARCHAR2,receiver IN VARCHAR2,rtVALUE OUT CHAR)
    改为
    PROCEDURE sendtoTABLE(username IN VARCHAR2,password IN VARCHAR2,
            mobiletype IN VARCHAR2,smstype IN VARCHAR2,
            sender IN VARCHAR2,receiver IN VARCHAR2,rtVALUE OUT CHAR)
    AS
      

  8.   

    另外,对于SELECT的结果应该用no_data_found做数据为空的判断!
      

  9.   

    为什么
     SQL%NOTFOUND 不行吗??????????????
      

  10.   

    NOTFOUND is the logical opposite of %FOUND. %NOTFOUND yields TRUE if an INSERT, UPDATE, or DELETE statement affected no rows, or a SELECT INTO statement returned no rows. Otherwise, %NOTFOUND yields FALSE. In this example, you use %NOTFOUND to insert a new row if an update fails:
      

  11.   

    如果SELECT返回的结果记录数为0,应该用异常来捕捉,就是用no_data_found~
      

  12.   

    如果SELECT语句返回的记录数大于1,就应该用TOO_MANY_ROWS的异常来捕捉!BEGIN
       SELECT FIELD INTO V_NUM FROM TAB WHERE { your condition };
    EXCEPTION
       WHEN NO_DATA_FOUND THEN //对没有满足条件的记录的处理
          ……
       WHEN TOO_MANY_ROWS THEN //对满足条件返回多条记录的处理
          ……
    END;