У вас есть две маленькие опечатки:
"Как" за параметрами.Заменяет «объявлений» plsql-блока
VARCHAR должен быть определен с длиной, если это не параметр (например: VARCHAR2 (100)).Но вы хотите использовать NUMBER для вычисления чего-либо.
Как вычесть значения
CREATE OR REPLACE PROCEDURE Validate_Prereq_Met
(
p_snum IN Enrollments.snum%TYPE,
p_callnum IN Enrollments.Callnum%TYPE
)
AS
v_pcnum NUMBER;
v_cnum NUMBER;
v_result NUMBER;
BEGIN
--classes needed minus classes taken
SELECT pcnum AS v_pcnum
FROM prereq
WHERE cnum IN (SELECT cnum
FROM schclasses
WHERE callnum = p_callnum)
SELECT cnum AS v_cnum
FROM enrollments, schclasses
WHERE enrollments.callnum = schclasses.callnum AND snum = p_snum;
v_result := v_pcnum - v_cnum;
dbms_output.put_line('v_result : ' || v_result );
END;
Как сделать функцию с этими
Если вы объявите функцию, вы можете вернутьВаше значение результата:
CREATE OR REPLACE FUNCTION Validate_Prereq_Met (
p_snum IN Enrollments.snum%TYPE,
p_callnum IN Enrollments.Callnum%TYPE)
RETURN NUMBER
AS
v_pcnum NUMBER;
v_cnum NUMBER;
v_result NUMBER;
BEGIN
--classes needed minus classes taken
SELECT pcnum AS v_pcnum
FROM prereq
WHERE cnum IN (SELECT cnum
FROM schclasses
WHERE callnum = p_callnum);
SELECT cnum AS v_cnum
FROM enrollments, schclasses
WHERE enrollments.callnum = schclasses.callnum AND snum = p_snum;
v_result := v_pcnum - v_cnum;
RETURN v_result;
END;
Вы использовали MINUS
Используемое MINUS
не вычитает значения.Он используется для вычитания набора значений из другого.
Пример:
Мы получили две таблицы - одну, содержащую 1,2 и 3, одну, содержащую 1 и 3. Теперь мы можем вычестьЗначения таблицы 2 из таблицы 1.
SELECT *
FROM (SELECT 1 FROM DUAL -- fake-table 1: 1,2,3
UNION ALL
SELECT 2 FROM DUAL
UNION ALL
SELECT 3 FROM DUAL)
MINUS
SELECT *
FROM (SELECT 1 FROM DUAL -- fake-table 2: 1,3
UNION ALL
SELECT 3 FROM DUAL)
-- Result: 2