如下是oracle函数将查询的单个结果返回,不知道为什么结果没有数据?

CREATE OR REPLACE FUNCTION decodedim(str IN VARCHAR2, table_id IN NUMBER)
RETURN VARCHAR2
IS
RET VARCHAR2(300);
BEGIN
FOR 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 (
SELECT
trim(substr(',' || str || ',', instr(',' || str || ',', ',', 1, LEVEL)+1,
instr(',' || str || ',', ',', 1, LEVEL + 1)-instr(',' || str || ',', ',', 1, LEVEL)-1))
FROM dual
CONNECT BY LEVEL <= (length(',' || str || ',')-length(replace(',' || str || ',', ',', '')))/1-1
)
)
)
LOOP
DBMS_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;
不知道为什么结果没有数据,求大神帮忙看看?

慕哥9229398
浏览 203回答 3
3回答

慕村9548890

你这个结构有问题,你这个循环不管几次,总是会在第一次就跳出去。return 应该是在loop结束之后。去看看上面的查询能不能返回结果。自己写的程序尽量有异常控制。方便调试。你这种简单的程序,调试一下就能看到问题在哪里了。

拉丁的传说

代码太长了,又没有注释,没法看啊。请问您是在什么工具中执行的,如果是sqlplus,那么要先执行"set serveroutput on",如果是sql developer之类的图形化工具,一般不用额外作设置。其次,可以在每一步操作之后加上这一步的结果输出语句,例如dbms_output.put_line(结果),方便查看和调试。希望对您有帮助啦。

冉冉说

你for循环中的语句能执行么?我觉得如果直接执行语句没有问题,可以不用设置变量ret直接取循环的内容就好了。select wm_concat(flag_name) INTO RET ——》select wm_concat(flag_name) as tmpDBMS_OUTPUT.put_line(RET); -----> DBMS_OUTPUT.put_line(code_name.tmp);RETURN RET; ----->RETURN code_name.tmp;
打开App,查看更多内容
随时随地看视频慕课网APP