在Oracle中,如果一个包含分隔符的字符串(比如说“55*62*77”,这个字符串是用*号做分隔符,可以拆分成三个数“55”,“62”和“77”),要将它们拆分出来比较麻烦,下面这个存储过程就是为了方便对字符串的分拆而写的。 CREATE OR REPLACE FUNCTION GetParamStr( --字符串分拆函数 i_SrcStr VARCHAR2, -- 包含参数的字符串 i_Sign VARCHAR2, -- 参数分隔符号,如'~','?' i_ParamIndex NUMBER, -- 欲分离的参数序号 o_ParamStr OUT VARCHAR2 -- 分离出来的参数内容 ) RETURN NUMBER -- RETURN: -- 0.成功 -- 1. i_ParamIndex越界 -- 2. i_SrcStr为空 -- 3. 无法定位参数序号 -- ELSE. ORACLE ERROR CODE AS v_Len PLS_INTEGER; v_StartIndex PLS_INTEGER; v_EndIndex PLS_INTEGER;
Err_SrcStr_IsNull EXCEPTION; Err_ParamIndex_OverFlow EXCEPTION; Err_StartIndex_NotFound EXCEPTION; BEGIN IF i_SrcStr IS NULL THEN RAISE Err_SrcStr_IsNull; END IF;
IF i_ParamIndex <= 0 THEN RAISE Err_ParamIndex_OverFlow; END IF;
-- 初始化输出参数 o_ParamStr := '';
-- 取得参数内容的起始下标 IF i_ParamIndex = 1 THEN v_StartIndex := 0; ELSE v_StartIndex := INSTRB(i_SrcStr, i_Sign, 1, i_ParamIndex - 1); IF v_StartIndex = 0 THEN RAISE Err_StartIndex_NotFound; END IF; END IF;
-- 取得参数内容的结束下标 v_EndIndex := INSTRB(i_SrcStr, i_Sign, 1, i_ParamIndex); IF v_EndIndex = 0 THEN v_EndIndex := LENGTHB(i_SrcStr) + 1; END IF;
o_ParamStr := SUBSTRB(i_SrcStr, v_StartIndex + 1, v_EndIndex - v_StartIndex - 1);
-- 成功退出 RETURN 0;
EXCEPTION WHEN Err_ParamIndex_OverFlow THEN DBMS_OUTPUT.PUT_LINE('执行失败:i_ParamIndex越界'); RETURN 1; WHEN Err_SrcStr_IsNull THEN DBMS_OUTPUT.PUT_LINE('执行失败:i_SrcStr为空'); RETURN 2; WHEN Err_StartIndex_NotFound THEN DBMS_OUTPUT.PUT_LINE('执行失败:无法定位参数序号'); RETURN 3; WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(TO_CHAR(SQLCODE)||' '||SUBSTRB(SQLERRM,1,200)); RETURN SQLCODE; END GetParamStr; /
这个是使用比较方便,如下: CREATE OR REPLACE PROCEDURE P_Agt_AddPlan ( o_Ret OUT Number ) IS v_Count number (3);--这个是用来计数的 v_Item VARCHAR2(200);--这个用来保存分拆后的那个字符串 BEGIN v_Count := 1; --循环分拆字符串55#66#77,将分拆出来的值放入v_Item,如果循环结束,就返回非0数,所以就跳出循环了 WHILE getparamstr('55#66#77','#',v_Count,v_Item) = 0 LOOP dbms_output.put_line(v_Item); v_Count := v_Count + 1; END LOOP; COMMIT; o_Ret := 0; EXCEPTION WHEN OTHERS THEN ROLLBACK ; o_Ret := 1 ; END P_AGT_ADDPLAN; /