PLSQL错误 PLS-00103:遇到符号"CREATE",预期以下之一

18 浏览
0 Comments

PLSQL错误 PLS-00103:遇到符号"CREATE",预期以下之一

嗨,我正在尝试解决一些任务,并编写了以下代码:

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: 遇到符号“CREATE”,但期望以下之一:

begin function pragma procedure subtype type

current cursor delete

exists prior

有谁知道问题出在哪里吗?

0
0 Comments

PL/SQL错误PLS-00103:在期望以下内容之一时遇到符号“CREATE”出现的原因是,匿名PL/SQL块中不能有CREATE OR REPLACE PROCEDURE语句。如果要将过程创建为存储过程,可以先创建过程,然后从匿名块中调用它。解决方法如下:

首先,创建过程:

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
0 Comments

PL/SQL错误PLS-00103: 遇到符号"CREATE",但期望以下之一。出现这个错误的原因是在创建存储过程时缺少分号。解决方法是在第4行代码末尾添加分号。然后,又出现了另一个错误,错误信息为PLS-00103: 遇到符号"EXECUTE",但期望以下之一。这个错误是因为在执行存储过程时使用了错误的语法。解决方法是在开始和结束之间添加新的代码段,然后在新的代码段中调用存储过程。最后,还出现了ORA-06550: 行2,列11: PLS-00103: 遇到符号"POVECANJE_CIJENE",但期望以下之一的错误。这个错误是因为在执行存储过程时使用了错误的语法。解决方法是在存储过程名称前添加冒号和等号,然后再次尝试执行存储过程。

下面是修复后的代码:

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;

这个存储过程用于增加PO_PLOCICE表中瓷砖的价格。通过输入参数作为供应商的代码,将所有选定供应商的瓷砖价格增加30kn。请注意,您必须确保要更新价格的供应商(SIFRA_DOB)在PO_DOBAVLJAC表中存在,并且最大价格不超过600kn。否则,将处理相应的错误(使用预定义的错误或使用RAISE语句)。

希望这篇文章对您有所帮助!如果您有任何其他问题,请随时提问。

0