Итак, я никогда не работал с хранимыми процедурами и не имел большого опыта работы с базами данных в целом, и мне была назначена задача, которая требует, чтобы я создал пакет, и я застрял.
Используя 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
Я действительно понятия не имею, что происходит, это все для меня совершенно новая территория. Я попытался создать тело, которое просто выбрало что-то из базы данных, но ничего не работает так, как кажется, в моей голове. Может ли кто-нибудь дать мне какое-нибудь представление об этом?





Прежде всего вам нужно объявить тело пакета, например:
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 SQL Developer нам нужно объявить сначала de PACKAGE BODY, после PACKAGE (может быть в том же файле). В TOAD порядок не имеет значения.
@Ewerton Это должен быть взлом TOAD, потому что движку Oracle требуется спецификация ПАКЕТА для компиляции любого ТЕЛА ПАКЕТА.
Пакет Oracle PL / SQL состоит из 2 частей:
Ваш первый фрагмент кода объявляет спецификацию пакета (ПЕРЕЙТИ К). Вы объявили тип (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 (анонимных или иных).
Отлично, спасибо. Я попробовал ваш первый комментарий перед редактированием и обнаружил, что он не работает, но, похоже, был на шаг ближе. Потом я понял, что проблема в том, что ему нужно тело. Думаю, теперь я понимаю, что происходило.