我的存储过程里面这句话总是执行得不到预期的结果。
变量都已经定义过,编译通过。
就是执行到这里的时候出错得不到结果
v_USERCODE := v_USERCODE||','||v_TEMP;
我就是想把v_USERCODE累加一下,用','分隔。
请问应该怎么写。一定要用CONCAT吗? '||'的作用和CONCAT有多大区别呢?还有另外一个问题。
我初始定义一个变量 v_TEMP varchar2(5) :='';
这样定义他为'',但是在后面的判断
IF v_TEMP<>'' THEN
  ……
END IF;
这个总是会执行到IF里边去。不知道怎么回事,我并没有对其进行赋值操作。先谢过了!

解决方案 »

  1.   

    v_TEMP varchar2(5) :=' ';
    这样定义他为'',但是在后面的判断
    IF v_TEMP<>' ' THEN
    改为:
    v_TEMP varchar2(5) :=' ';-----赋一个空格好一点
    IF v_TEMP<>' ' THENv_USERCODE := v_USERCODE||','||v_TEMP;
    这个没错啊,lz所说的错误是什么?请贴出错误提示,另外代码也要贴出来,否则不能判断问题所在
      

  2.   

    错误贴出来,看看哪里报错了。v_TEMP varchar2(5) :='';oracle会认为是赋给了值:null
      

  3.   

    Error -6502: ORA-06502: PL/SQL: 数字或值错误 
    ORA-06512: 在"HJ.PRO_HGGZTJ", line 137
    ORA-01403: 未找到数据
    ORA-06502: PL/SQL: 数字或值错误 
    ORA-06512: 在"HJ.PRO_HGGZTJ", line 137
    ORA-01403: 未找到数据
    ORA-06512: 在line 8
      

  4.   

    错误提示如上,同时请教一下各位写存储过程都是怎么调试的?
    我用的很老土的方法,建了一个test专用调试的表,在里边写一些insert语句判断执行到哪里了。
      

  5.   

    用length( v_TEMP)>0 判断v_USERCODE := v_USERCODE||','||v_TEMP; 
    之前先对 v_USERCODE 初始化
    v_USERCODE:='';
    用pl/sql developer 可以调试!
      

  6.   

    1. ||和concat是一样的。
      

  7.   

    Oracle的CONCAT()只允许两个参数;换言之,一次只能将两个字串串连起来。不过,在Oracle中,我们可以用'||'来一次串连多个字串。
      

  8.   

    回ptpa,我试了一下你的方法,好象还是不行~~~~
      

  9.   

    procedure pro_test as    n number(1) :=0;
        v_TEMP varchar2(20) :='';
        v_TEMP1 varchar2(20) :='';
        v_USERCODE HJ.TSYS_USERINROLE.USERCODE%TYPE :='';
        v_USERNAME SHRII.COMMON_EMPINFO.EMPLOYEE%TYPE :='';
        CURSOR ROLE_CURSOR IS
        SELECT USERCODE,EMPLOYEE FROM HJ.TSYS_USERINROLE A,SHRII.COMMON_EMPINFO B WHERE A.USERCODE=B.EMPLOYCODE AND A.ROLECODE='HJ0210';
        BEGIN
            insert into test values ('-1','no gg');
            commit;
            FOR ROLE_RECORD IN ROLE_CURSOR LOOP
                n := n+1;
                v_TEMP := v_USERCODE;
                v_TEMP1 := ROLE_RECORD.USERCODE;
                insert into test values(n,v_TEMP);
                insert into test values(n,v_USERCODE);
                insert into test values(n,concat(v_temp,','));
                insert into test values(n,concat(concat(v_temp,','),v_temp1));
                commit;
                v_USERCODE := concat(concat(v_temp,','),v_temp1);
                insert into test values(2,2);
                commit;
                insert into test values(0,v_USERCODE);
                commit;
                v_USERNAME := v_USERNAME||','||ROLE_RECORD.EMPLOYEE;        
            END LOOP;
            IF v_USERCODE<>'' THEN
                v_USERCODE := SUBSTR(v_USERCODE,2);
            END IF;
            IF v_USERNAME<>'' THEN
                v_USERNAME := SUBSTR(v_USERNAME,2);
            END IF;
            INSERT INTO HJ.TSYS_MESSAGE(PKID,TOPIC,SENDER,SENDERNAME,SENDDATE,RECEIVER,RECEIVERNAME) VALUES (HJ.HJID.nextval,'','ADMIN','超级管理员',SYSDATE,v_USERCODE,v_USERNAME);
        END;这是我测试的一个存储过程。就是这里的问题v_USERCODE := concat(concat(v_temp,','),v_temp1); 这句话。是变量的使用范围的问题?
    请各位指教一下pl/sql里变量范围以及范围内值的作用域~!
    谢谢!