С# вызов хранимой функции оракула

create or replace function ar_knyga_egzistuoja(
id number
)
return number
is
kiekis number;
begin
select count(*) into kiekis from knygos where kn_id  = id;
return kiekis;
end;

Код С#:

conn.Open();
OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
cmd.CommandText = "ar_knyga_egzistuoja";

cmd.CommandType = CommandType.StoredProcedure;
OdbcParameter param = new OdbcParameter();

cmd.Parameters.Add("id", OracleType.Number).Value = id;

cmd.ExecuteNonQuery();
var kiekis = Convert.ToString(cmd.Parameters["kiekis"].Value);

MessageBox.Show(kiekis);

cmd.Parameters.RemoveAt(0);

conn.Close();

Я получаю сообщение об ошибке:

PLS-00221: 'AR_KNYGA_EGZISTUOJA' is not a procedure or is undefined
ORA-06550: line 1, column 7:

Это не процедура, а функция, но я знаю, что эту функцию я могу вызывать как процедуры, что не так?


person Wizard    schedule 21.04.2014    source источник
comment
Я разместил код функции (1 параметр).   -  person Wizard    schedule 21.04.2014


Ответы (3)


Полученный код ORA-06550 означает, что функция была скомпилирована с неверными операторами и должна быть быть переписаны. Я не вижу ничего явно неправильного в коде, поэтому у вас могут быть проблемы, такие как разрешения или неправильные имена таблиц, и вам следует в первую очередь проверить, можете ли вы запустить функцию в редакторе PL/SQL. Затем, после того, как вы запустите это, попробуйте...

var cmd = new OracleCommand();

cmd.Connection = conn;
cmd.CommandText = "ar_knyga_egzistuoja";
cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.Add("id", id);
cmd.Parameters.Add("kiekis", OracleType.Number);
cmd.Parmeters["kiekis"].Direction = ParameterDirection.ReturnValue;

cmd.Connection.Open();
cmd.ExecuteNonQuery();

var kiekis = Convert.ToString(cmd.Parameters["kiekis"].Value);

MessageBox.Show(kiekis);
cmd.Connection.Close();

Это должно иметь возможность запускать функцию как хранимую процедуру, ожидая, что возвращаемое значение с именем kiekis типа number будет доступно для работы.

person gfish3000    schedule 21.04.2014
comment
@TomasLietuva, с удовольствием. - person gfish3000; 21.04.2014

вам нужно вызвать свою функцию как обычный оператор выбора, использовать «текстовый тип команды», а затем выполнить выберите оператор для вызова вашей функции и, наконец, используйте executeScalar для получения возвращаемого значения (которое, я думаю, является всего лишь одним значением)

это может быть что-то вроде этого:

conn.Open();
OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
cmd.CommandText = "select yourSchema.ar_knyga_egzistuoja(@id)";
cmd.CommandType = CommandType.Text;
OdbcParameter param = new OdbcParameter();
cmd.Parameters.Add("id", OracleType.Number).Value = id;
var result = cmd.ExecuteScalar();
MessageBox.Show(result);
cmd.Parameters.RemoveAt(0);
conn.Close();
person pedrommuller    schedule 21.04.2014
comment
Теперь я получаю ошибку: ORA-01036: illegal variable name/number - person Wizard; 21.04.2014
comment
измените yourSchema на ваше настоящее имя схемы - person pedrommuller; 21.04.2014
comment
Где найти schema в Oracle SQL Developer? Я думаю, что у меня нет схемы. - person Wizard; 21.04.2014
comment
хорошо удалите его и попробуйте только с select ar_knyga_egzistuoja(@id) или выберите database.ar_knyga_egzistuoja(@id), если вы не знаете свою текущую схему, попробуйте с этой ссылкой community.oracle.com/thread/495481?tstart=0 - person pedrommuller; 21.04.2014
comment
Спасибо @jack.the.ripper. Мне пришлось добавить «из двойного» к моей команде. - person Rake36; 19.07.2016

Я думаю, проблема в том, что ты вызываешь ExecuteNonQuery. Таким образом, он ожидает процедуру (не возвращающую значение). Если вы вызовете ExecuteScalar, он будет ожидать, что ar_knyga_egzistuoja будет функцией, каковой она и является.

person Patrick Hofman    schedule 21.04.2014
comment
Томас, посмотри здесь. Похоже такая же проблема. - person Patrick Hofman; 21.04.2014