我想让存储过程调用3个参数返回值分别为1、2、0。由于刚接触不会写返回3个参数的过程。WHEN ERR_NOTFOUNDXY THEN
DBMS_OUTPUT.PUT_LINE('必须指定门牌地址表中的门牌编号没有找到坐标值'); 
RETURN FALSE; 
例子:(虽然编译,但知道是错的。)PROCEDURE XSDOORADDPOINT(XSAJBH XS_AJJBXX.AJBH%TYPE,DOORID T_DZ_MPDZ.ADDRESSID%TYPE,IRETURN IN OUT INT )IS
BEGIN
IF XSDOORADDPOINT_FUC(XSAJBH,DOORID) = TRUE THEN
IRETURN :=1;
ELSIF XSDOORADDPOINT_FUC(XSAJBH,NULL) = FALSE THEN
IRETURN :=2;
ELSIF XSDOORADDPOINT_FUC(XSAJBH,DOORID) = FALSE THEN
IRETURN :=0;
END IF;
END XSDOORADDPOINT;我想让ERR_NOTFOUNDXY 属于PROCEDURE里 IRETURN :=2
就是说当触发ERR_NOTFOUNDXY这个错误时,返回值为2。
但不知该怎么写。

解决方案 »

  1.   

    PROCEDURE XSDOORADDPOINT(XSAJBH XS_AJJBXX.AJBH%TYPE,DOORID T_DZ_MPDZ.ADDRESSID%TYPE,IRETURN IN OUT INT )IS
    BEGIN
    IF XSDOORADDPOINT_FUC(XSAJBH,DOORID) = TRUE THEN
    IRETURN :=1;
    ELSIF XSDOORADDPOINT_FUC(XSAJBH,NULL) = FALSE THEN
    IRETURN :=2;
    ELSIF XSDOORADDPOINT_FUC(XSAJBH,DOORID) = FALSE THEN
    IRETURN :=0;
    END IF;
    WHEN ERR_NOTFOUNDXY THEN
    DBMS_OUTPUT.PUT_LINE('必须指定门牌地址表中的门牌编号没有找到坐标值');
    IRETURN :=2;
    END XSDOORADDPOINT;
      

  2.   

    参数指定为 OUT 表示是过程输出的参数, IN 表示是输入的参数, IN OUT 表示该参数可做为输入也可输出
      

  3.   

    提示出错
    Compilation errors for PACKAGE BODY DLGADATA.AJXXMANAGERError: PLS-00103: 出现符号 "WHEN"在需要下列之一时:
            begin case declare end
              exception exit for goto if loop mod null pragma raise return
              select update while with <an identifier>
              <a double-quoted delimited-identifier> <a bind variable> <<
              close current delete fetch lock insert open rollback
              savepoint set sql execute commit forall merge
              <a single-quoted SQL string> pipe
           符号 "case" 被替换为 "WHEN" 后继续。
    Line: 79
    Text: WHEN ERR_NOTFOUNDXY THENError: PLS-00103: 出现符号 "XSDOORADDPOINT"在需要下列之一时:
            case
    Line: 88
    Text: END XSDOORADDPOINT;Error: PLS-00103: 出现符号 "END"在需要下列之一时:
            begin function package
              pragma procedure form
    Line: 844
    Text: END AJXXMANAGER;
      

  4.   

    PROCEDURE XSDOORADDPOINT(XSAJBH XS_AJJBXX.AJBH%TYPE,DOORID T_DZ_MPDZ.ADDRESSID%TYPE,IRETURN IN OUT INT )IS
    BEGIN
    IF XSDOORADDPOINT_FUC(XSAJBH,DOORID) = TRUE THEN
    IRETURN :=1;
    ELSIF XSDOORADDPOINT_FUC(XSAJBH,NULL) = FALSE THEN
    IRETURN :=2;
    ELSIF XSDOORADDPOINT_FUC(XSAJBH,DOORID) = FALSE THEN
    IRETURN :=0;
    END IF;
    exception 
    WHEN ERR_NOTFOUNDXY THEN
    DBMS_OUTPUT.PUT_LINE('必须指定门牌地址表中的门牌编号没有找到坐标值');
    IRETURN :=2;
    END XSDOORADDPOINT;--ERR_NOTFOUNDXY 异常是你自定义的么
      

  5.   

    问题出在"WHEN ERR_NOTFOUNDXY THEN",你的过程中不存在DML语句,所以写了exception与没写一个样.你还不如直接用判断语句产生异常呢,另外exception的格式:
    exception
      when no_data_found then
        dbms_output.put_line(err_msg);
      when others then
        dbms_output.put_line(err_msg);
      ...
      

  6.   

    我其实原来就是这样写的,但改动后的意思是当触发ERR_NOTFOUNDXY这个exception时,过程返回IRETURN := 2,这样的语句俺不会写~
      

  7.   

    你直接用if来判断就行了,如:
    --判断入参为空
    if nvl(in_val,'xxx')='xxx' then  --nvl函数判断in_val变量是否为空
      DBMS_OUTPUT.PUT_LINE('必须指定门牌地址表中的门牌编号没有找到坐标值');
      IRETURN :=2;
      return; --返回
    end if;
    不定非得用exception啊