Как использовать процедуру и пользовательский ввод для поиска даты в PL / SQL - PullRequest
2 голосов
/ 14 июня 2019

Я получаю сообщение об ошибке, в котором говорится, что я ввожу недопустимый номер, когда пытаюсь использовать процедуру, которую я сделал, для поиска и печати записей за определенный год. Мне также нужно распечатать записи между двумя датами (например, с января 2016 года по декабрь 2016 года), и я не знаю, как это сделать в той же процедуре.

Я пытался изменить тип ввода параметра на VARCHAR и DATE, но они, похоже, тоже не работают

/*Procedure to search for sales by year*/
CREATE OR REPLACE PROCEDURE SalesReport(
    search_year IN NUMBER
)
IS
     -- Declare Cursor
    CURSOR year_search_cursor IS
        SELECT sp_invoice, sp_datesold, sp_saleprice, sp_addncost, sp_deposit, sp_total, sp_id, c_id, v_regno
        FROM sales_purchases
        WHERE sp_datesold LIKE '%' + search_year;
    -- Declare ROW record pointer
    sp_year_row year_search_cursor%ROWTYPE;
    rec_output  VARCHAR2(200); -- Output String 

BEGIN
    -- Column Headers
    DBMS_OUTPUT.PUT_LINE('Invoice_No,'||'Date sold,'||'Sale Price $,'||'AddnCost,'||'Deposit,'||'Total,'||'SP_ID,'||'C_ID,'||'V_RegNo');
    -- Fetching data from cursor into variables
    FOR sp_year_row IN year_search_cursor LOOP
        rec_output:=
            sp_year_row.sp_invoice||','||
            sp_year_row.sp_datesold||','||
            sp_year_row.sp_saleprice||','||
            sp_year_row.sp_addncost||','||
            sp_year_row.sp_deposit||','||
            sp_year_row.sp_total||','||
            sp_year_row.sp_id||','||
            sp_year_row.c_id||','||
            sp_year_row.v_regno;        
        DBMS_OUTPUT.PUT_LINE(rec_output);
    END LOOP;
END;
/


-- Get Input from User
ACCEPT search_year NUMBER PROMPT 'Enter search year: ';

-- Call the UPDATE_INV_SP Procedure and check stock amount status of item
EXECUTE SalesReport(&search_year);

Прямо сейчас, когда я пытаюсь запустить процедуру, используя 'EXECUTE SalesReport (& search_year);' Я просто получаю следующее сообщение об ошибке

Error starting at line : 1 in command -
BEGIN SalesReport(2015); END;
Error report -
ORA-01722: invalid number
ORA-06512: at "19421463.SALESREPORT", line 18
ORA-06512: at line 1
01722. 00000 -  "invalid number"
*Cause:    The specified number was invalid.
*Action:   Specify a valid number.

1 Ответ

4 голосов
/ 14 июня 2019

Если ваш столбец date, LIKE не будет работать. Вы должны получить год от этого

`WHERE EXTRACT(YEAR FROM sp_datesold)  = search_year;`

или

`WHERE To_Char(sp_datesold, 'YYYY')  = search_year;`

Для поиска диапазона вы можете использовать BETWEEN

`WHERE To_Char(sp_datesold, 'YYYY')  BETWEEN v_year1 and v_year2;`

Они не обязательно оптимизированы, но вы понимаете,

Это лучше. Обратите внимание, я положил строки только для галочки В действительности это должны быть даты, полученные из параметров - важно - без временной части для date1 и date2

Date1 date := to_date('01/01/2016', 'MM/DD/YYYY');
Date2 date := to_date('12/31/2016', 'MM/DD/YYYY') + 1;
`WHERE sp_datesold >= date1 AND sp_datesold < date2;`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...