一张表 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;
我只会写这样基础的 求教
传入一个字符串 "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;
我只会写这样基础的 求教
(
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;
实测结果:
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