Как исправить «Предупреждение: функция создана с ошибками компиляции»? - PullRequest
0 голосов
/ 21 апреля 2019

Есть две таблицы

Customer2 ( CUSTID , имя, отчество, адрес, возраст, ЗАРПЛАТА)

Order2 ( ORDERID , ORDERNAME, PRICE, CUSTID )

Основная проблема заключается в том, чтобы найти общее количество заказов, сделанных клиентом из местоположения

это функция plsql, которую я написал:

CREATE OR REPLACE FUNCTION totalCustomer (loc IN VARCHAR2) RETURN NUMBER IS
total number(2) := 0;
add CHAR := loc;
BEGIN
SELECT COUNT(*) FROM order2 WHERE cusid IN (SELECT cusid FROM customer2 WHERE address='add');
RETURN total;
END;
  /

и вот где я вызываю функцию:

DECLARE
p VARCHAR2(100);
BEGIN
p:= &p;
dbms_output.put_line (totalCustomer (p));
END;
/

Я получаю эту ошибку Warning: Function created with compilation errors.

и этот, пока я вызываю функцию

ERROR at line 5:
ORA-06550: line 5, column 23:
PLS-00905: object SYSTEM.TOTALCUSTOMER is invalid
ORA-06550: line 5, column 1:
PL/SQL: Statement ignored

1 Ответ

4 голосов
/ 21 апреля 2019

В вашей функции:

  • Вы написали cusid в своем запросе, но столбцы названы custid в таблицах.
  • Вы не помещаете результат запроса в переменную total. Ваша функция всегда будет возвращать 0 начальное значение, установленное для total.
  • Написав 'add', вы сравнили адрес с буквенной строкой «add», а не с содержимым переменной add.
  • Но копировать loc в add не нужно. Вы можете использовать loc напрямую.
  • Тип number(2) для total кажется немного маленьким. Лучше пойти с number(38) (integer) вместо.
  • Запрос лучше написать с внутренним объединением. IN с подзапросом часто не работает хорошо.
  • Вместо char тип loc должен быть типа address в customer2. Вы можете использовать customer2.address%TYPE здесь.

CREATE OR REPLACE FUNCTION totalcustomer (loc IN customer2.address%TYPE)
                           RETURN number
IS
total number(38) := 0;
BEGIN
  SELECT count(*) INTO total
         FROM order2 o
              INNER JOIN customer2 c
                         ON c.custid = o.custid
         WHERE address = loc;
  RETURN total;
END;
/

А в вашем анонимном блоке:

  • Вы объявили p как char, что означает char(1), т.е. p может содержать только один символ. Я не уверен, что это то, что вы хотите. Вы можете пойти с customer2.address%TYPE и здесь.

DECLARE
  p customer2.address%TYPE;
BEGIN
  p := &p;
  dbms_output.put_line(totalcustomer(p));
END;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...