function coltostr(p_tabname varchar2,p_colname VARCHAR2,p_colwhere VARCHAR2,p_where VARCHAR2) 
                return VARCHAR2 
      is 
            v_result  VARCHAR2(8000):=''; 
            v_strwhere VARCHAR(6000); 
      BEGIN 
      v_strwhere:= 'SELECT '||p_colname||' FROM '||p_tabname||' WHERE '||p_colwhere||' =''' ||p_where||''' '; 
      ---v_strwhere:= 'SELECT '||p_colname||' FROM '||p_tabname; 
      IF(p_colwhere='1') THEN 
          v_strwhere:= 'SELECT '||p_colname||' FROM '||p_tabname; 
      END IF;       EXECUTE IMMEDIATE ' 
        DECLARE v_pcol VARCHAR2(8000):=''''; 
        BEGIN 
          FOR i IN ('||v_strwhere||') LOOP 
              v_pcol:= v_pcol || i.'||p_colname||'  || '',''; 
          END LOOP; 
          select v_pcol into :1 from dual; 
        END; 
      ' USING OUT v_result; 
      RETURN substr(v_result,1,length(v_result)-1); 
      END; 
请教一下'SELECT '||p_colname||' FROM '||p_tabname||' WHERE '||p_colwhere||' =''' ||p_where||''' '; 开头的第一个单引号是和语句末尾最后一个单引号的对应还是和紧接着select后面的那个单引号对应,而'SELECT '||p_colname||' FROM '||p_tabname; 这句末尾为什么没单引号?
还有这里的||是起连接作用还是其他用途,还有就是select v_pcol into :1 from dual;这句话什么意思,请指教。

解决方案 »

  1.   

    总的说,常量需要单引号,变量不需要。1、与select后面的单引号对应 
    2、而'SELECT '||p_colname||' FROM '||p_tabname;  短句为:
        'select '     ||pcolname|| ' from '    || ptabname;
        这样更好看。 p_tabname是变量,所以不需要单引号,前面都已经成对出现了,他后面加,加给谁呢?    
    3、||是连接符
    4、相当于动态执行了一条语句。
      

  2.   

    'SELECT '||p_colname||' FROM '||p_tabname||' WHERE '||p_colwhere||' =''' ||p_where||''' '; 
    这句话能够正常执行吗?
      

  3.   

    不好意思,看错了,是可以的。' =''' ||p_where||''' '这里面的''' ||p_where||'''相当于 ‘p_where’变量
    就好比select * from tab_name where col_name = '123',总得来说基本同意1楼的说法。