обнаружен пакет Oracle: PLS-00103: обнаружен символ "CREATE" - PullRequest
22 голосов
/ 10 февраля 2012

Я пишу пакет Oracle, используя Oracle SQL Developer, я получил эту ошибку компиляции:

Ошибка (7,1): PLS-00103: Обнаружен символ "CREATE".

create or replace
PACKAGE TestPackage AS 
 FUNCTION beforePopulate RETURN BOOLEAN;
 FUNCTION afterPopulate RETURN BOOLEAN;
END TestPackage;

CREATE OR REPLACE PACKAGE BODY TestPackage AS
   FUNCTION beforePopulate RETURN BOOLEAN AS
   BEGIN
      DELETE FROM TEST_1;
      INSERT INTO TEST_1
      SELECT * FROM TEST WHERE VALUE=300;
      COMMIT;
      RETURN TRUE;
     EXCEPTION
       WHEN OTHERS THEN
        RETURN FALSE;
   END;
   FUNCTION afterPopulate RETURN BOOLEAN AS
     BEGIN
         UPDATE TEST SET RESULT="completed" WHERE VALUE=300;
            COMMIT;
         RETURN TRUE;
         EXCEPTION
           WHEN OTHERS RETURN FALSE;
        END;
  END;
END TestPackage;

Если я добавлю / в строку 6, ошибка станет такой:

Ошибка (6,1): PLS-00103: Обнаружен символ "/"

Я устал от пустой реализации, как это:

create or replace 
package package1 as 
END PACKAGE1;

CREATE OR REPLACE 
package body package1 as 
end package1;

Я получил ту же ошибку.

Ответы [ 6 ]

27 голосов
/ 11 февраля 2012

Когда у вас BEGIN, END и т. Д., Вы находитесь в PL / SQL, а не в SQL.

Блок PL / SQL должен заканчиваться одиночной ("прямой") косой чертой в самом началелиния.Это говорит Oracle, что вы закончили с вашим блоком PL / SQL, поэтому он компилирует этот блок текста.

SQL-запрос - завершается точкой с запятой:

update orders set status = 'COMPLETE' where order_id = 55255;

PL / SQL block - команды разделяется точкой с запятой, блок завершается косой чертой:

create or replace procedure mark_order_complete (completed_order_id in number)
is
begin
     update orders set status = 'COMPLETE' where order_id = :completed_order_id;
end mark_order_complete;
/
6 голосов
/ 10 февраля 2012

Это сработало для меня с помощью Oracle SQL Developer:

create or replace PACKAGE TestPackage AS
FUNCTION beforePopulate 
 RETURN BOOLEAN;  
FUNCTION afterPopulate 
 RETURN BOOLEAN;
END TestPackage;
/
CREATE OR REPLACE PACKAGE BODY TestPackage AS    
 FUNCTION beforePopulate 
  RETURN BOOLEAN  AS    
 BEGIN       
  DELETE FROM TESTE;      
  INSERT INTO TESTE       
  SELECT 1,1,1 FROM DUAL; 
  COMMIT;     
  RETURN TRUE;  
 EXCEPTION    
  WHEN OTHERS THEN   
   RETURN FALSE;   
 END;
 FUNCTION afterPopulate 
  RETURN BOOLEAN  AS  
 BEGIN
  UPDATE TESTE SET TESTE='OK' WHERE TESTE='';
  COMMIT;       
  RETURN TRUE;  
 EXCEPTION       
  WHEN OTHERS THEN RETURN FALSE;    
 END; 
END TestPackage;
/   

Я не мог заставить его работать, пока я фактически не создал таблицы и столбцы, которые он будет использовать.

4 голосов
/ 09 мая 2013

После нескольких часов разочарования мне удалось заставить этот материал работать.У меня была проблема точная , как и у вас.

Для меня решение было запустить ее как скрипт, а не в коде пакета.Прямая косая черта работает правильно в листе SQL.Я прилагаю разницу, я надеюсь, это поможет вам!

enter image description here

2 голосов
/ 07 августа 2014

У меня была такая же проблема.Я создаю пакет, используя главное меню слева и помещаю объявление пакета и тело в один и тот же файл .sql.Проблема решается, когда я копирую весь код, вставляю его в новый лист и помещаю "/" после имени имени пакета (как после объявления пакета, так и в теле), а затем выполняю лист в виде скрипта.

1 голос
/ 21 февраля 2013

выполнить пакет и тело пакета отдельно с помощью F5

0 голосов
/ 25 января 2017

У меня была эта проблема (Ошибка (6,1): PLS-00103: обнаружен символ "/"), когда я скопировал весь код пакета db (как заголовки процедур, так и реализации) в sqldeveloper в user / packages / MY_PACKAGE_NAME /MY_PACKAGE_BODY вместо копирования заголовков (без '/' в конце) в user / packages / MY_PACKAGE_NAME и реализации (без заголовков вверху и без '/' в конце) в user / packages / MY_PACKAGE_NAME / MY_PACKAGE_BODY.

...