看到一个function,但里面有几句话不太明白,请指教一下
create or replace function str_list2( key_name in varchar2,
                    key  in varchar2,
                    coname in varchar2,
                    tname     in varchar2 )
 return varchar2
as
    type rc  is ref cursor;
    str    varchar2(4000);
    sep    varchar2(2);
    val    varchar2(4000);
    cur    rc;
begin
    open cur for 'select '||coname||' --这里||是什么意思?对变量的分隔符吗?为什么开始和结尾都有?
                    from '|| tname || '
                    where ' || key_name || ' = :x ' --这里的:x是从哪儿出来的?x应该是个变量的吧?
                using key; --这句话是什么意思
    loop
        fetch cur into val;
        exit when cur%notfound;
        str := str || sep || val; --这句是什么意思?最终str的值是什么?
        sep := ', ';
    end loop;
    close cur;
    return str;
end;

解决方案 »

  1.   

    || 是字符串连接符,这个实际是拼接一个动态 sql 语句 coname 是查询的列名,可以是 'col1, col2'
    tname 是表名, key_name 是条件字段名 :x 是一个占位符,会使用 using 后面的 key 值代替
      

  2.   

    keyname=:x using key ,就等同于keyname=key,是这个意思吗?
      

  3.   

    返回的结果是查询到字段coname,所有结果集合用逗号分开例如 查询结果集是
    字段 : coname
    结果 : A
           B返回的结果就是 A,B  是个字符串       
      

  4.   


    可以这么理解,但是在动态 SQL 中需要考虑 keyname 的类型,但是使用 :x(x可以任意命名),则不必担心类型问题了
      

  5.   

    那请问str := str || sep || val;这句话是什么意思
      

  6.   

    无论key定义的是什么类型,都可以与keyname对应起来吗?
      

  7.   


    这样给你说明吧str := 'a';
    sep := 'b';
    val := 'c';
    str := str || sep || val;str 最后的值为 abc;
      

  8.   


    不是,key 与 keyname 的类型需要一致,否则可能会报错
    我说的不考虑类型是这样的情况如果 keyname 为数值类型sqlstr := 'keyname = ' || key;字符串类型:
    sqlstr := 'keyname = ''' || key || ''';日期类型:
    sqlstr := 'keyname = ' || to_date(key,'yyyymmdd');在动态 sql 中,不同类型的变量,在拼接时有特殊处理,但是使用 :x 的方式,就可以不必考虑这些
    只要 keyname 和 key 类型一致,就可以直接使用