【发布时间】:2015-03-14 02:22:55
【问题描述】:
我创建了一个函数:
create or replace function get_columns
(v_table_name IN varchar2)
RETURN VARCHAR2
AS
v_columns_list VARCHAR2(2048);
BEGIN
SELECT listagg(column_name,',') WITHIN GROUP (ORDER BY column_name) AS t_list into v_columns_list
FROM ALL_TAB_COLUMNS WHERE owner='MyOwner' AND table_name=v_table_name;
RETURN v_columns_list;
END;
当我测试这个函数时,它什么也不返回输出:
declare
v_columns_list varchar2(2048);
v_table_name varchar2(100) := 'MyTable';
begin
-- SELECT listagg(column_name,',') WITHIN GROUP (ORDER BY column_name) AS t_list INTO v_columns_list
-- FROM ALL_TAB_COLUMNS WHERE owner='MyOwner' AND table_name=v_table_name;
v_columns_list := get_columns(v_table_name);
dbms_output.put_line(v_columns_list);
end;
结果:
anonymous block completed
但是,当我测试相同的“SELECT INTO”语句时,它可以正常工作并返回串联字符串:
declare
v_columns_list varchar2(2048);
v_table_name varchar2(100) := 'MyTable';
begin
SELECT listagg(column_name,',') WITHIN GROUP (ORDER BY column_name) AS t_list INTO v_columns_list
FROM ALL_TAB_COLUMNS WHERE owner='MyOwner' AND table_name=v_table_name;
-- v_columns_list := get_columns(v_table_name);
dbms_output.put_line(v_columns_list);
end;
为什么会这样?
【问题讨论】:
-
为什么在得到结果后递归调用相同的函数?
-
对我来说很好。您确定 dbms_output 已启用?
-
你有
owner = 'MyOwner'和v_table_name varchar2(100) := 'MyTable';。我认为这些是您给出的示例名称;在你的真实情况下,它们是大写的吗?如果不是,请尝试将它们设为大写。 -
@Boneist 是的,这些是示例名称,真实姓名是大写的。
-
@OldProgrammer 是的,我确信 dbms_output 已启用,因为当我使用显式 SELECT INTO 运行匿名块时,它会导致连接列名,但是当函数被分配给 dbms_output.put_line 参数变量时,它没有结果 - 输出没有任何结果。