#c# #oracle #plsql
#c# #Oracle #plsql
Вопрос:
Моя процедура объявлена здесь :
create or replace
PACKAGE MYPKG
IS
PROCEDURE MYPROCEDURE(
sNom IN VARCHAR2,
sValeur OUT VARCHAR2,
sCommentaire OUT VARCHAR2,
sRetour OUT VARCHAR2,
sMsgRetour OUT VARCHAR2);
END;
Выполнение в порядке с SQL Developer.
Я пытаюсь выполнить эту процедуру на C# :
OracleCommand cmd = new OracleCommand("MYPKG.MYPROCEDURE", OraCon);
cmd.CommandType = CommandType.StoredProcedure;
OracleParameter name = new OracleParameter("sNom", OracleType.VarChar);
name.Value = "CG";
cmd.Parameters.Add(name);
OracleParameter valeur = new OracleParameter("sValeur", OracleType.VarChar);
cmd.Parameters.Add(valeur);
OracleParameter commentaire = new OracleParameter("sCommentaire", OracleType.VarChar);
cmd.Parameters.Add(commentaire);
OracleParameter retour = new OracleParameter("sRetour", OracleType.VarChar);
cmd.Parameters.Add(retour);
OracleParameter msgRetour = new OracleParameter("sMsgRetour", OracleType.VarChar);
cmd.Parameters.Add(msgRetour);
using (OracleDataReader row = cmd.ExecuteReader())
{
while (row.Read())
{
Console.WriteLine(row.GetValue(0));
}
}
У меня ошибка «Неправильный параметр».
Как выполнить процедуру PL / SQL?
Ответ №1:
Вот как я бы подошел к этому.
ПРИМЕЧАНИЕ: Я скомпилировал этот код, но я не тестировал его в базе данных, хотя у меня есть много похожего кода, который отлично работает.
Также обратите внимание: вы не получаете обратно коллекцию, поэтому вам действительно следует использовать OraCmd.Выполняйте onquery вместо OraCmd.ExecuteReader
using System.Configuration;
using System.Data;
using Oracle.DataAccess.Client;
namespace Testing
{
public class OracleCommandTest
{
string m_strConnectionsString = string.Empty;
//Constructor
public OracleCommandTest()
{
//Get the connection string from the app.config
m_strConnectionsString = ConfigurationManager.ConnectionStrings["ConnectionStringName"].ConnectionString;
//if it is a web app, then use this call instead
//m_strConnectionsString = WebConfigurationManager.ConnectionStrings["ConnectionStringName"].ConnectionString;
}
public void getData(string sNom, out string sValeur, out string sCommentaire, out string sRetour, out string sMsgRetour)
{
OracleConnection ora_conn = new OracleConnection(m_strConnectionsString);
try
{
ora_conn.Open();
/*********************Oracle Command**********************************************************************/
OracleCommand ora_cmd = new OracleCommand("MYPKG.MYPROCEDURE", ora_conn);
ora_cmd.BindByName = true;
ora_cmd.CommandType = CommandType.StoredProcedure;
ora_cmd.Parameters.Add("sNom", OracleDbType.Varchar2, sNom, ParameterDirection.Input);
ora_cmd.Parameters.Add("sValeur", OracleDbType.Varchar2, ParameterDirection.Output);
ora_cmd.Parameters.Add("sCommentaire", OracleDbType.Varchar2, ParameterDirection.Output);
ora_cmd.Parameters.Add("sRetour", OracleDbType.Varchar2, ParameterDirection.Output);
ora_cmd.Parameters.Add("sMsgRetour", OracleDbType.Varchar2, ParameterDirection.Output);
/*********************Oracle Command**********************************************************************/
ora_cmd.ExecuteNonQuery();
//Now get the values output by the stored procedure
sValeur = ora_cmd.Parameters["sValeur"].Value.ToString();
sCommentaire = ora_cmd.Parameters["sCommentaire"].Value.ToString();
sRetour = ora_cmd.Parameters["sRetour"].Value.ToString();
sMsgRetour = ora_cmd.Parameters["sMsgRetour"].Value.ToString();
}
//catch (Exception ex)
//{
// WebErrorHandling.WriteToEventLog("PRVEquipment_DAL.getPRVEquipment", ex);
//}
finally
{
if (ora_conn.State == ConnectionState.Open)
{
ora_conn.Close();
}
}
}
}
}
Надеюсь, это поможет
Харви Сатер
Ответ №2:
Вы забыли установить Direction
для параметров.
Вы должны установить ParameterDirection.Output
, поскольку вы ожидаете, что значения будут возвращены из хранимой процедуры, иначе она по умолчанию считается входным параметром, и поэтому ошибка
Комментарии:
1. Спасибо, это часть проблемы (см. другое обсуждение).
Ответ №3:
Используйте OracleType
перечисление для типов параметров. Больше информации здесь
Также вы должны установить Direction
из параметров.
Пример
Комментарии:
1. Я задаю направление. Теперь ошибка: ORA-06502: PL / SQL: ошибка числового значения: ошибка преобразования символа в число ORA-06512: в строке 1, но я установил DbType.String, неверный тип?
2. Та же ошибка, когда я заменяю DbType.String на OracleType.VarChar .
3. Последние проблемы возникают из-за того, что я должен присвоить свойству Size значение OracleParameter. Спасибо за вас или помощь.