Stack Overflow は実際にはデバッグ サービスではありません。
しかし、私は寛大な気持ちです。
つづりがlength
間違っています。これを修正すると、最初のエラーが修正されます。2 番目の原因はendif;
, no space です。これは、if
ステートメントにターミネーターがないことを意味します。
これですべてのエラーが修正されるわけではありません。たとえば、未定義の (不要な) variable に何かを代入していますstring
。
もっと言いたいことはあるんだけど…
コード スタイルと空白の重要性はいくら強調してもしすぎることはありません。あなたのコードはかなり読めません。これは今は問題にならないかもしれませんが、6 か月後にコードに取り掛かる他の誰かにとっては問題になるでしょう。あなたが書いたものを解決しようとしているとき、それはおそらく6か月後にあなたにとって重要になるでしょう.
第二に、コメントの重要性はいくら強調してもしすぎることはありません。空白とまったく同じ理由で、コメントは何かがどのように機能するかを理解する上で非常に重要な部分です。
第三に、関数を終了するときは常に明示的に名前を付けてください。パッケージ内で物事がより明確になるので、良い習慣であり、機能ではend
、2番目のエラーの原因となった問題を突き合わせるのに役立ちます。
最後に、ユーザー定義型を返したい場合は、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;
/