Искал веками безрезультатно. В части оценки указывается, что мы должны объявить открытую переменную WITHIN в пакете (поэтому не пытайтесь указывать мне сделать ее автономной функцией ...), которая представляет собой количество строк в другой таблице ("SELECT COUNT (* ) ОТ A2_GUESTS "это подсказка)
Я могу достаточно легко установить общедоступную переменную в виде статического числа, однако, если я пытаюсь добавить оператор выбора, он выдает ошибку.
Если я пытаюсь назначить его в теле пакета, он также выдает ошибку, если я заключаю его в «начало» и «конец», он завершает тело пакета слишком рано.
CREATE OR REPLACE PACKAGE Beachcomber
AS
v_Guest_Count NUMBER := 0;
END Beachcomber;
/
CREATE OR REPLACE PACKAGE BODY Beachcomber IS
SELECT COUNT(*) INTO v_Guest_Count FROM A2_GUESTS; -- doesn't work
v_Guest_Count NUMBER := SELECT COUNT(*) FROM A2_GUESTS; -- doesn't work
BEGIN
v_Guest_Count NUMBER := SELECT COUNT(*) FROM A2_GUESTS;
END; -- doesn't work - ends the package prematurely
END Beachcomber;
Приведенный выше пример - это способы, которыми я пытался (среди прочих) не одновременно, а индивидуально.
Нам дают код для его проверки: (не должны изменять этот код тестирования)
PROMPT
PROMPT TESTING: Initialisation of the v_Guest_Count variable. Expect 81.
BEGIN
DBMS_OUTPUT.PUT_LINE('v_Guest_Count has been initialised to: '||TO_CHAR(BEACHCOMBER.v_Guest_Count));
END;
любая помощь очень ценится, я обнаружил, что кто-то спросил об этом здесь однажды, еще в 2015 году, но был дан единственный ответ, как сделать его функцией, и они откорректировали код тестирования так, что это менее чем полезно.
в пакете больше кода с процедурами и функциями:
CREATE OR REPLACE PACKAGE Beachcomber
IS
v_Guest_Count NUMBER := 0;
PROCEDURE ADD_GUEST
(p_guest_name A2_GUESTS.guest_name%TYPE,
p_guest_address A2_GUESTS.guest_address%TYPE);
END Beachcomber;
/
CREATE OR REPLACE PACKAGE BODY Beachcomber IS
BEGIN
SELECT COUNT(*) INTO v_Guest_Count FROM A2_GUESTS;
PROCEDURE ADD_GUEST
(p_guest_name A2_GUESTS.guest_name%TYPE,
p_guest_address A2_GUESTS.guest_address%TYPE)
IS BEGIN
INSERT INTO A2_GUESTS (Guest_ID, Guest_Name, Guest_Address)
VALUES (guest_id_seq.NEXTVAL, p_guest_name, p_guest_address);
v_Guest_Count := v_Guest_Count +1;
END ADD_GUEST;
END Beachcomber;
это бросит:
5/5 PLS-00103: Encountered the symbol "PROCEDURE" 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 The symbol "declare" was substituted for "PROCEDURE" to continue.
Обычно я в порядке, работая с сообщениями об ошибках, но сообщения об ошибках оракула могут быть написаны мне на голландском: /