2013-08-01 2 views
0

Я очень смущен этой проблемой. Мы используем Oracle DB с хранимыми процедурами, которые вызывается из C#.Сравнить Дата с отметкой времени в оракуле 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. credited_on - тип столбца TIMESTAMP. Я вызываю эту процедуру из кода C# и использую C# типа DateTime для pi_to_date и pi_from_date. Не работает. Я не получаю никаких результатов, но в DB есть несколько записей. Я пробовал такие функции, как TO_DATE, TO_CHAR, но ничего не работает. Иногда я получаю ошибку:

SQL Error: ORA-00904: "APR": invalid identifier

Не могли бы вы помочь мне решить эту проблему, пожалуйста? Спасибо.

EDIT: Вот 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); 

В БД есть записи с датой 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; 
+0

Вы должны использовать правильно типизированные, параметризованные переменные вместо того, чтобы передавать даты как строки или динамически создавать инструкцию SQL, строя строки. Пожалуйста, покажите часть C# вашего кода. Пожалуйста, также покажите остальную часть sproc - по крайней мере, чтобы мы могли видеть, как создается и выполняется весь оператор. –

+0

Просьба показать вашу настройку вызова C# для этой процедуры и объявление процедуры. – OldProgrammer

ответ

0

Ваш динамический SQL рассматривает ваше значение даты в виде строки, и в зависимости от вашей машины, C# будет преобразовать дату в различных форматах строки (например, дд/мм/гггг, DD -MM-YYYY ..etc), поэтому вам нужно также указать это. Если вам нужно использовать D-SQL, то предложение where должно преобразовать значение даты, которое вы передаете в дату, используя TO_DATE и иметь тот же формат даты, на который вы конвертируете, в C#