Невозможно скомпилировать процедуру PL / SQL. Какие-либо предложения? - PullRequest
0 голосов
/ 07 мая 2020

Вы, ребята, знаете, в чем может быть проблема?

    Create or Replace FUNCTION Something ( v_sno IN Supplier.SNO%TYPE) RETURN NUMBER IS
    l_cnt NUMBER;   
    BEGIN
       Select city, count (*) into l_cnt
       From Supplier
       Group by city;
     return l_cnt;
  END;

/

Ответы [ 2 ]

0 голосов
/ 07 мая 2020

Насколько я понимаю,

  1. вы можете обрабатывать expception. Я предполагаю, что там есть ошибка too_many_rows.
  2. вы не использовали свой параметр «v_sno» в запросе .
  3. Я не уверен, что вы знаете, чего хотите. логически, если вы отправили поставщику номер функции, он всегда должен возвращать 1.

в любом случае, если вы хотите только компилировать. вот он.

CREATE OR replace FUNCTION Something (v_sno IN supplier.sno%TYPE) 
RETURN NUMBER 
IS 
  l_cnt NUMBER; 
BEGIN 
    SELECT Count (*) 
    INTO   l_cnt 
    FROM   supplier 
    WHERE  sno = v_sno; 

    RETURN l_cnt; 
EXCEPTION 
  WHEN OTHERS THEN 
             RETURN -1; -- there is some error. 
END; 
0 голосов
/ 07 мая 2020

Функция не имеет смысла, поскольку входной параметр никогда не используется. Решение для oracle / Mysql, приведенное ниже, может быть неподходящим, поскольку у меня нет вашей модели данных, но определенно направит вас в правильном направлении.

Если вы используете агрегацию с group by, это означает несколько возвращаются строки, и в этом случае ваш вывод будет набором записей, что потребует дополнительных изменений в функции, и решение во многом зависит от типа базы данных.

Если вы находитесь в базе данных Oracle, попробуйте ниже ,

Create or Replace FUNCTION Something ( v_sno IN Supplier.SNO%TYPE) RETURN NUMBER IS
  l_cnt NUMBER;   
  BEGIN
     Select count (*) into l_cnt
     From Supplier 
     WHERE SNO = v_sno;
   return l_cnt;
END;

Если вы на MYSQL, вы можете написать функцию, как показано ниже,

DELIMITER $$

CREATE FUNCTION Something(
    v_sno INT
) 
RETURNS INT
DETERMINISTIC
BEGIN
    DECLARE l_cnt INT;

    Select count (*) into l_cnt
    From Supplier 
    WHERE SNO = v_sno;

    RETURN (l_cnt);
END$$
DELIMITER;
...