Oracle - Получение значения Select Count (*) из ... в качестве выходного параметра в System.Data.OracleClient - PullRequest
1 голос
/ 26 марта 2010

Привет всем,

У меня есть вопрос. Я пытаюсь построить параметризованный запрос, чтобы получить количество строк в таблице в Oracle. Скорее просто. Однако я новичок в Oracle ..

Я знаю, что в SQL Server вы можете сделать что-то вроде:

Select @outputVariable = count(*) from sometable where name = @SomeOtherVariable

и затем вы можете установить параметр Output в System.Data.SqlClient для получения @ outputVariable.

Считая, что это можно сделать и в Oracle, у меня следующий запрос

Select count(*) into :theCount from sometable where name = :SomeValue

Я настроил параметры своего оракула (используя System.Data.OracleClient - да, я знаю, что он устарел в .Net 4 - но сейчас я над этим работаю) следующим образом

IDbCommand command = new OracleCommand();
command.CommandText = "Select count(*) into :theCount from sometable where name = :SomeValue";
command.CommandType = CommandType.Text;

OracleParameter parameterTheCount = new OracleParameter(":theCount", OracleType.Number);
parameterTheCount .Direction = ParameterDirection.Output;
command.Parameters.Add(parameterTheCount );

OracleParameter parameterSomeValue = new OracleParameter(":SomeValue", OracleType.VarChar, 40);
parameterSomeValue .Direction = ParameterDirection.Input;
parameterSomeValue .Value = "TheValueToLookFor";
command.Parameters.Add(parameterSomeValue );
command.Connection = myconnectionObject;
command.ExecuteNonQuery();
int theCount = (int)parameterTheCount.Value;

В этот момент я надеялся, что счет будет в параметре parameterTheCount, к которому я могу легко получить доступ.

Я получаю сообщение об ошибке ora-01036, которое http://ora -01036.ora-code.com говорит мне проверить мою привязку в операторе sql. Я что-то напутал в операторе SQL? Я что-то упускаю в другом месте?

Я мог бы просто использовать command.ExecuteScaler (), так как я получаю только один элемент, и, вероятно, в конечном итоге буду использовать его, но в этот момент любопытство одолело меня. Что если бы у меня было два параметра, которые я хотел вернуть из своего запроса (то есть: выбрать max (ColA), min (ColB) в: max,: min .....)

Спасибо ..

Ответы [ 2 ]

2 голосов
/ 26 марта 2010

В некоторых версиях ADO не требуется двоеточие :, настройка OracleParameter.

Вместо:

new OracleParameter(":theCount", OracleType.Number);

1008 * попробовать *

new OracleParameter("theCount", OracleType.Number);

В любом случае, я думаю, что вы должны использовать ExecuteScalar() функцию IDbCommand и избегать использования into (что я не уверен, что это допустимо в этом контексте). Я имею в виду:

IDbCommand command = new OracleCommand(); 
command.CommandText = "Select count(*) from sometable where name = :SomeValue";
command.CommandType = CommandType.Text;

OracleParameter parameterSomeValue = new OracleParameter("SomeValue", OracleType.VarChar, 40);
parameterSomeValue .Direction = ParameterDirection.Input;
parameterSomeValue .Value = "TheValueToLookFor";
command.Parameters.Add(parameterSomeValue );
command.Connection = myconnectionObject;
int theCount = (int)command.ExecuteScalar();

Отказ от ответственности : код не был скомпилирован и может содержать небольшую ошибку.

Обновление : Если вы посмотрите на синтаксис Oracle SELECT , вы увидите, что предложение SELECT INTO не распознано. Но это верно в синтаксисе PLSQL, как вы можете видеть здесь . Вы можете попробовать одно из следующего, чтобы увидеть, работает ли оно (не проверено):

command.CommandText = "begin Select count(*) into :someCount from sometable where name = :SomeValue; end;";
0 голосов
/ 26 марта 2010

Я думаю, проблема в том, что у вас есть конечный пробел в имени параметра для parameterTheCount.

Редактировать

Теперь удалите двоеточия из имен параметров в конструкторе до OracleParameter.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...