0

Hy, I'm trying to solve some task and I wrote this code:

DECLARE
previse EXCEPTION;
nema EXCEPTION;
CREATE OR REPLACE PROCEDURE POVECANJE_CIJENE(NOVA_SIFRA PO_PLOCICE.SIFRA_DOB%TYPE) IS 
BEGIN
    IF NOVA_SIFRA NOT IN (SELECT SIFRA_DOB FROM PO_DOBAVLJAC) THEN
        RAISE nema;
    ELSIF (CIJENA+30)>600 THEN
        RAISE previse;
    ELSE
        UPDATE PO_PLOCICE SET CIJENA=CIJENA+30 WHERE SIFRA_DOB=NOVA_SIFRA;

EXCEPTION
    WHEN nema THEN
        DBMS_OUTPUT.PUT_LINE('Nema te sifre');
    WHEN previse THEN
        DBMS_OUTPUT.PUT_LINE('Cijena je prešla 600 kn');
END POVECANJE_CIJENE;

BEGIN
    EXECUTE POVECANJE_CIJENE(2245);
END;

But it keep saying this error:

ORA-06550: line 4, column 1: PLS-00103: Encountered the symbol "CREATE" when expecting one of the following: begin function pragma procedure subtype type current cursor delete exists prior

Does anybody know what is the problem?

ADyson
  • 57,178
  • 14
  • 51
  • 63

2 Answers2

0
You can do this (probaj ovako pa ako ti ne radi javi da rješavamo dalje :) )

CREATE OR REPLACE PROCEDURE POVECANJE_CIJENE(NOVA_SIFRA PO_PLOCICE.SIFRA_DOB%TYPE) IS 
  previse EXCEPTION; 
  nema EXCEPTION;
  l_broj_cijena number;
  l_cijena number;
BEGIN 

  select count(1)
  into l_broj_cijena
  from PO_DOBAVLJAC
  where SIFRA_DOB = NOVA_SIFRA;

  select max(cijena)
  into l_cijena
  from PO_PLOCICE
  where SIFRA_DOB=NOVA_SIFRA;

  IF l_broj_cijena = 0 
  THEN 
    RAISE nema; 
  ELSIF (l_cijena+30)>600 THEN 
    RAISE previse; 
  ELSE 
    UPDATE PO_PLOCICE SET CIJENA=CIJENA+30 
    WHERE SIFRA_DOB=NOVA_SIFRA;
  END IF;

EXCEPTION 
  WHEN nema THEN DBMS_OUTPUT.PUT_LINE('Nema te sifre'); 
  WHEN previse THEN DBMS_OUTPUT.PUT_LINE('Cijena je prešla 600 kn'); 

END POVECANJE_CIJENE;
Mladen S
  • 93
  • 7
  • Javlja ovo:Errors: PROCEDURE POVECANJE_CIJENE Line/Col: 4/3 PLS-00103: Encountered the symbol "L_BROJ_CIJENA" when expecting one of the following: ; – Ivana Lovrinovic Apr 09 '19 at 21:34
  • falila točka zarez. probaj ponovo kopirati i kreirati proceduru – Mladen S Apr 09 '19 at 21:35
  • dodala sam ; ali sad javlja: Errors: PROCEDURE POVECANJE_CIJENE Line/Col: 24/1 PLS-00103: Encountered the symbol "EXECUTE" Line/Col: 24/31 PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following: begin function pragma procedure subtype type current cursor delete exists prior – Ivana Lovrinovic Apr 09 '19 at 21:37
  • još je nedostajala varijabla cijena pa sam je dodao i napunio na početku. Ajde stavi u edito sada samo ovaj kod za kreriranje procedure,bez onog execute ili exec nakon pa javi. – Mladen S Apr 09 '19 at 21:43
  • procedura pise da je kreirana, ali kako je mogu sada pokrenuti? Jel imaš možda facebook ili nešto da ti pošaljem sliku zadatka jer ovdje ne mogu? – Ivana Lovrinovic Apr 09 '19 at 21:51
  • nemam facebook, samo linkedin :) – Mladen S Apr 09 '19 at 21:52
  • sad dok je kreirana procedura možeš je pokrenuti sa exec. Znači napišeš EXEC POVECANJE_CIJENE(2245); i to bi trebalo raditi. – Mladen S Apr 09 '19 at 21:53
  • ovo javlja:ORA-06550: line 2, column 11: PLS-00103: Encountered the symbol "POVECANJE_CIJENE" when expecting one of the following: := . ( @ % ; immediate The symbol ":=" was substituted for "POVECANJE_CIJENE" to continue. – Ivana Lovrinovic Apr 09 '19 at 21:56
  • a jesi samo to imala u editori ili i još nešto? Ako neće tako probaj sa: begin POVECANJE_CIJENE(2245); end; – Mladen S Apr 09 '19 at 21:58
  • Kreirajte proceduru POVECANJE_CIJENE, koja će vršiti povećanje cijene pločica u tablici PO_PLOCICE. Za 30kn ćete povećati cijenu svih pločica prethodno odabranog dobavljača (šifra dobavljača se unosi kao parametar). Vodite računa o tome da dobavljač(SIFRA_DOB) za kojeg budete ažurirali cijene pločica mora postojati u tablici PO_DOBAVLJAC te da najveća cijena pločice ne smije preći 600kn. U suprotnom obrađuju se odgovarajuće greške(predefinirane i/ili korištenjem RAISE naredbe). – Ivana Lovrinovic Apr 09 '19 at 22:00
  • ovako zvuci zadatak, pa mozda to pomogne jos da nije nesto krivo u kodu logicki – Ivana Lovrinovic Apr 09 '19 at 22:01
  • ovo je error bez executea: ORA-01422: exact fetch returns more than requested number of rows ORA-06512: at "SQL_ZBIIPYNTTPEAVWKGRQAYFXBLR.POVECANJE_CIJENE", line 13 ORA-06512: at line 2 ORA-06512: at "SYS.DBMS_SQL", line 1721 – Ivana Lovrinovic Apr 09 '19 at 22:02
  • e sad je puklo jer jedan dobavljać može imati više cijena, i to je sad problem. Prema zadatku ako cijena pređe 600 treba javiti grešku, ali je pitanje što ako dobavljać ima više cijena i samo jedna pređe 600. Da li treba sve odbaciti ili samo onu koja pređe 600. – Mladen S Apr 09 '19 at 22:05
  • piše najveća cijena? – Ivana Lovrinovic Apr 09 '19 at 22:09
  • a to onda ne treba smatrati greškom. Dakle ako imaš cijenu 500 staviš je na 530, a ako je cijena 590 umjesto na 620 staviš na 600. Gore u mojem postu sam ti zalijepio još jednom proceduru sa ovakvom logikom pa možeš probati jel ti ok. – Mladen S Apr 09 '19 at 22:10
  • Ali baš se traži od mene da ako prijeđe 600 da ispišem grešku – Ivana Lovrinovic Apr 09 '19 at 22:14
  • a jel imaš neki primarni ključ u tablici PO_PLOCICE? to nam treba ako trebamo promijeniti vrijednost na slogovima koji su manji od 600 i onda ako ima nekih koji bi prošli 600 da javimo grešku. jednostavnija opcija nam je ako bi bilo koji slog prešao 600 da ne ažuriramo ništa već da javimo grešku. Javi s kojom opcijom idemo dalje pa da prilagodim skriptu. – Mladen S Apr 09 '19 at 22:18
  • Budući da se nisi javila, napravio sam ovu drugu opciju " jednostavnija opcija nam je ako bi bilo koji slog prešao 600 da ne ažuriramo ništa već da javimo grešku". Ak ti je to ok možeš kliknuti negdje da ti je ta procedura pomogla, a ak ne možda si pišemo i sutra :) – Mladen S Apr 09 '19 at 22:43
0

You can't have a CREATE OR REPLACE PROCEDURE statement inside an anonymous PL/SQL block. If you want to create the procedure as a stored procedure you can create the procedure first:

CREATE OR REPLACE PROCEDURE POVECANJE_CIJENE(NOVA_SIFRA PO_PLOCICE.SIFRA_DOB%TYPE) IS 
  previse EXCEPTION;
  nema EXCEPTION;
BEGIN
    IF NOVA_SIFRA NOT IN (SELECT SIFRA_DOB FROM PO_DOBAVLJAC) THEN
        RAISE nema;
    ELSIF (CIJENA+30)>600 THEN
        RAISE previse;
    ELSE
        UPDATE PO_PLOCICE SET CIJENA=CIJENA+30 WHERE SIFRA_DOB=NOVA_SIFRA;

EXCEPTION
    WHEN nema THEN
        DBMS_OUTPUT.PUT_LINE('Nema te sifre');
    WHEN previse THEN
        DBMS_OUTPUT.PUT_LINE('Cijena je prešla 600 kn');
END POVECANJE_CIJENE;

and then call it from an anonymous block

BEGIN
  POVECANJE_CIJENE(2245);
END;

Or else you can make the procedure local to the PL/SQL block:

DECLARE
  previse EXCEPTION;
  nema EXCEPTION;

  PROCEDURE POVECANJE_CIJENE(NOVA_SIFRA PO_PLOCICE.SIFRA_DOB%TYPE) IS 
  BEGIN
    IF NOVA_SIFRA NOT IN (SELECT SIFRA_DOB FROM PO_DOBAVLJAC) THEN
        RAISE nema;
    ELSIF (CIJENA+30)>600 THEN
        RAISE previse;
    ELSE
        UPDATE PO_PLOCICE SET CIJENA=CIJENA+30 WHERE SIFRA_DOB=NOVA_SIFRA;

  EXCEPTION
    WHEN nema THEN
        DBMS_OUTPUT.PUT_LINE('Nema te sifre');
    WHEN previse THEN
        DBMS_OUTPUT.PUT_LINE('Cijena je prešla 600 kn');
  END POVECANJE_CIJENE;

BEGIN
  POVECANJE_CIJENE(2245);
END;

Note also that in a PL/SQL block (DECLARE...BEGIN...END) you don't use the EXECUTE statement, which is an SQL*Plus command.

Best of luck.