2015-10-28 2 views
0

Я изучаю создание хранимой процедуры в Oracle 11g, и я использую SQL Developer. Когда я запускал инструкцию отдельно, они работают, но когда я группирую их вместе в хранимую процедуру и добавляю некоторый цикл, я получил ошибку, которую я не могу понять. Мне не повезло, когда мы пытались найти решение в сети, поэтому надеемся, что кто-либо на этом форуме может предложить некоторые советы. Спасибо!Oracle 11 g Объявить ошибку

create or replace PROCEDURE InputAddr AS 
    DECLARE v_TotalCount INT; 

    BEGIN 
    -- this insert statement is correct and ran just fine 
    INSERT INTO table1 (column1,colum2,colum3,...) 
    SELECT column11,column12,column13,... 
    FROM table2 

    -- counting how many records have been inserted into table1 
    select count(*) into v_totalcount 
    from table1 

    -- loop the process 
    IF v_totalcount >= 1000 
    THEN 
     WHILE v_TotalCount >= 1000 
     LOOP 
      DECLARE 
      P_NAME VARCHAR2(200); 
      P_DESCRIPTION VARCHAR2(200); 
      P_COUNTRY VARCHAR2(200); 

     BEGIN 
      P_NAME := 'TEST FILE'; 
      P_DESCRIPTION := 'TEST FILE DESC'; 
      P_COUNTRY := 'USA'; 

      INSTANTADDRESS.SENDADDRESSES (P_NAME, P_DESCRIPTION, P_COUNTRY); 
      COMMIT; 
     END;    
     END LOOP;    
    ELSE 
     -- less then 1000 run the same codes once 
      DECLARE 
      P_NAME VARCHAR2(200); 
      P_DESCRIPTION VARCHAR2(200); 
      P_COUNTRY VARCHAR2(200);    
     BEGIN 
      P_NAME := 'TEST FILE'; 
      P_DESCRIPTION := 'TEST FILE DESC'; 
      P_COUNTRY := 'USA'; 

      INSTANTADDRESS.SENDADDRESSES (P_NAME, P_DESCRIPTION, P_COUNTRY); 
      COMMIT; 
     END;   
    END IF 
    END; 

Здесь ошибка после компиляции этой процедуры:

Error(3,4): PLS-00103: Encountered the symbol "DECLARE" when expecting 
one of the following:  begin function pragma procedure subtype type 
<an identifier> <a double-quoted delimited-identifier> current cursor 
delete exists prior external language 

ответ

1

Вам не нужно DECLARE на линии 2.

"AS" действует как DECLARE здесь.

+0

Если я устранил DECLARE я получил еще больше ошибок: Ошибка (39,15): PLS-00201: идентификатор ' INSTANTADDRESS.SENDADDRESSES "должно быть объявлено Ошибка (39,15): PL/SQL: заявление игнорируется Ошибка (55,11): PLS-00201: идентификатор« INSTANTADDRESS.SENDADDRESSES »должен быть объявлен Ошибка (55,11): PL/SQL: заявление игнорируется Ошибка (67,13): PLS-00201: идентификатор «INSTANTADDRESS.GETADDRESSESRESULT» должен быть объявлен Ошибка (67,13): PL/SQL: заявление игнорируется. Кстати, я добавил все; Спасибо!! – MGL

+0

Проверьте, есть ли у пользователя привилегия EXECUTE на процедурах/функциях: INSTANTADDRESS.SENDADDRESSES, INSTANTADDRESS.GETADDRESSESRESULT и т. Д. –

+0

Как я могу проверить эту привилегию? Я знаю, что меня сделали администратором – MGL

0

В дополнение к ответу Раманы вам также не хватает полуколонок. Добро пожаловать в адский полуплот, я имею в виду PL/SQL! * {:-)

Я добавил их сюда, для вас:

create or replace procedure inputaddr 
as 
    v_totalcount int; 
begin 
    -- this insert statement is correct and ran just fine 
    insert into table1 (column1,colum2,colum3,...) 
    select column11,column12,column13,... 
    from table2; -- MISSING ; ADDED! 

    -- counting how many records have been inserted into table1 
    select count(*) 
    into v_totalcount 
    from table1; -- MISSING ; ADDED! 

    -- loop the process 
    if v_totalcount >= 1000 then 
    while v_totalcount >= 1000 
    loop 
     declare 
     p_name varchar2(200); 
     p_description varchar2(200); 
     p_country varchar2(200); 
     begin 
     p_name := 'TEST FILE'; 
     p_description := 'TEST FILE DESC'; 
     p_country := 'USA'; 

     instantaddress.sendaddresses (p_name, p_description, p_country); 
     commit; 
     end;    
    end loop;    
    else 
    -- less then 1000 run the same codes once 
    declare 
     p_name varchar2(200); 
     p_description varchar2(200); 
     p_country varchar2(200);    
    begin 
     p_name := 'TEST FILE'; 
     p_description := 'TEST FILE DESC'; 
     p_country := 'USA'; 

     instantaddress.sendaddresses (p_name, p_description, p_country); 
     commit; 
    end;   
    end if; -- MISSING ; ADDED! 
end inputaddr; 
/
Смежные вопросы