如何使用过程和用户​​输入在PL / SQL中搜索日期

时间:2019-06-14 03:24:18

标签: sql oracle plsql

我收到一条错误消息,告诉我在尝试使用搜索和打印给定年份的记录时输入的数字无效。 我还需要在两个日期(例如2016年1月至2016年12月)之间打印记录,而且我不知道如何以相同的步骤进行打印。

我尝试将参数输入类型更改为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 个答案:

答案 0 :(得分:4)

如果您的列是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;`

这些不一定是经过优化的,但是您知道了

这更好。请注意,我在此处放了一些字符串以供显示。实际上,这些日期应该来自参数-重要-date1date2的时间部分没有

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;`