あなたの関数は無限ループに入り、それから出ることは決してありません。コンパイルされますが、実行時に問題が発生するため、関数が正常に機能するわけではありません。
WHILE条件は常にTRUEであり、関数がIF条件に入ることはないため、カウンターがインクリメントすることはありません。
counter :=2
を設定しました 次に、IF条件 は:
どうしてそれが真実なのだろうか? 2が2を超えることはありません したがって、カウンターがインクリメントされることはありません 、IF-END IF
内にあるため ブロック。
関数を実行しても、無限ループから抜け出すことはありません。
要件に合わせて
オラクルがすでに千のセパレータを提供しているのに、なぜ車輪の再発明をしたいのですか。
ドキュメントから
-
要素:G
-
例:9G999
-
説明:指定された位置にグループ区切り文字(NLS_NUMERIC_CHARACTERパラメーターの現在の値)を返します。数値形式モデルで複数のグループ区切り文字を指定できます。
たとえば、
SQL> SELECT TO_CHAR(sal,'999G999') FROM emp;
TO_CHAR(
--------
800
1,600
1,250
2,975
1,250
2,850
2,450
3,000
5,000
1,500
1,100
950
3,000
1,300
14 rows selected.
関数名をSQLServerの名前と同じにする場合 関数を作成し、Oracleデータベースに同じ名前のユーザー定義関数を作成します。ロジックは上記のクエリと同じです。
たとえば、
SQL> CREATE OR REPLACE FUNCTION NumericFormat(
2 col NUMBER)
3 RETURN VARCHAR2
4 AS
5 o_num VARCHAR2(20);
6 BEGIN
7 o_num:=TO_CHAR(col,'999G999');
8 RETURN o_num;
9 END;
10 /
Function created.
SQL>
SQL> sho err
No errors.
SQL>
関数を実行してみましょう :
SQL> SELECT NumericFormat(sal) FROM emp;
NUMERICFORMAT(SAL)
----------------------------------------------
800
1,600
1,250
2,975
1,250
2,850
2,450
3,000
5,000
1,500
1,100
950
3,000
1,300
14 rows selected.
SQL>