看到一个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;
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;
tname 是表名, key_name 是条件字段名 :x 是一个占位符,会使用 using 后面的 key 值代替
字段 : coname
结果 : A
B返回的结果就是 A,B 是个字符串
可以这么理解,但是在动态 SQL 中需要考虑 keyname 的类型,但是使用 :x(x可以任意命名),则不必担心类型问题了
这样给你说明吧str := 'a';
sep := 'b';
val := 'c';
str := str || sep || val;str 最后的值为 abc;
不是,key 与 keyname 的类型需要一致,否则可能会报错
我说的不考虑类型是这样的情况如果 keyname 为数值类型sqlstr := 'keyname = ' || key;字符串类型:
sqlstr := 'keyname = ''' || key || ''';日期类型:
sqlstr := 'keyname = ' || to_date(key,'yyyymmdd');在动态 sql 中,不同类型的变量,在拼接时有特殊处理,但是使用 :x 的方式,就可以不必考虑这些
只要 keyname 和 key 类型一致,就可以直接使用