[ORACLE/Procedure] Fout in script maar waar ?

Pagina: 1
Acties:

  • rvrbtcpt
  • Registratie: November 2000
  • Laatst online: 07-09 21:02
Hoi,

[subject typo foutje]
Zie dat ik ORACEL i.p.v. ORACLE getikt heb :)
[/subject typo foutje]

Ik probeer dit script uit te voeren:
code:
1
2
3
4
5
6
7
8
9
10
SQL> CREATE OR REPLACE FUNCTION fillSalesListTable
  2  BEGIN
  3   INSERT INTO saleslist
  4   SELECT productrefpid, SUM(quantityvalue) AS itemssold
  5   FROM productlineitem, isorder
  6   HERE productlineitem.lineitemctnrid = isorder.uuid 
  7   GROUP BY productrefpid
  8   ORDER BY itemssold DESC ;
  9  END fillSalesListTable ;
 10  .

Als ik echter een 'run' geef in SQL Plus dan krijg ik de volgende melding:
code:
1
2
3
4
5
6
7
8
9
10
11
12
SQL> run
  1  CREATE OR REPLACE FUNCTION fillSalesListTable
  2  BEGIN
  3   INSERT INTO saleslist
  4   SELECT productrefpid, SUM(quantityvalue) AS itemssold
  5   FROM productlineitem, isorder
  6   WHERE productlineitem.lineitemctnrid = isorder.uuid
  7   GROUP BY productrefpid
  8   ORDER BY itemssold DESC ;
  9* END fillSalesListTable ;

Warning: Function created with compilation errors.

Schijnbaar zit de fout in de laatste regel maar wat the hell kan daar nu fout aan zijn ?

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Regel 9 is toch fout :?
Simpelweg "end" is toch voldoende?

  • DigiK-oz
  • Registratie: December 2001
  • Laatst online: 07-09 21:08
Wat krijg je als je SHOW ERRORS intikt ?

Whatever


Verwijderd

Een 'function' geeft een waarde terug.

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Om de select binnen de insert moeten haakjes.
De order by is volslagen onzinnig.

Who is John Galt?


  • rvrbtcpt
  • Registratie: November 2000
  • Laatst online: 07-09 21:02
Als ik dit :
code:
1
2
3
4
5
6
INSERT INTO saleslist
 SELECT productrefpid, SUM(quantityvalue) AS itemssold
 FROM productlineitem, isorder
 WHERE productlineitem.lineitemctnrid = isorder.uuid
 GROUP BY productrefpid
 ORDER BY itemssold DESC

Uitvoer dan werkt het toch zonder problemen. (Afgezien van het 'order by' verhaal.

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op dinsdag 21 mei 2002 12:49 schreef Frijns.Net het volgende:
Uitvoer dan werkt het toch zonder problemen. (Afgezien van het 'order by' verhaal.
Neemt niet weg dat de haakjes niet handig zijn, overbodig zijn ze misschien wel. Maar verboden zeker niet en het verduidelijkt de boel iig ;)

  • rvrbtcpt
  • Registratie: November 2000
  • Laatst online: 07-09 21:02
Zo dus:
code:
1
2
3
4
5
6
7
8
9
10
11
SQL> CREATE OR REPLACE FUNCTION fillSalesListTable
  2  BEGIN
  3   INSERT INTO saleslist
  4    ( SELECT productrefpid, SUM(quantityvalue) AS itemssold
  5    FROM productlineitem, isorder
  6    WHERE productlineitem.lineitemctnrid = isorder.uuid 
  7    GROUP BY productrefpid )
  8  END fillSalesListTable ;
  9  /

Warning: Function created with compilation errors.

En dit :
code:
1
2
3
4
5
6
7
8
9
10
11
SQL> CREATE OR REPLACE FUNCTION fillSalesListTable
  2  BEGIN
  3   INSERT INTO saleslist
  4    ( SELECT productrefpid, SUM(quantityvalue) AS itemssold
  5    FROM productlineitem, isorder
  6    WHERE productlineitem.lineitemctnrid = isorder.uuid 
  7    GROUP BY productrefpid )
  8  END ;
  9  /

Warning: Function created with compilation errors.

Werkt ook niet

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Op dinsdag 21 mei 2002 12:49 schreef Frijns.Net het volgende:
Als ik dit :
*knip*
Uitvoer dan werkt het toch zonder problemen. (Afgezien van het 'order by' verhaal.
Zou kunnen, volgens de specs horen ze er wel.
Maar je hebt nog steeds een function zonder returning clausule en return statement.

[bijdehand modus]
Functions zitten er nog in voor backward compatibility, het is niet netjes om ze te gebruiken.
[/bijdehand modus]

Who is John Galt?


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op dinsdag 21 mei 2002 12:52 schreef Frijns.Net het volgende:
Werkt ook niet
Dat is ook niet gezegd :P

Wat wel een leuke opmerking is:
Op dinsdag 21 mei 2002 12:43 schreef korenwolf het volgende:
Een 'function' geeft een waarde terug.
...
Maak er anders een procedure van, ipv function.
Op dinsdag 21 mei 2002 12:54 schreef justmental het volgende:
[bijdehand modus]
Functions zitten er nog in voor backward compatibility, het is niet netjes om ze te gebruiken.
[/bijdehand modus]
Waar moet je ze dan door vervangen? :)
Mogen procedures ook return values geven tegenwoordig? :)

  • rvrbtcpt
  • Registratie: November 2000
  • Laatst online: 07-09 21:02
Damn dacht ik toch dat het em was met die procedure:
code:
1
2
3
4
5
6
7
8
9
10
11
SQL> CREATE OR REPLACE PROCEDURE fillSalesListTable
  2  BEGIN
  3   INSERT INTO saleslist
  4    ( SELECT productrefpid, SUM(quantityvalue) AS itemssold
  5    FROM productlineitem, isorder
  6    WHERE productlineitem.lineitemctnrid = isorder.uuid 
  7    GROUP BY productrefpid )
  8  END ;
  9  /

Warning: Procedure created with compilation errors.\

Of ziet een procudere er wat betreft syntax anders uit ?

Heeft iemand een voorbeeld van een werkende procedure ?
Dit heb ik van internet en aangepast maar waarschijnlijk mis ik toch nog ergens iets. Moet het misschien in een package staan ?

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Bij een procedure moet je wel eindigen met de naam
code:
1
2
3
4
5
6
7
8
9
SQL> CREATE OR REPLACE PROCEDURE fillSalesListTable
  2  BEGIN
  3   INSERT INTO saleslist
  4    ( SELECT productrefpid, SUM(quantityvalue) AS itemssold
  5    FROM productlineitem, isorder
  6    WHERE productlineitem.lineitemctnrid = isorder.uuid 
  7    GROUP BY productrefpid )
  8  END fillSalesListTable;
  9  /

Programmer - an organism that turns coffee into software.


  • rvrbtcpt
  • Registratie: November 2000
  • Laatst online: 07-09 21:02
Thanks, deze werkt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SQL> CREATE OR REPLACE PROCEDURE fillSalesListTable AS
  2  BEGIN
  3   INSERT INTO saleslist
  4    ( SELECT productrefpid, SUM(quantityvalue) AS itemssold
  5    FROM productlineitem, isorder
  6    WHERE productlineitem.lineitemctnrid = isorder.uuid 
  7    GROUP BY productrefpid );
  8  END ;
  9  .
SQL> run
  1  CREATE OR REPLACE PROCEDURE fillSalesListTable AS
  2  BEGIN
  3   INSERT INTO saleslist
  4    ( SELECT productrefpid, SUM(quantityvalue) AS itemssold
  5    FROM productlineitem, isorder
  6    WHERE productlineitem.lineitemctnrid = isorder.uuid
  7    GROUP BY productrefpid );
  8* END ;

Procedure created.

Verwijderd

Tussen de procedure header en BEGIN moet het woordje IS, dat is ook bij functies zo.

:P

edit:
te laat...

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op dinsdag 21 mei 2002 13:02 schreef LuCarD het volgende:
Bij een procedure moet je wel eindigen met de naam
Hoeft toch helemaal niet :?

[edit]
Ah, het was de 'AS' ? :)

Das eigenlijk wel heel slecht ;)

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Op dinsdag 21 mei 2002 12:54 schreef ACM het volgende:
Waar moet je ze dan door vervangen? :)
Mogen procedures ook return values geven tegenwoordig? :)
Ik bedoel te zeggen: losse procedures en functions.
Packages hebben vele voordelen tov. losse procedures/functions en geen echte nadelen.

En procs kunnen idd. values teruggeven :)

Who is John Galt?


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Op dinsdag 21 mei 2002 13:05 schreef ACM het volgende:

[..]

Hoeft toch helemaal niet :?
Hoeft niet, is wel netjes :P

Who is John Galt?


  • rvrbtcpt
  • Registratie: November 2000
  • Laatst online: 07-09 21:02
Nog een ding dan, waarom can ik die procudure niet aanroepen ?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SQL> 
SQL> CREATE OR REPLACE PROCEDURE sp_fillsaleslist AS
  2  BEGIN
  3   INSERT INTO saleslist
  4    ( SELECT productrefpid, SUM(quantityvalue) AS itemssold
  5    FROM productlineitem, isorder
  6    WHERE productlineitem.lineitemctnrid = isorder.uuid 
  7    GROUP BY productrefpid );
  8  END sp_fillsaleslist;
  9  /

Procedure created.

SQL> call sp_fillsaleslist;
call sp_fillsaleslist
     *
ERROR at line 1:
ORA-06576: not a valid function or procedure name

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Op dinsdag 21 mei 2002 13:53 schreef Frijns.Net het volgende:
Nog een ding dan, waarom can ik die procudure niet aanroepen ?
code:
1
SQL> *knip*
Call?
Heb je er wel een manual bij?

Kijk eens onder 'execute'.

Who is John Galt?


  • rvrbtcpt
  • Registratie: November 2000
  • Laatst online: 07-09 21:02
Manual via internet.
Maar Toad gaf een 'invalid sql statement' op mijn 'execute sp_fillsaleslist'
Vervolgens probeerde ik 'call' en die werkte ook niet.

Execute is inderdaad goed. Toad snapt em niet maar SQL Plus gelukkig wel.

Verwijderd

Moet je niet eerst even 'committen' voordat je met verschillende programma's die functie kan aanroepen?

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Op dinsdag 21 mei 2002 14:18 schreef TheGentleman het volgende:
Moet je niet eerst even 'committen' voordat je met verschillende programma's die functie kan aanroepen?
Commit is voor dml statements (insert/update/delete).
Create's doen altijd impliciet een commit.

Who is John Galt?


Verwijderd

Oei, dat zat erin, natuurlijk...
Pagina: 1