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;
这是包里面的一个函数,请教一下动态调用在包或存贮过程中引号的使用方法 例如:v_strwhere:= 'SELECT '||p_colname||' FROM '||p_tabname||' WHERE '||p_colwhere||' =''',
引号的使用规则,请说的具体些,谢谢。

解决方案 »

  1.   

    这个就是拼SQL语句,然后用EXCUTE immediate来动态执行sql.
    || 是连接符,其余的是变量,引号''是一个',具体你可以试试
      

  2.   

    一楼的先谢了,我主要想知道引号的用法,'SELECT ',' FROM '都是单引号的,'' ||p_where||''' ' 这个为什么是双引号而且后面还跟一对' ', 不理解?
      

  3.   


    这是因为那个字段是字符型,普通的SQL里面就必须带上引号,比如:
    select * from ttt where sss='abc'
    转成变量形式你变成这样了:
    v_str='select * from ttt where sss=''abc''';就是说在单引号之间的两个单引号实际上是一个单引号。同样的,在你的例子中,在组装SQL时需要在p_where两头加上单引号,需要用两个单引号来表示。实际上你的那个v_strwhere变量中并没有双引号,都是单引号,你可以复制到其他编辑器中看看,比如ultredit看看16进制编码就知道。
      

  4.   

    能不能说一下 'SELECT '的第一个单引号适合后面的那个对应呢还是和语句末尾'' ||p_where||''' ' 的最后一个引号对应?
      

  5.   

    7楼的果然是高手,要的就是这句话,转定义,我现在就是想问开头的第一个单引号是和语句末尾最后一个单引号的对应还是和紧接着select后面的那个单引号对应,还有这里的||是起连接作用还是其他用途,还有就是select v_pcol into :1 from dual;这句话什么意思,请指教。
      

  6.   


    '' ||p_where||''这个不是双引号,是俩个单引号。俩个单引号表示普通语句中的一个单引号。