CREATE OR REPLACE FUNCTION TEST2 ( TESTVALUE IN VARCHAR2, Beconvertvalue IN VARCHAR2 ) RETURN VARCHAR2 IS tmpvalue VARCHAR2(50); tmpvalue2 VARCHAR2(50); okvalue VARCHAR2(100) ; okvalue2 VARCHAR2(100) ; tmplength number(2); n number(2):=1; m number(2):=1; sql_str VARCHAR2(100) ; BEGIN sql_str := 'SELECT COLD_VALUE FROM XUTEST WHERE (COLD_TABCOL = :v1) AND (COLD_COLD = :v2) '; tmplength:=LENGTH(Beconvertvalue); WHILE m<tmplength LOOP n:=INSTR(Beconvertvalue,'>',m,1); IF n>m THEN tmpvalue:=SUBSTR(Beconvertvalue,m+1,n-m-2); EXECUTE IMMEDIATE sql_str INTO tmpvalue2 USING TESTVALUE,tmpvalue; IF m=1 THEN okvalue2:=CONCAT(okvalue2, tmpvalue2); ELSE okvalue2:=CONCAT(okvalue2,', '); okvalue2:=CONCAT(okvalue2, tmpvalue2); END IF; END IF; m:=n+1; END LOOP; RETURN(okvalue2); EXCEPTION
WHEN OTHERS THEN dbms_output.put_line('Error '||TO_CHAR(SQLCODE)||': '||SQLERRM); RETURN(okvalue2); END;SELECT TEST2('VENDORS.VND_TYPE','<MNF/><TRD/>') FROM DUAL; 试试这个
SELECT TEST2('VENDORS.VND_TYPE','<MNF/><TDR/>') FROM DUAL; 这个sql语句可以 参数错,TDR错,表里是TRD
多谢晒,原来是参数错误。 sql_str := 'SELECT COLD_VALUE FROM XUTEST WHERE (COLD_TABCOL = :v1) AND (COLD_COLD = :v2) '; 这个sql 如果第一次循环拿不到数据的时候就EXCEPTION了,就算我第二个'<TDR/>'是可以拿到数据的。我可不可以做到如果当前这个sql拿不到数据,我就跳出当前循环再继续第二次循环,拿到第二个数据呢?
可以,加多一个判断语句 cou NUMBER; sql_str2 := 'SELECT count(*) FROM XUTEST WHERE (COLD_TABCOL = :v1) AND (COLD_COLD = :v2) ';相应的加多 EXECUTE IMMEDIATE sql_str INTO cou USING TESTVALUE,tmpvalue;... WHILE m<tmplength LOOP n:=INSTR(Beconvertvalue,'>',m,1); IF n>m THEN tmpvalue:=SUBSTR(Beconvertvalue,m+1,n-m-2); EXECUTE IMMEDIATE sql_str INTO cou USING TESTVALUE,tmpvalue; IF cou>0 THEN EXECUTE IMMEDIATE sql_str INTO tmpvalue2 USING ESTVALUE,tmpvalue;
IF m=1 THEN okvalue2:=CONCAT(okvalue2, tmpvalue2); ELSE okvalue2:=CONCAT(okvalue2,', '); okvalue2:=CONCAT(okvalue2, tmpvalue2); END IF; END IF; END IF; m:=n+1; END LOOP;
dbms_output 是要先运行 sql>SET SERVEROUTPUT ON;
的对吗,我也运行了。
不过输出每看到东西啊
另外如果我将WHILE m<tmplength LOOP 这个地方改为 WHILE m<3 LOOP 就可以正常运行。好像只要
一进入第二次循环就出问题。!
(
TESTVALUE IN VARCHAR2,
Beconvertvalue IN VARCHAR2
)
RETURN VARCHAR2
IS tmpvalue VARCHAR2(50);
tmpvalue2 VARCHAR2(50);
okvalue VARCHAR2(100) ;
okvalue2 VARCHAR2(100) ;
tmplength number(2);
n number(2):=1;
m number(2):=1;
sql_str VARCHAR2(100) ;
BEGIN
sql_str := 'SELECT COLD_VALUE FROM XUTEST WHERE (COLD_TABCOL = :v1) AND (COLD_COLD = :v2) ';
tmplength:=LENGTH(Beconvertvalue);
WHILE m<tmplength LOOP
n:=INSTR(Beconvertvalue,'>',m,1);
IF n>m THEN
tmpvalue:=SUBSTR(Beconvertvalue,m+1,n-m-2);
EXECUTE IMMEDIATE sql_str INTO tmpvalue2 USING TESTVALUE,tmpvalue;
IF m=1 THEN
okvalue2:=CONCAT(okvalue2, tmpvalue2);
ELSE
okvalue2:=CONCAT(okvalue2,', ');
okvalue2:=CONCAT(okvalue2, tmpvalue2);
END IF;
END IF;
m:=n+1;
END LOOP;
RETURN(okvalue2);
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('Error '||TO_CHAR(SQLCODE)||': '||SQLERRM);
RETURN(okvalue2);
END;SELECT TEST2('VENDORS.VND_TYPE','<MNF/><TRD/>') FROM DUAL;
试试这个
参数错,TDR错,表里是TRD
sql_str := 'SELECT COLD_VALUE FROM XUTEST WHERE (COLD_TABCOL = :v1) AND (COLD_COLD = :v2) ';
这个sql 如果第一次循环拿不到数据的时候就EXCEPTION了,就算我第二个'<TDR/>'是可以拿到数据的。我可不可以做到如果当前这个sql拿不到数据,我就跳出当前循环再继续第二次循环,拿到第二个数据呢?
cou NUMBER;
sql_str2 := 'SELECT count(*) FROM XUTEST WHERE (COLD_TABCOL = :v1) AND (COLD_COLD = :v2) ';相应的加多
EXECUTE IMMEDIATE sql_str INTO cou USING TESTVALUE,tmpvalue;...
WHILE m<tmplength LOOP
n:=INSTR(Beconvertvalue,'>',m,1);
IF n>m THEN
tmpvalue:=SUBSTR(Beconvertvalue,m+1,n-m-2);
EXECUTE IMMEDIATE sql_str INTO cou USING TESTVALUE,tmpvalue;
IF cou>0 THEN
EXECUTE IMMEDIATE sql_str INTO tmpvalue2 USING ESTVALUE,tmpvalue;
IF m=1 THEN
okvalue2:=CONCAT(okvalue2, tmpvalue2);
ELSE
okvalue2:=CONCAT(okvalue2,', ');
okvalue2:=CONCAT(okvalue2, tmpvalue2);
END IF;
END IF;
END IF;
m:=n+1;
END LOOP;