2016-06-07 9 views
1

я написал эту простую процедуру следующую ORACLE документации для того, чтобы практиковать с PL/SQL:ORACLE - ошибка PLS-00103 в процедуре

create procedure BADGE_PROCEDURE (badges NUMBER) AS 
    loops NUMBER; 
BEGIN 
    loops := badges; 
    loops := loops - 1; 
    BEGIN LOOP 
    insert into BADGE values (BADGE_ID_SEQUENCE.nextval, 'prova', 'prova', '01-JAN-01');  
    loops := loops - 1; 
    EXIT WHEN loops < 0; 
    END LOOP; 
END; 
/

Это мой BADGE стол:

CREATE TABLE BADGE 
(badge_id NUMBER PRIMARY KEY, 
name VARCHAR(20), 
surname VARCHAR(20) NOT NULL, 
birthday DATE); 

Наконец это моя последовательность:

CREATE SEQUENCE BADGE_ID_SEQUENCE 
start with 1  
increment by 1  
nocache 
nocycle; 

Однако процедура компилируется со следующей ошибкой:

LINE/COL ERROR 
-------- ----------------------------------------------------------------- 
11/5  PLS-00103: Encountered the symbol "end-of-file" when expecting 
     one of the following: 
     (begin case declare end exception exit for goto if loop mod 
     null pragma raise return select update while with 
     <an identifier> <a double-quoted delimited-identifier> 
     <a bind variable> << continue close current delete fetch lock 
     insert open rollback savepoint set sql execute commit forall 
     merge pipe purge 

Что я делаю неправильно?

+1

'начинают loop' должны быть просто' loop' (не 'begin'), если я правильно помню .. – sstan

+0

Вы правы ! Моя ошибка – user3610096

+2

Кроме того, если вы добавляете дату в столбец/переменную DATE, пожалуйста, ПОЖАЛУЙСТА, сначала преобразуйте ее в ДАТУ. В настоящее время вы пытаетесь вставить строку, которая заставляет Oracle использовать параметр nls_date_format по умолчанию для вашей сессии. Это может отличаться для других сеансов, и ваш код может быть ошибкой. Гораздо лучше быть явным и использовать формат букв даты 'DATE '2001-01-01'' или использовать to_date, например:' to_date ('01/01/2001', 'dd/mm/yyyy') '. Обратите внимание, что годы имеют четыре цифры, а не два - зачем делать предположение db, когда вы можете предоставить точную информацию заранее? – Boneist

ответ

3

syntax for a loop является LOOP ... END LOOP; без BEGIN.

create procedure BADGE_PROCEDURE (badges NUMBER) AS 
    loops NUMBER; 
BEGIN 
    loops := badges; 
    loops := loops - 1; 
    LOOP 
    insert into BADGE values (BADGE_ID_SEQUENCE.nextval, 'prova', 'prova', DATE '2001-01-01');  
    loops := loops - 1; 
    EXIT WHEN loops < 0; 
    END LOOP; 
END; 
/

Однако еще более простой вариант будет:

create procedure BADGE_PROCEDURE (badges NUMBER) AS 
BEGIN 
    FOR loops IN 1 .. badges LOOP 
    insert into BADGE values (BADGE_ID_SEQUENCE.nextval, 'prova', 'prova', DATE '2001-01-01');  
    END LOOP; 
END; 
/
+0

Спасибо, это то, что я искал! – user3610096

+0

@Boneist Исправлено использование литератур даты - TBH Я даже не смотрел на то, что было вставлено (но так как я обычно выбираю других людей для вставки дат, которые я должен был посмотреть). – MT0

+0

@ MT0 * {:-) не беспокойтесь; случается с лучшими из нас! – Boneist

2

Ваш синтаксис цикла неправильно ..

Вобще

   LOOP 
        insert into BADGE values (BADGE_ID_SEQUENCE.nextval, 'prova', 'prova', '01-JAN-01');  
        loops := loops - 1; 
        EXIT WHEN loops < 0; 
      END LOOP; 

Вот example от оракула документации.

+0

Спасибо, ты прав – user3610096

Смежные вопросы