-1

このコードを実行するとエラーが発生し続けます。コードの何が問題なのですか?

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エラー


20/5 PLS-00103: 次のいずれかを想定しているときに、シンボル「LOOP」が発生しました: if

22/4 PLS-00103: 次のいずれかを予期しているときに、シンボル「ファイルの終わり」が検出されました: end not pragma final instanceiable order オーバーライド静的メンバー コンストラクタ マップ

4

1 に答える 1

2

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;
/
于 2012-06-10T20:52:41.653 に答える