Ошибка PLSQL PLS-00103: обнаружен символ «CREATE» при ожидании одного из следующих - PullRequest
0 голосов
/ 10 апреля 2019

Хи, я пытаюсь решить какую-то задачу, и я написал этот код:

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;

Но он продолжает повторять эту ошибку:

ORA-06550: строка 4, столбец 1: PLS-00103: Обнаружен символ «СОЗДАТЬ» при ожидании одного из следующего: начало подгруппы прагма тип процедуры текущий курсор удалить существует до

Кто-нибудь знает в чем проблема?

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

Вы не можете иметь оператор CREATE OR REPLACE PROCEDURE внутри анонимного блока PL / SQL.Если вы хотите создать процедуру как хранимую процедуру, вы можете сначала создать процедуру:

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;

, а затем вызвать ее из анонимного блока

BEGIN
  POVECANJE_CIJENE(2245);
END;

Или вы можете сделатьПроцедура, локальная для блока PL / SQL:

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;

Также обратите внимание, что в блоке PL / SQL (DECLARE...BEGIN...END) вы не используете оператор EXECUTE, который является командой SQL * Plus.

Удачи.

0 голосов
/ 10 апреля 2019
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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...