Stack Overflow 并不是真正的调试服务。
不过,我觉得很慷慨。
您拼写length
错误;更正此问题应该可以解决您的第一个错误。您的第二个是由endif;
, no space 引起的,这意味着该if
语句没有终止符。
这不会纠正您的所有错误。例如,您正在为未定义(和不必要的)变量分配一些东西string
。
不过我还有很多话要说……
我不能过分强调代码风格和空白的重要性。您的代码相当不可读。虽然现在这对你来说可能无关紧要,但对于其他人在 6 个月后使用代码来说却很重要。6 个月后,当你试图弄清楚你写的东西时,它可能对你很重要。
其次,我不能过分强调评论的重要性。出于与空白完全相同的原因,注释是理解事物如何工作的非常重要的部分。
第三,在结束函数时始终明确命名函数。它使包中的事情变得更加清晰,因此拥有它是一个好习惯,并且在功能中它将有助于匹配end
导致您的第二个错误的问题。
最后,如果你想返回用户定义的类型line_type
,你需要在你的函数之外声明这个 _out。类似于以下内容:
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;
/