CREATE OR REPLACE FUNCTION decodedim(str IN VARCHAR2, table_id IN NUMBER)RETURN VARCHAR2ISRET VARCHAR2(300);BEGINFOR code_name IN (select wm_concat(flag_name) INTO RET from(select flag_name from PU_META_PLAT.MD_META_DIM_CODE where dim_table_id = table_id and flag_code in (SELECTtrim(substr(',' || str || ',', instr(',' || str || ',', ',', 1, LEVEL)+1,instr(',' || str || ',', ',', 1, LEVEL + 1)-instr(',' || str || ',', ',', 1, LEVEL)-1))FROM dualCONNECT BY LEVEL <= (length(',' || str || ',')-length(replace(',' || str || ',', ',', '')))/1-1)))LOOPDBMS_OUTPUT.put_line(RET);RETURN RET;END LOOP;END;上面是函数建立的代码,下面是执行函数:select decodedim('1,2,3,4,5,6,7,8,25,26,27,28,29,32,33,34,35', 5376) from dual;不知道为什么结果没有数据,求大神帮忙看看?
3 回答
慕村9548890
TA贡献1884条经验 获得超4个赞
你这个结构有问题,你这个循环不管几次,总是会在第一次就跳出去。return 应该是在loop结束之后。
去看看上面的查询能不能返回结果。
自己写的程序尽量有异常控制。方便调试。你这种简单的程序,调试一下就能看到问题在哪里了。
拉丁的传说
TA贡献1789条经验 获得超8个赞
代码太长了,又没有注释,没法看啊。
请问您是在什么工具中执行的,如果是sqlplus,那么要先执行"set serveroutput on",如果是sql developer之类的图形化工具,一般不用额外作设置。
其次,可以在每一步操作之后加上这一步的结果输出语句,例如dbms_output.put_line(结果),方便查看和调试。
希望对您有帮助啦。
冉冉说
TA贡献1877条经验 获得超1个赞
你for循环中的语句能执行么?
我觉得如果直接执行语句没有问题,可以不用设置变量ret
直接取循环的内容就好了。
select wm_concat(flag_name) INTO RET ——》select wm_concat(flag_name) as tmp
DBMS_OUTPUT.put_line(RET); -----> DBMS_OUTPUT.put_line(code_name.tmp);
RETURN RET; ----->RETURN code_name.tmp;
- 3 回答
- 0 关注
- 202 浏览
添加回答
举报
0/150
提交
取消