2016-12-15 3 views
1

Здравствуйте, я пытаюсь выполнить следующую проблему и продолжать получать ошибки. Создайте пользовательскую функцию DOLLARS_BY_VEHICLE_TYPE, которая получает входной параметр конкатенированного марка и модели, а затем запрашивает таблицы VEHICLES и SALES_FACTS, чтобы вернуть общую валовую сумму продаж по этой комбинации. Мой код выглядит следующим образом:ORA-06575: находится в недопустимом состоянии

CREATE OR REPLACE FUNCTION DOLLARS_BY_VEHICLE_TYPE (V_AUTODESC VARCHAR2) 
RETURN VARCHAR2 
IS 
V_AMT VARCHAR2 (50); 
BEGIN 
SELECT NVL (SUM (GROSS_SALES_AMOUNT), 0) 
INTO V_AMT 
FROM VEHICLES v, SALES_FACTS s 
WHERE V.Vehicle_Code = S.Vehicle_Code AND V.DESCRIPTION= V_AUTODESC; 

RETURN V_AMT; 
EXCEPTION 
WHEN OTHERS 
THEN 
RETURN 0; 
END; 
/

Однако, когда я запускаю его я получаю:

Внимание: Функция создана с ошибками компиляции. ОШИБКА в строке 1: ORA-06575: пакет или функции DOLLARS_BY_VEHICLE_TYPE находится в нерабочем состоянии

+0

Возможный дубликат [Oracle 10G: ORA-06575: функция в нерабочем состоянии] (http://stackoverflow.com/questions/5210379/oracle-10g-ora-06575-function-in- invalid-state) –

+0

^Этот обман показывает полное устранение неполадок –

ответ

2

Пожалуйста, смотрите, что вы пытаетесь вернуть sum от вашей функции, и это может быть только number/int/float. Таким образом, возвращаемый тип вашей функции должен быть number не varchar2. Также обратите внимание, что вы используете устаревший синтаксис sql, который можно изменить. Смотрите ниже:

CREATE OR REPLACE FUNCTION DOLLARS_BY_VEHICLE_TYPE (V_AUTODESC VARCHAR2) 
    -- RETURN VARCHAR2 
    RETURN NUMBER 
IS 
    --V_AMT VARCHAR2 (50); 
    V_AMT NUMBER; 
BEGIN 
    SELECT NVL (SUM (GROSS_SALES_AMOUNT), 0) 
    INTO V_AMT 
    FROM VEHICLES v 
    inner join SALES_FACTS s 
    ON V.Vehicle_Code = S.Vehicle_Code 
    where V.DESCRIPTION = V_AUTODESC; 

    RETURN V_AMT; 
EXCEPTION 
    WHEN OTHERS 
    THEN 
     RETURN 0; 
END; 
/
Смежные вопросы