在return(okvalue2)前加一句,看看是什么
dbms_output.put_line('okvalue2:'||okvalue2);

解决方案 »

  1.   

    什么都没输出,
    dbms_output 是要先运行 sql>SET SERVEROUTPUT ON; 
    的对吗,我也运行了。
    不过输出每看到东西啊
      

  2.   

    那里加,我运行完select语句之后再加,提示系:提交完成,每其他信息。
    另外如果我将WHILE m<tmplength LOOP 这个地方改为 WHILE m<3 LOOP  就可以正常运行。好像只要
    一进入第二次循环就出问题。!
      

  3.   

    我建议你在循环中dbms_output.put_line('okvalue2:'||okvalue2),这种情况下你先不要添加太多记录,便于我们查找问题!
      

  4.   

    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;
    试试这个
      

  5.   

    SELECT TEST2('VENDORS.VND_TYPE','<MNF/><TDR/>') FROM DUAL; 这个sql语句可以
    参数错,TDR错,表里是TRD
      

  6.   

    多谢晒,原来是参数错误。
    sql_str :=  'SELECT COLD_VALUE FROM XUTEST WHERE (COLD_TABCOL = :v1) AND (COLD_COLD = :v2) ';
    这个sql 如果第一次循环拿不到数据的时候就EXCEPTION了,就算我第二个'<TDR/>'是可以拿到数据的。我可不可以做到如果当前这个sql拿不到数据,我就跳出当前循环再继续第二次循环,拿到第二个数据呢?
      

  7.   

    可以,加多一个判断语句
    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;