yoshikazu0110
@yoshikazu0110 (h y)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

C# Oracle Function 呼び出せない

解決したいこと

ここに解決したい内容を記載してください。
C# Oracle Function 呼び出せない問題の解決をしたいです。

呼出しプログラム

conn.Open();
command.ExecuteNonQuery();
は成功して、例外に引っかからないです。
けれどもFunctionが呼び出されません。
ただFunction実行されったぽい形跡がSQL実行履歴にあります。
image.png
ただ、戻り値などに値が何も設定されません。

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MySql.Data.MySqlClient;
using Oracle.ManagedDataAccess.Client;

namespace PlayGround1
{
    class Program
    {
        static void Main(string[] args)
        {
            string connStr = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";

            try
            {
                //コネクションを生成する
                using (OracleConnection conn = new OracleConnection())
                {
                    //コネクションを取得する
                    conn.ConnectionString = connStr;
                    conn.Open();

                    //コマンドを生成する
                    using (OracleCommand command = new OracleCommand())
                    {
                        //コネクションを設定
                        command.Connection = conn;

                        //コマンドタイプに「ストアド」を設定
                        command.CommandType = CommandType.StoredProcedure;

                        //ストアド名を設定
                        command.CommandText = "GET_MSG_DESC";

                        var in1 = command.Parameters.Add("inMSG_NO", OracleDbType.Int32, 5, ParameterDirection.Input).Value = 1;
                        var ret = command.Parameters.Add("ret", OracleDbType.Char, ParameterDirection.ReturnValue);

                        //ストアドを実行する
                        command.ExecuteNonQuery();

                        string retStr = ret.Value.ToString();
                    }
                    //コネクションを切断する
                    conn.Close();

                    //コネクションを破棄する
                    conn.Dispose();
                }
            }
            catch (Exception ex)
            {
                //エラー時はエラー内容をコンソールに出力する
                Console.WriteLine(ex);
            }
        }
    }
}

呼出すファンクション定義

GET_MSG_DESC
  ( inMSG_NO     IN  NUMBER
  ) RETURN CHAR   IS
  
  MSGDESC     T_MSG_MS.MSG%TYPE;  
  BEGIN
    SELECT  
      MSG       INTO  MSGDESC
    FROM  
      T_MSG_MS
    WHERE  
      MSG_NO    =  inMSG_NO
    RETURN(MSGDESC);
    
  EXCEPTION
      WHEN OTHERS THEN
        RETURN(TO_CHAR(inMSG_NO));
    
END GET_MSG_DESC;

例)

def greet
  puts Hello World
end

環境

・EDI
image.png

・Oracleクライアント
image.png

・OracleServer
image.png

0

1Answer

var ret = command.Parameters.Add("ret", OracleDbType.Char, ParameterDirection.ReturnValue);
Addの戻り値ではなく、
command.ExecuteNonQuery();
の後に、
cmd.Parameters["ret"].Value
にストアドの戻り値が入ってませんでしょうか?

1Like

Comments

  1. @yoshikazu0110

    Questioner

    回答ありがとうございます!
    comannd.Parameter の定義順に問題がありました^^;

    ExecuteNonQuery
    BEGEN :ret := GET_MSG_DESC( :v1 ); END;
    こんなSQL生成されるみたいでこの順番で定義しないといけないみたいでした。


    以下の順番入れ換えでうまく動きました!
    var in1 = command.Parameters.Add("inMSG_NO", OracleDbType.Int32, 5, ParameterDirection.Input).Value = 1;
    var ret = command.Parameters.Add("ret", OracleDbType.Char, ParameterDirection.ReturnValue);
  2. 見当違いの回答だったみたいですね!すみません!
    自己解決したようで何よりです!

Your answer might help someone💌