数组在Oracle里面使用不怎么方便,一般情况下很少使用,给你提个新方法实现你的功能。
设定数据库结构:
CREATE TABLE GOODS( PM VARCHAR2(20 BYTE),--品名 FL VARCHAR2(20 BYTE),--分类 RQ DATE, --日期 BZ VARCHAR2(50 BYTE) --备注);存储过程如下:
CREATE OR REPLACE procedure PROC_split(In_String IN VARCHAR2) isv_split1 VARCHAR2(10) DEFAULT ',';v_split2 VARCHAR2(10) DEFAULT '_';len NUMBER DEFAULT 0;nStr VARCHAR2(200);nStr1 VARCHAR2(40);nStr2 VARCHAR2(20);nStr3 VARCHAR2(20);place NUMBER(10) default 1;begin--输入串格式--'辣椒_食品,西红柿_食品,板鞋_服饰,植物油_食品,领带_食品,' len := length(In_String); IF len < 1 THEN RETURN; END IF ; nStr := In_String; place := INSTR(nStr,v_split1,1,1); WHILE (place > 0 ) LOOP nStr1 := SUBSTR(nStr,1,place-1); nStr := SUBSTR(nStr,place + 1); place := INSTR(nStr1,v_split2,1,1); IF (place > 0 ) THEN nStr2 := SUBSTR(nStr1,1,place-1); nStr3 := SUBSTR(nStr1,place + 1); UPDATE goods SET rq = SYSDATE WHERE pm=nStr2 AND fl=nStr3; //dbms_output.put_line('nStr2=['||nStr2||'],nStr3=['||nStr3||']'); END IF; place := INSTR(nStr,v_split1,1,1); END LOOP; COMMIT;end PROC_split;/测试语句:
DECLARE IN_STRING VARCHAR2(32767);BEGIN IN_STRING := '辣椒_食品,西红柿_食品,板鞋_服饰,植物油_食品,领带_食品,'; PROC_SPLIT ( IN_STRING ); COMMIT; END;我的调试输出是:
nStr2=[辣椒],nStr3=[食品]nStr2=[西红柿],nStr3=[食品]nStr2=[板鞋],nStr3=[服饰]nStr2=[植物油],nStr3=[食品]nStr2=[领带],nStr3=[食品]这里面只用了两个函数:INSTR,SUBSTR.
取消
评论