oracle function 数组问题

xiaozhute 2012-01-12 07:10:40
一张表 t_codename 有2个字段 name 、id
传入一个字符串 "1,2,3,4,5,6,7,8"(是这张表的id,现在是一个字符串), 如何写function 方法 让这个字符串中的 id 对应输出这张表中的 name; 返回"name,name,name,name,name,name,name,name"
create or replace function idToname(thisid varchar2) return varchar2 is thisname varchar2(200);
begin
select t.name into thisname from t_codename t where id = '1';
return thisname;
end idToname;
我只会写这样基础的 求教
...全文
347 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
888888888888 2012-01-17
  • 打赏
  • 举报
回复
少年,人家需求很清楚 “如何写function 方法”
perfectdv 2012-01-17
  • 打赏
  • 举报
回复
为什么不用concat函数啊?
888888888888 2012-01-17
  • 打赏
  • 举报
回复
膜拜 LuiseRADL !
hupeng213 2012-01-13
  • 打赏
  • 举报
回复
--返回从第一行开始 它所有的后续记录 (-->)字符你可以换成你需要的逗号(,)
select 'test1-->' || replace(wm_concat(distinct formerval), ',', '-->') as allPath
from (
--返回记录中上行行中,同一列对应的值,改造成简单的父子关系表
select h.fId,
h.fName as formerval,
lag(h.fName) over(order by h.fId) as lastval
from (
--伪造一个ID,Name 的六行记录 不想创建表了 末有办法 :)
select rownum as fId, 'test' || rownum as fName
from dual
connect by rownum < 7) h
)
start with lastval = 'test1'
connect by lastval = prior formerval
我心飞翔 2012-01-12
  • 打赏
  • 举报
回复 1
实测数据:

CREATE TABLE T97
(
ID NUMBER(4),
MyName VARCHAR2(20)
);
INSERT INTO T97 VALUES(1, 'A');
INSERT INTO T97 VALUES(2, 'B');
INSERT INTO T97 VALUES(3, 'C');
INSERT INTO T97 VALUES(4, 'D');
INSERT INTO T97 VALUES(5, 'E');
INSERT INTO T97 VALUES(6, 'F');


建立的函数:

CREATE OR REPLACE FUNCTION FunctionT97(strIDS VARCHAR2)
RETURN VARCHAR2
IS
-- 定义字符串数组类型
TYPE Varchar2Array IS TABLE OF VARCHAR2(20) INDEX BY BINARY_INTEGER;
TmpeStr VARCHAR2(32);
Str VARCHAR2(4000);
j INTEGER;
-- 定义数组
Arr Varchar2Array;
-- 保存返回的最终结果
strResult VARCHAR2(200) := '';
vName VARCHAR2(20);

BEGIN
-- 将传递进来的用,分隔的字符串转换为数组
Str := strIDS;
j := 0;
IF Instr(strIDS, ',', 1, 1) = 0 THEN
Arr(j) := strIDS;
j := j + 1;
else
While Instr(str, ',', 1, 1) > 0 Loop
TmpeStr := Substr(str, 1, Instr(str, ',', 1, 1) - 1);
Arr(j) := TmpeStr;
str := SubStr(Str, Instr(str, ',', 1, 1) + 1, length(str));
j := j + 1;
end loop;
if not str is null then
--将最后一个保存
Arr(j) := str;
j := j + 1;
end if;
end if;

FOR k IN 0..Arr.count - 1 LOOP
SELECT MyName INTO vName FROM T97 WHERE ID = Arr(k);
strResult := strResult || vName || ', ';
END LOOP;
-- 处理掉最后一个,号
strResult := substr(strResult, 1, length(strResult) - 2);
RETURN strResult;
END FunctionT97;


实测结果:

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧