【发布时间】:2014-12-16 22:26:03
【问题描述】:
他们的这个功能有什么问题吗?它抛出无效的 sql 语句错误。 我是甲骨文的新手
create or replace function get_manager_names_str
(
p_list in varchar2 := '793245567,65177897654'
)return varchar2 is
mgr_name varchar2(32767);
declare -- i tried to remove the declare but still not working am i doing any thing wrong ?
mgr_id manager.manager_id%TYPE;
cursor split_values is
select column_value from table (split_manager_list(p_list)); -- for testing you can test with --- some value
cursor manager_names is
select * from manager
where manager_id= mgr_id;
begin
for r_split_values in split_values
loop
mgr_id := r_split_values.column_value;
dbms_output.put_line('splitvalue :'|| r_split_values.column_value);
for r_manager_names in manager_names
loop
mgr_name := mgr_name||r_manager_names.first_name || r_manager_names.last_name || r_manager_names.middle_name||'. ,' ;
end loop;
end loop;
dbms_output.put_line(mgr_name);
return mgr_name;
end;
show errors;
任何帮助将不胜感激。谢谢
新增:split_list函数,用于拆分逗号分隔值
Create or replace type split_tbl as table of varchar2(32767);
create or replace function split_manager_list
(
p_list varchar2 ,
p_del varchar2 := ','
) return split_tbl pipelined
is
l_idx pls_integer;
l_list varchar2(32767) := p_list;
l_value varchar2(32767);
begin
loop
l_idx := instr(l_list,p_del);
if l_idx > 0 then
pipe row( substr(l_list,1,l_idx-1));
l_list := substr(l_list,l_idx+length(p_del));
else
pipe row( l_list);
exit;
end if;
end loop;
return;
end split_manager_list;
Show errors;
【问题讨论】:
-
如果在没有参数的情况下调用函数,参数部分中的赋值是否应该是默认值?
-
不,它不是默认值。它必须作为参数传递,出于测试目的,我添加了一个值
-
我要声明mgr_id manager.manager_id%TYPE;作为局部变量,我该怎么做
-
Multisync 重写它的速度比我快一点。您只显示(如果您的客户端已打开输出)并返回一个没有分隔的值,因此很难做任何事情。您希望函数的调用者返回什么?也许是价值观的集合?一个参考光标?传入集合而不是字符串也会更好,尤其是有很多值的时候——如果需要,你的调用者可以调用你的 split 函数。
-
不确定 Toad 是否理解
show errors,但即使理解,这也是一个单独的命令并且可能导致无效语句错误?根据您的运行方式,您可能在最后的end;之后也缺少/。
标签: oracle plsql oracle11g oracle10g toad