我对这个问题很困惑。我们使用带有存储过程的 Oracle DB,这些是从 C# 调用的。
这是存储过程的问题部分:
IF pi_from_date IS NOT NULL THEN
where_part := where_part || 'and created_on >= ''' || pi_from_date || '''';
END IF;
IF pi_to_date IS NOT NULL THEN
where_part := where_part || 'and created_on <= ''' || pi_to_date || '''';
END IF;
pi_from_date 和 pi_to_date 是 DATE 的 IN 参数类型。credated_on 是 TIMESTAMP 的列类型。我从 C# 代码调用此过程,并将 C# 类型 DateTime 用于 pi_to_date 和 pi_from_date。它不工作。我没有得到任何结果,但在 DB 中有一些记录。我尝试了 TO_DATE、TO_CHAR 等函数,但没有任何效果。有时我会收到错误:
SQL 错误:ORA-00904:“APR”:标识符无效
你能帮我解决这个问题吗?谢谢。
编辑: 这是 C# 代码:
var parameters = new OracleDynamicParameters();
parameters.Add("pi_from_date", filterData.From); //DateTime.Now.AddMonths(-1);
parameters.Add("pi_to_date", filterData.To); //DateTime.Now.AddMonths(1);
var payments = conn.Query<Payment>("TEST_PCG.find_proc", parameters, commandType: commandType.StoredProcedure);
DB 中有日期为 1.8.2013 的记录。
存储过程:
PROCEDURE find_proc ( pi_from_date IN DATE,
pi_to_date IN DATE,
items_ret OUT sys_refcursor)
AS
stmt varchar2(32767);
where_part varchar2(32767);
BEGIN
-- select statement part
stmt := 'SELECT * FROM (SELECT a.*, rownum r__ FROM (SELECT * FROM Payment WHERE 1=1 ';
-- where statement part
IF pi_from_date IS NOT NULL THEN
where_part := where_part || 'and created_on >= ''' || pi_from_date || '''';
END IF;
IF pi_to_date IS NOT NULL THEN
where_part := where_part || 'and created_on <= ''' || pi_to_date || '''';
END IF;
stmt := stmt || where_part;
-- get ref cursor from query
OPEN items_ret FOR stmt;
END find_proc;