我收到一条错误消息,告诉我在尝试使用搜索和打印给定年份的记录时输入的数字无效。 我还需要在两个日期(例如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.
答案 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;`
这些不一定是经过优化的,但是您知道了
这更好。请注意,我在此处放了一些字符串以供显示。实际上,这些日期应该来自参数-重要-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;`