运行此代码时出现错误,代码有什么问题?
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;
LINE / COL ERROR
20/5 PLS-00103:当期待其中一个时遇到符号“LOOP” 下列: 如果
22/4 PLS-00103:在期待时遇到符号“文件结束” 以下之一: 结束不是pragma最终可实例化的命令覆盖静态 成员构造函数映射
答案 0 :(得分:2)
Stack Overflow isn't really a de-bugging service。
然而,我感觉很慷慨。
您拼写错误length
;纠正这个应该修复你的第一个错误。你的第二个是由endif;
引起的,没有空格,这意味着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;
/