我很困惑,从这个问题。我们使用带有存储过程的Oracle DB,这些都是从C#调用的。比较日期与Oracle 11g存储过程中的时间戳
这是存储程序的问题部分:
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的。 credated_on是TIMESTAMP的列类型。我从C#代码调用此过程,并使用C#类型DateTime获取pi_to_date和pi_from_date。 它不工作。我没有得到任何结果,但在DB中有一些记录。我尝试了TO_DATE,TO_CHAR等函数,但没有任何工作。有时候,我得到错误:
SQL Error: ORA-00904: "APR": invalid identifier
你能帮助我如何解决这个问题,好吗? 谢谢。
编辑: 这里是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与日期2013年8月1日的记录。
存储过程:
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;
您应该使用类型正确,parameratized变量相同的日期格式而不是将日期作为字符串传递,或者通过构建字符串来动态创建SQL语句。请显示您的代码的C#部分。还请显示其余的sproc - 至少我们可以看到整个语句是如何构建和执行的。 –
请将您的C#调用设置显示给此过程以及过程声明。 – OldProgrammer