I am using Oracle Data Access from .net and my query is as
command.CommandText = "select * from table1 where expirydate =:EXPIRYDATE";
command.Parameters.Add("EXPIRYDATE", OracleDbType.Date, DateTime.Today,ParameterDirection.Input);
var results = command.ExecuteScalar();
I get the following error " ORA-00932: inconsistent datatypes: expected DATE got NUMBER"
If I change my query to:
command.CommandText ="select * from table1 where expirydate =
to_date(:EXPIRYDATE,'DD/MM/YYYY')";
I get no results.
Thanks in advance.
To fix the error, specify a month value that is valid such as “January”. Some conversion is built-in, and a value of “Jan” is also valid for the Month format code.
Oracle stores dates in an internal numeric format representing the century, year, month, day, hours, minutes, seconds. The default date format is DD-MON-YY.
TO_CHAR (datetime) converts a datetime or interval value of DATE , TIMESTAMP , TIMESTAMP WITH TIME ZONE , or TIMESTAMP WITH LOCAL TIME ZONE datatype to a value of VARCHAR2 datatype in the format specified by the date format fmt .
ORA-00979 “ Not a GROUP BY expression ” is an error issued by the Oracle database when the SELECT statement contains a column that is neither listed in GROUP BY nor aggregated. This error message can be confusing to beginners. Practice your SQL basics with a lot of exercises in our interactive SQL Practice Set course!
Most likely reason for this error is that the order of the parameters in your query does not match the order you add them to the Parameters
collection. Oracle Data Access pretends to bind them by name, but actually binds them by order.
If you're using ODP.NET, OracleCommand should have a BindByName property which will force the command to bind parameters by their name instead of their order.
const string sql = @"select :parameter2, :parameter1 from dual";
using (var cmd = new OracleCommand(sql, conn))
using (cmd.Parameters.Add(":parameter1", "FOO"))
using (cmd.Parameters.Add(":parameter2", "BAR"))
using (var reader = cmd.ExecuteReader()) {
reader.Read();
// should print "FOOBAR"
Console.WriteLine("{0}{1}", reader.GetValue(0), reader.GetValue(1));
}
using (var cmd = new OracleCommand(sql, conn) { BindByName = true })
using (cmd.Parameters.Add(":parameter1", "FOO"))
using (cmd.Parameters.Add(":parameter2", "BAR"))
using (var reader = cmd.ExecuteReader()) {
reader.Read();
// should print "BARFOO"
Console.WriteLine("{0}{1}", reader.GetValue(0), reader.GetValue(1));
}
There is a slight performance penalty associated with this, but it's probably small enough to be negligible in most contexts.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With