Je functie gaat in een oneindige LUS en komt er nooit meer uit. Hoewel het compileert, betekent dit niet dat de functie goed zou werken, aangezien het probleem zich tijdens runtime voordoet.
De WHILE-voorwaarde is altijd TRUE en de teller loopt nooit op, omdat de functie nooit in de IF-voorwaarde gaat.
U heeft counter :=2
. ingesteld en dan je ALS voorwaarde is:
Hoe kan het ooit waar zijn? 2 is nooit groter dan 2 , daarom wordt de teller nooit verhoogd , aangezien je het in de IF-END IF
. hebt blok.
Wanneer u de functie uitvoert, komt deze nooit uit de oneindige lus.
Komt naar uw wens,
Waarom wil je het wiel opnieuw uitvinden als Oracle je al het duizendtal-scheidingsteken biedt.
Uit documentatie,
-
Element :G
-
Voorbeeld:9G999
-
Beschrijving :Retourneert op de opgegeven positie het groepsscheidingsteken (de huidige waarde van de parameter NLS_NUMERIC_CHARACTER). U kunt meerdere groepsscheidingstekens opgeven in een model met getalnotatie.
Bijvoorbeeld,
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.
Als u wilt dat de functienaam hetzelfde is als die van SQL Server functie, maak dan gewoon een door de gebruiker gedefinieerde functie in de Oracle-database met dezelfde naam. De logica zou hetzelfde zijn als de bovenstaande vraag.
Bijvoorbeeld,
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>
Laten we de functie uitvoeren :
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>