当我尝试使用我制定的程序来搜索和打印给定年份的记录时,我收到一条错误消息,告诉我输入的数字无效。 我还需要打印两个日期之间的记录(例如 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.
最佳答案
如果您的列是日期
,则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;`
关于sql - 如何使用过程和用户输入在 PL/SQL 中搜索日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56590991/