2016-05-03 1 views
0

Используя модуль npgsql с Microsoft .Net, как получить возвращаемое значение функции PostgreSQL? Не значение именованного параметра или курсора ref, но значение RETURNed single string/number?Как получить возвращаемое значение из функции PG/SQL с помощью npgsql

спасибо!

Martin

+0

Обратите внимание, что функции PostgreSQL не могут быть «выполнены», как хранимые процедуры в MySQL или SQLServer. Функция в PostgreSQL всегда должна быть выбрана, например. 'select myfunction ('foo', 'bar')' –

ответ

0

Таким образом, я имел функцию PL/PgSQL объявленную следующим образом (я использую EnterpriseDB [версия 9.5], я не уверен, что это будет действительно в ванильным PostgreSQL):

FUNCTION f_auth_user (p_user_name   IN  VARCHAR2, 
        p_user_pwd   IN  VARCHAR2, 
        p_security_user_seq  OUT NUMBER, 
        p_login_key    OUT VARCHAR2, 
        p_psn_id     OUT NUMBER, 
        p_message    OUT VARCHAR2) 
    RETURN NUMBER; 

Dotnet код, который назвал это выглядит следующим образом:

  EDBCommand cmd = new EDBCommand("smcs.pkg_login.f_auth_user(:p_user_name, :p_user_pwd, :p_security_user_seq, :p_login_key, :p_psn_id, :p_message)", conn); 
      cmd.CommandType = CommandType.StoredProcedure; 
      cmd.Parameters.Add("p_return_value", EDBTypes.EDBDbType.Integer, 256).Direction = ParameterDirection.ReturnValue; 
      cmd.Parameters.Add("p_user_name", EDBTypes.EDBDbType.Varchar2, 256).Value = txtUserName.Text.Trim().ToUpper(); 
      cmd.Parameters.Add("p_user_pwd", EDBTypes.EDBDbType.Varchar2, 256).Value = txtPassword.Text.Trim().ToUpper(); 
      cmd.Parameters.Add("p_security_user_seq", EDBTypes.EDBDbType.Integer, 256).Direction = ParameterDirection.Output; 
      cmd.Parameters.Add("p_login_key", EDBTypes.EDBDbType.Varchar2, 256).Direction = ParameterDirection.Output; 
      cmd.Parameters.Add("p_psn_id", EDBTypes.EDBDbType.Integer, 256).Direction = ParameterDirection.Output; 
      cmd.Parameters.Add("p_message", EDBTypes.EDBDbType.Varchar2, 256).Direction = ParameterDirection.Output; 

Этот общий подход работал с Oracle, но это, кажется, что мне нужно переместить код, добавив параметр для Ретур п значение к концу списка параметров, поэтому моему рабочему коду, как это:

  cmd.Parameters.Add("p_user_name", EDBTypes.EDBDbType.Varchar2, 256).Value = txtUserName.Text.Trim().ToUpper(); 
      cmd.Parameters.Add("p_user_pwd", EDBTypes.EDBDbType.Varchar2, 256).Value = txtPassword.Text.Trim().ToUpper(); 
      cmd.Parameters.Add("p_security_user_seq", EDBTypes.EDBDbType.Integer, 256).Direction = ParameterDirection.Output; 
      cmd.Parameters.Add("p_login_key", EDBTypes.EDBDbType.Varchar2, 256).Direction = ParameterDirection.Output; 
      cmd.Parameters.Add("p_psn_id", EDBTypes.EDBDbType.Integer, 256).Direction = ParameterDirection.Output; 
      cmd.Parameters.Add("p_message", EDBTypes.EDBDbType.Varchar2, 256).Direction = ParameterDirection.Output; 

      returnParam = new EDBParameter("p_return_value", EDBTypes.EDBDbType.Integer); 
      returnParam.Direction = ParameterDirection.ReturnValue; 
      cmd.Parameters.Add(returnParam); 

Весьма вероятно, что я мог бы конденсироваться созданием и использование параметра p_return_value в 2 или 1 заявление, я гавань Я еще не пытался это сделать.

Затем я могу выполнить и получить результаты (включая возвращаемое значение), как это:

  conn.Open(); 
      cmd.Prepare(); 
      cmd.ExecuteNonQuery(); 
      sequence = Convert.ToInt32(cmd.Parameters["p_security_user_seq"].Value.ToString()); 
      loginKey = Convert.ToString(cmd.Parameters["p_login_key"].Value.ToString()); 
      message = Convert.ToString(cmd.Parameters["p_message"].Value.ToString()); 
      authenticatedUser = Convert.ToString(cmd.Parameters["p_return_value"].Value.ToString()); 
      conn.Close(); 

Спасибо!

Martin