Проблемы создания пакетов с использованием SQL Developer

Так что я никогда не работал с хранимыми процедурами, и у меня нет большого опыта работы с БД в целом, и мне было поручено задание, требующее создания пакета, и я застрял.

Используя SQL Developer, я пытаюсь создать пакет под названием JUMPTO с этим кодом...


create or replace package JUMPTO is
  type t_locations is ref cursor;

  procedure procGetLocations(locations out t_locations);

end JUMPTO;

Когда я запускаю его, он выплевывает этот блок кода PL/SQL...


DECLARE
  LOCATIONS APPLICATION.JUMPTO.t_locations;
BEGIN

  JUMPTO.PROCGET_LOCATIONS(
    LOCATIONS => LOCATIONS
  );
  -- Modify the code to output the variable
  -- DBMS_OUTPUT.PUT_LINE('LOCATIONS = ' || LOCATIONS);
END;

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

Когда я нажимаю "ОК", я получаю ошибку...


ORA-06550: line 2, column 32:
PLS-00302: component 'JUMPTO' must be declared
ORA-06550: line 2, column 13:
PL/SQL: item ignored
ORA-06550: line 6, column 18:
PLS-00320: the declaration of the type of this expression is incomplete or malformed
ORA-06550: line 5, column 3:
PL/SQL: Statement ignored
ORA-06512: at line 58

Я действительно понятия не имею, что происходит, для меня это совершенно новая территория. Я попытался создать тело, которое только что выбрало какой-то материал из базы данных, но ничего не работает так, как кажется в моей голове. Кто-нибудь может дать мне какое-либо понимание этого?

2 ответа

Решение

Прежде всего вам нужно объявить тело пакета, например:

create or replace package body JUMPTO is

  procedure procGetLocations(locations out t_locations)
  is
  begin
    locations := null; -- Need code here
  end;

end JUMPTO;

Для компиляции нужно это:

 DECLARE
     LOCATIONS JUMPTO.t_locations;
   BEGIN
     JUMPTO.PROCGETLOCATIONS(
       LOCATIONS => LOCATIONS
     );
   END;

Пакет Oracle PL/SQL состоит из 2 частей:

  • Спецификация пакета (публичная часть, где перечислены глобально доступные константы, функции, процедуры, переменные и т. Д.).
  • Тело пакета (где находится код для реализации спецификации пакета).

Ваш первый кусок кода объявил спецификацию пакета (JUMPTO). Вы объявили тип (t_locations) и процедуру (procGetLocations), которые не имеют входных данных, но выводят одну переменную (местоположения) типа t_locations.

Сначала скомпилируйте спецификацию пакета (как вы это сделали), затем скомпилируйте тело пакета следующим образом:

create or replace package body JUMPTO is  
procedure procGetLocations(locations out t_locations) is  
begin    
locations := null; -- Your code goes here
end procGetLocations;
end JUMPTO;

Теперь вы можете вызывать процедуру procGetLocations в других блоках PL / SQL (анонимных или иных).

Другие вопросы по тегам