请教一个拼路径的存储过程,谢谢各位了.

张仁阳 2009-10-24 06:51:20
请教一个存储过程
表结构
create table sm_funcregister
(
fun_node varchar(50),--功能节点号
fun_name varchar(50) --功能节点名称
)
fun_node的编辑规则是 xxyyzz
也就是2位为一级
以下为例子
insert into sm_funcregister(fun_code,fun_name) values ('20','财务会计');
insert into sm_funcregister(fun_code,fun_name) values ('2014','存货核算');
insert into sm_funcregister(fun_code,fun_name) values ('201410','基础设置');

我输入参数是一个 201410
输出的值为
财务会计-存货核算-基础设置
也就是按功能节点名称组合成的一个字符串
...全文
75 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
shiyiwan 2009-10-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hongqishi 的回复:]

[/Quote]

不客气
shiyiwan 2009-10-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wh62592855 的回复:]

[/Quote]

周末家里机器没装Oracle,没测试哦。不过因为取的是fun_name,所以需要这样写的
张仁阳 2009-10-25
  • 打赏
  • 举报
回复
非常感谢
wh62592855 2009-10-25
  • 打赏
  • 举报
回复
shiyiwan测试过了吗?好像有点不对哦

while循环里的这段代码
select fun_name into v_t from sm_funcregister where fun_node = substr(v_input,1,v_i);
if v_i = 2 then
v_r := v_t;
else
v_r := v_r||'-'||v_t; /*这里岂不是重复了,比如说有个数据是2014,第一次循环的话v_r和v_t都为20,第二次循环的时候v_i变为4,那么在substr函数中就会提取出2014给v_t,那么这个时候v_r就会被赋值为20||2014=202014*/
end if;
v_i := v_i + 2;

当然 我也没测试过 说说而已
shiyiwan 2009-10-25
  • 打赏
  • 举报
回复
create or replace procedure proc(v_input in varchar2)
is
v_i number := 2;
v_t varchar2(200);
v_r varchar2(2000);
begin
if length(v_input) < 2 then
v_r := ' ';
dbms_output.put_line('invalid input value');
else
while v_i <= length(v_input) loop
select fun_name into v_t from sm_funcregister where fun_node = substr(v_input,1,v_i);
if v_i = 2 then
v_r := v_t;
else
v_r := v_r||'-'||v_t;
end if;
v_i := v_i + 2;
end loop;
end if;
dbms_output.put_line(v_r);
exception
when no_data_found then
v_r := ' ';
dbms_output.put_line('no record found');
when others then
raise;
end proc;
张仁阳 2009-10-24
  • 打赏
  • 举报
回复
是严格的.
能不能改成一个参数.把结果用dbms_output打出来
shiyiwan 2009-10-24
  • 打赏
  • 举报
回复
fun_code是严格的2个2个递增吗?

create or replace procedure proc(v_input in varchar2,v_r out varchar2)
is
v_i number := 2;
v_t varchar2(200);
begin
if length(v_input) < 2 then
v_r := ' ';
dbms_output.put_line('invalid input value');
else
while v_i <= length(v_input) loop
select fun_name into v_t from sm_funcregister where fun_node = substr(v_input,1,v_i);
if v_i = 2 then
v_r := v_t;
else
v_r := v_r||'-'||v_t;
end if;
v_i := v_i + 2;
end loop;
end if;
exception
when no_data_found then
v_r := ' ';
dbms_output.put_line('no record found');
when others then
raise;
end proc;

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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