oracle写一个函数,参数是一个ID串,返回名称串
如题,我的目的是:在oracle查列表时,我数据库中又一个字段存的是一个ID串,类似‘id1,id2,id3’,中间逗号隔开的,所以要写一个函数把ID串转成名称串,类似‘...
如题,我的目的是:在oracle查列表时,我数据库中又一个字段存的是一个ID串,类似‘id1,id2,id3’,中间逗号隔开的,所以要写一个函数把ID串转成名称串,类似‘name1,name2,name3’.
我的想法是在函数中用ID串参数,一个select XX from xx where ID in(ID串参数); 然后再循环拼成名称串。
现在问题是:我无论是直接用参数还是转换 把‘id1,id2,id3’ 转成 ‘id1’,'id2','id3'这种形式,select都查不出东西,但是把参数写死就查得出来,我知道是拼的形式不对,单引号的问题,但怎么改都不对。
注意:我是直接在oracle中写函数,不经过java程序。
求助,你运行成功后再告诉我
或者你有更好的方法也可,另一种方法估计就是把ID串拆成一个一个,然后循环查,不过我还没做出来。
急等好心人。多谢!附图一张: 展开
我的想法是在函数中用ID串参数,一个select XX from xx where ID in(ID串参数); 然后再循环拼成名称串。
现在问题是:我无论是直接用参数还是转换 把‘id1,id2,id3’ 转成 ‘id1’,'id2','id3'这种形式,select都查不出东西,但是把参数写死就查得出来,我知道是拼的形式不对,单引号的问题,但怎么改都不对。
注意:我是直接在oracle中写函数,不经过java程序。
求助,你运行成功后再告诉我
或者你有更好的方法也可,另一种方法估计就是把ID串拆成一个一个,然后循环查,不过我还没做出来。
急等好心人。多谢!附图一张: 展开
推荐于2016-01-27
展开全部
CREATE TABLE Test (
id nvarchar2(6),
name nvarchar2(10)
);
INSERT INTO Test values( 'id1', 'name1');
INSERT INTO Test values( 'id2', 'name2');
INSERT INTO Test values( 'id3', 'name3');
INSERT INTO Test values( 'id4', 'name4');
INSERT INTO Test values( 'id5', 'name5');
CREATE OR REPLACE FUNCTION Get_Test_Name( p_id_data in NVARCHAR2) RETURN NVARCHAR2 AS
TYPE refcursor IS REF CURSOR;
v_cursor REFCURSOR;
v_name NVARCHAR2(10);
v_result NVARCHAR2(1000);
v_id_dada NVARCHAR2(1000);
v_SQL VARCHAR2(1000);
BEGIN
v_id_dada := REPLACE(p_id_data, ',', ''',''');
v_id_dada := '''' || v_id_dada || '''';
v_result := '';
v_SQL := 'SELECT name FROM Test WHERE ID IN (' || v_id_dada || ')';
-- 打开游标.
OPEN v_cursor FOR v_SQL;
LOOP
-- 填充数据.
FETCH v_cursor INTO v_name;
-- 无数据时 退出循环.
EXIT WHEN v_cursor%NOTFOUND;
v_result := v_result || v_name|| ',';
END LOOP;
-- 关闭游标.
CLOSE v_cursor;
v_result := TRIM(BOTH ',' FROM v_result);
RETURN v_result;
END;
/
COLUMN "A" FORMAT A10
COLUMN "B" FORMAT A15
COLUMN "C" FORMAT A20
COLUMN "D" FORMAT A25
SQL> SELECT
2 Get_Test_Name('id1') A,
3 Get_Test_Name('id1,id2') B,
4 Get_Test_Name('id1,id2,id3') C,
5 Get_Test_Name('id1,id2,id3,id4') D
6 FROM dual;
A B C D
---------- --------------- -------------------- -------------------------
name1 name1,name2 name1,name2,name3 name1,name2,name3,name4
追问
给我讲讲道理? 我那个哪里有问题……求教~~!!
追答
因为你那里的游标的 sql 语句, 无法执行。
你需要用 动态 SQL 的方式, 来执行那一段 sql 语句。
否则, 查询的时候, 认为是 in ( 一个字符串 ), 而这个字符串, 又是表里面没有的, 那么就返回空白了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询