используя операцию «минус», чтобы определить, выполнено ли условие - PullRequest
0 голосов
/ 13 мая 2018

хорошо, поэтому я пытаюсь использовать pl / sql, чтобы выяснить, есть ли значение или нет значения.Я знаю, что мне, вероятно, придется использовать «count», но не уверен, как и где именно.это то, что у меня есть до сих пор ...

CREATE OR REPLACE PROCEDURE Validate_Prereq_Met
AS
(
    p_snum      IN Enrollments.snum%TYPE,
    p_callnum   IN Enrollments.Callnum%TYPE
)
    v_pcnum   VARCHAR2;
    v_cnum    VARCHAR2;
BEGIN
    --classes needed minus classes taken
    SELECT pcnum AS v_pcnum
      FROM prereq
     WHERE cnum IN (SELECT cnum
                      FROM schclasses
                     WHERE callnum = p_callnum)
    MINUS
    SELECT cnum AS v_cnum
      FROM enrollments, schclasses
     WHERE enrollments.callnum = schclasses.callnum AND snum = p_snum;
END;

Мне нужно, чтобы это ничего не возвращало (означало, что требования выполнены) или возвращало значение (означало, что требования не выполнялись).

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

У вас есть две маленькие опечатки:

"Как" за параметрами.Заменяет «объявлений» 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
0 голосов
/ 13 мая 2018

Как насчет одного запроса, используя NOT EXISTS

SELECT pcnum
FROM
   prereq p,
   schclasses schclasses
WHERE p.cnum = s.cnum
 AND s.callnum = p_callnum
 AND NOT EXISTS
 (
    SELECT 'X' from enrollments e
    WHERE e.callnum = s.callnum
    AND e.snum = p_snum
 )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...