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

标签 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.

最佳答案

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

关于sql - 如何使用过程和用户​​输入在 PL/SQL 中搜索日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56590991/

相关文章:

c# - 如何在运行时解析 SQL Server 的文件路径

c# - SQL 查询到 C# 中的标量结果

sql - Oracle子查询与Join - 如何引用子查询列?

sql - Oracle PL/SQL 字符串比较问题

sql - 如何打印导致ORA-01843错误的记录?

SQL Server 查询以查找从城市 A 到城市 B 的所有路线并进行转移

PHP 语法(如果或)

oracle - 为什么包含带有绑定(bind)变量的错误 PL/SQL block 的 dbms_sql.parse 会意外成功?

oracle - 如何从 Oracle 获取数据并将其发送到 statsd 或直接发送到 InfluxDB?

java - 将 VARRAY 与 JDBC 和 PL/SQL 存储过程一起使用的新手简单示例