Hàm của bạn sẽ đi vào một LOOP vô hạn và sẽ không bao giờ thoát ra khỏi nó. Mặc dù nó được biên dịch, nhưng điều đó không có nghĩa là chức năng sẽ hoạt động tốt, vì sự cố sẽ xảy ra khi chạy.
Điều kiện WHILE luôn là TRUE và bộ đếm không bao giờ tăng, vì hàm không bao giờ chuyển sang điều kiện IF.
Bạn đã đặt counter :=2
và sau đó là điều kiện IF của bạn là:
Làm thế nào nó có thể là sự thật? 2 không bao giờ lớn hơn 2 , do đó bộ đếm không bao giờ tăng lên , vì bạn có nó bên trong IF-END IF
khối.
Khi bạn thực thi hàm, nó sẽ không bao giờ thoát ra khỏi vòng lặp vô hạn.
Đáp ứng yêu cầu của bạn,
Tại sao bạn muốn phát minh lại bánh xe khi Oracle đã cung cấp cho bạn dấu phân tách hàng nghìn.
Từ tài liệu,
-
Phần tử:G
-
Ví dụ:9G999
-
Mô tả:Trả về vị trí đã chỉ định dấu phân tách nhóm (giá trị hiện tại của tham số NLS_NUMERIC_CHARACTER). Bạn có thể chỉ định nhiều dấu phân tách nhóm trong mô hình định dạng số.
Ví dụ:
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.
Nếu bạn muốn tên hàm giống với tên của SQL Server , sau đó chỉ cần tạo một hàm do người dùng định nghĩa trong cơ sở dữ liệu Oracle có cùng tên. Logic sẽ giống như truy vấn trên.
Ví dụ:
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>
Hãy thực thi chức năng :
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>