【问题标题】:function return varray error函数返回可变数组错误
【发布时间】:2012-06-10 19:48:08
【问题描述】:

我在运行这段代码时不断收到错误,代码有什么问题?

create or replace function f_vars(line varchar2,delimit varchar2 default ',')
return line_type is type line_type is varray(1000) of varchar2(3000);
sline varchar2 (3000);
line_var line_type;

pos number;
begin
sline := line;
for i in 1 .. lenght(sline)
loop

pos := instr(sline,delimit,1,1);
if pos =0 then
line_var(i):=sline;
exit;

endif;
string:=substr(sline,1,pos-1);
line_var(i):=string;
sline := substr(sline,pos+1,length(sline));

end loop;
return line_var;
end;

行/列错误


20/5 PLS-00103:在期待其中之一时遇到符号“LOOP” 以下: 如果

22/4 PLS-00103:预期时遇到符号“文件结尾” 以下之一: end not pragma final 可实例化的顺序覆盖静态 成员构造函数映射

【问题讨论】:

    标签: function plsql varray


    【解决方案1】:

    Stack Overflow isn't really a de-bugging service

    但是,我感觉很慷慨。

    你拼错了length;更正此问题应该可以解决您的第一个错误。你的第二个是由endif;引起的,没有空格,这意味着if语句没有终止符。

    不会纠正您的所有错误。例如,您正在为未定义(且不必要的)变量string 赋值。


    不过我还有话要说……

    我不能过分强调代码风格和空白的重要性。您的代码相当不可读。虽然现在这对你来说可能无关紧要,但对于其他人在 6 个月后使用代码来说却很重要。 在 6 个月内尝试弄清楚你写的东西时,这可能对你很重要。

    其次,我不能过分强调 cmets 的重要性。出于完全与空白相同的原因,cmets 是理解事物如何工作的非常重要的部分。

    第三,在结束函数时始终明确命名函数。它使包中的事情变得更加清晰,因此拥有它是一个好习惯,并且在功能上它将有助于匹配导致您的第二个错误的end 问题。

    最后,如果你想返回用户定义类型line_type,你需要在你的函数之外声明这个_outside。类似于以下内容:

    create or replace object t_line_type as object ( a varchar2(3000));
    create or replace type line_type as varray(1000) of t_line_type;
    

    在您的函数中添加空格可能如下所示。这是我的编码风格,我绝对不是建议你应该盲目地遵循它,但它有助于实现一些标准化。

    create or replace function f_vars ( PLine in varchar2
                                      , PDelimiter in varchar2 default ','
                                        ) return line_type is 
    
       /* This function takes in a line and a delimiter, splits
          it on the delimiter and returns it in a varray.
          */
    
       -- local variables are l_
       l_line varchar2 (3000) := PLine;
       l_pos number;
    
       -- user defined types are t_
       -- This is a varray.
       t_line line_type;
    
    begin
    
       for i in 1 .. length(l_line) loop
    
          -- Get the position of the first delimiter.
          l_pos := instr(l_line, PDelimiter, 1, 1);
    
          -- Exit when we have run out of delimiters.
          if l_pos = 0 then
             t_line_var(i) := l_line;
             exit;
          end if;
    
          -- Fill in the varray and take the part of a string
          -- between our previous delimiter and the next.  
          t_line_var(i) := substr(l_line, 1, l_pos - 1);
          l_line := substr(l_line, l_pos + 1, length(l_line));
    
       end loop;
    
       return t_line;
    
    end f_vars;
    /
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-08
      • 1970-01-01
      • 2015-05-27
      • 2022-11-11
      • 2013-10-30
      • 1970-01-01
      • 1970-01-01
      • 2021-04-04
      相关资源
      最近更新 更多