【问题标题】:variable declaration inside a function oracle函数oracle中的变量声明
【发布时间】: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


【解决方案1】:
create or replace function get_manager_names_str (p_list in varchar2 default '793245567,65177897654') return varchar2 
is
  mgr_name varchar2(32767);
  mgr_id manager.manager_id%TYPE;
begin 
  for r_split_values in (select column_value from table (split_manager_list(p_list))) loop
    mgr_id := r_split_values.column_value;
    dbms_output.put_line('splitvalue :' || r_split_values.column_value);
    for r_manager_names in (select * from manager where manager_id = mgr_id) 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; 
  • 使用隐式游标

  • 已删除声明

  • 将 := 替换为 DEFAULT

  • 重新格式化(更容易阅读和发现错误)

我发现的唯一问题是 DECLARE + DEFAULT

【讨论】:

  • 感谢您的回复,我通过删除声明尝试了该路线,并添加了隐式游标。但它给出“无效的 SQL 语句”错误。
  • @MustangManiac 那么你的函数 split_manager_list 不会返回参考光标。显示这个函数
  • 嗨@multisync 我编辑了代码并添加了拆分功能代码
  • @MustangManiac "split_manager_list" 没问题。我的答案中的功能在我的环境中运行良好(我创建了一个带有所需字段的表管理器)
  • 嗯,这很奇怪。你得到逗号分隔的字符串吗?在 DBMsOUTPUT 上?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-12
  • 2021-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多