简单存储过程代码

CREATE OR REPLACE PROCEDURE P_Utl_Split
(
  iCity         VARCHAR2,       -- 选择的地市,格式:1|深圳~2|广东~3|广州
  oCityIds   OUT  VARCHAR2      -- 地市id, 格式:(1,2)
)
AS
  eInPut          EXCEPTION;       --输入查询参数异常
  ERRCODE         NUMBER;          --错误码
  ERRMSG          VARCHAR2(200);   --错误信息
  -- 定义游标,查询所有城市信息
  CURSOR C_City IS
  SELECT ID,NAME FROM city;
  v_CityId         NUMBER(4);          -- 临时保存地市ID
  v_CityName       VARCHAR2(100);      -- 临时保存地市名称
  v_tmp_CityID     VARCHAR2(100);      -- 中间变量,保存拼接的地市ID
  v_City  VARCHAR2(2000);
  v_pos1  INT;
  v_pos2  INT;
  v_time  INT;
  v_char  VARCHAR2(100);
  v_loc1  INT;
  v_loc2  INT;
BEGIN
  -- 空处理
  IF (iCity IS NULL) THEN
    RAISE eInPut;
  END IF;

  -- 选择了所有
  IF iCity = '0|所有' THEN
    OPEN C_City;
    LOOP
      FETCH C_City INTO
      v_CityId,v_CityName;
      EXIT WHEN C_City%NOTFOUND;
      v_tmp_CityID:=v_tmp_CityID||v_CityId||','; -- 拼接地市ID:1,2,
    END LOOP;
    v_tmp_CityID:=substr(v_tmp_CityID,1,length(v_tmp_CityID)-1); -- 截掉最后一个逗号
    oCityIds:='('||v_tmp_CityID||')'; -- 拼装最后结果
  -- 需要拆分
  ELSE
    -- 初始化变量
    v_City := iCity;
    v_City := '~' || v_City || '~';
    v_time := 1;
    v_pos1 := 1;
    v_pos2 := 1;

    WHILE v_pos2 <> 0  LOOP--拆分组
      v_pos1 := v_pos2;
      v_pos2 := INSTR(v_City, '~', v_time + 1, 1);

      IF v_pos2 - v_pos1 - 1 > 0 THEN
        v_char := SUBSTR(v_City, v_pos1+1, v_pos2-v_pos1-1);
        v_loc1 := INSTR(v_char,'|',1);
        v_loc2 := INSTR(v_char || '|','|',v_loc1+1);

        v_CityId:=SUBSTR(v_char,1,v_loc1 - 1);
        v_CityName:=SUBSTR(v_char,v_loc1+1,v_loc2-v_loc1 -1);
        v_tmp_CityID:=v_tmp_CityID||v_CityId||','; -- 拼接地市ID:1,2,
      END IF;
      v_time := v_pos2 + 1;
    END LOOP;
    v_tmp_CityID:=substr(v_tmp_CityID,1,length(v_tmp_CityID)-1); -- 截掉最后一个逗号
    oCityIds:='('||v_tmp_CityID||')'; -- 拼装最后结果
  END IF;

EXCEPTION
  WHEN eInPut THEN
    INSERT INTO t_ErrLog(LogDate,LogID,ExceptionObjName,ErrorCode,ErrorMsg)
                         VALUES(SYSDATE,5,'P_Utl_Split',006,'参数输入错误');
 commit;
  WHEN OTHERS THEN
    ROLLBACK;
    ERRCODE := SQLCODE;
    ERRMSG := SUBSTR(SQLERRM,1,200);
    INSERT INTO t_ErrLog(LogDate,LogID,ExceptionObjName,ErrorCode,ErrorMsg)
                         VALUES(SYSDATE,2,'P_Utl_Split',ERRCODE,ERRMSG);
    COMMIT;
END P_Utl_Split;

猜你喜欢

转载自lw671579557.iteye.com/blog/2009730