2017-05-03 1 views
0

私は1日以上Oracleデータベースの呼び出しに苦労しています。 DBAは、次の私に与えることができたが、私は、プログラム的以外のデータベースにはアクセスできません:この問題を解決するには "PLS-00306:コールの引数またはタイプが間違っています..."

私のコードは次のようになり
desc appowner.member_data_package 

PROCEDURE UPDATE_NOTES_V001 
Argument Name     Type     In/Out Default? 
------------------------------ ----------------------- ------ -------- 
TAU_UID_IN      VARCHAR2    IN 
INCOMING_FUNC_IN    VARCHAR2    IN 
INCOMING_TEXT_IN    VARCHAR2    IN 
SYS_SOURCE_IN     VARCHAR2    IN 
USER_ID_IN      VARCHAR2    IN 
O_STATUS      VARCHAR2    OUT 

using (var connection = new OracleConnection(connectionString)) 
{ 
    connection.Open(); 

    OracleCommand command = new OracleCommand 
    { 
     Connection = connection, 
     CommandType = CommandType.StoredProcedure, 
     CommandText = "appowner.MEMBER_DATA_PACKAGE.UPDATE_NOTES_V001", 
     BindByName = true 
    }; 

    command.Parameters.Add(new OracleParameter("O_STATUS", OracleDbType.Varchar2, ParameterDirection.ReturnValue)); 
    command.Parameters.Add(new OracleParameter("TAU_UID_IN", OracleDbType.Varchar2, ParameterDirection.Input)).Value = "7400"; 
    command.Parameters.Add(new OracleParameter("INCOMING_FUNC_IN", OracleDbType.Varchar2, ParameterDirection.Input)).Value = "PROVCOUNT"; 
    command.Parameters.Add(new OracleParameter("INCOMING_TEXT_IN", OracleDbType.Varchar2, ParameterDirection.Input)).Value = "Pypestream testing."; 
    command.Parameters.Add(new OracleParameter("SYS_SOURCE_IN", OracleDbType.Varchar2, ParameterDirection.Input)).Value = "CRM"; 
    command.Parameters.Add(new OracleParameter("USER_ID_IN", OracleDbType.Varchar2, ParameterDirection.Input)).Value = "jac"; 

    command.ExecuteNonQuery(); 
    Console.WriteLine($"Insert output value is '{command.Parameters["O_STATUS"].Value.ToString()}'"); 

} 

私はこれを実行すると、私は取得エラー次のとおりです。

ORA-06550: line 1, column 15: 
PLS-00306: wrong number or types of arguments in call to 'UPDATE_NOTES_V001' 
ORA-06550: line 1, column 7: 
PL/SQL: Statement ignored 

私の知る限り、私はは、右引数の数と型を持っている伝えることができますが、ようであればOの方法で私よりも賢い誰かracle(基本的には誰でも)は、私が驚いたところを指摘することができます。

この部分が正しいと思われ、エラーがある種の赤ん坊である場合、他に何が見えますか?この手続きを呼び出す他の方法はありますか? Visual Studio 2017以外のツールはありません。便利な拡張機能はダウンロードできません。 DBAへの電子メール以外にデータベースに直接アクセスすることはできません。

私はここで完全に間違った指摘になるかもしれないと告白します。私は完全にOracleデータベースに値を挿入するコードを推測しています。これに取り組むためのアドバイスは参考になります。

+0

Oracleでパラメータを渡す場合は、Oracleストアド・プロシージャで宣言されている順序でパラメータを渡す必要があります。またはこの 'ParameterDirection.ReturnValue'を' ParameterDirection.OutPut'に変更しました。正確なSql文を表示できますか? – MethodMan

+0

返される値を割り当てるSQLと一緒に完全なプロシージャを表示できますか?戻り値はOracleの数値INT型であると期待します。INTは異なっていますが、1つは小数点以下10進数に変換されますが、もう1つはINTEGERです...これは実際に最後の夜のような問題を修正しました – MethodMan

+0

残念ながら私は表示できません手順。文字通り私が続けなければならないのは、私が上記で提供した内容です。 @MethodMan、私は、procはvarchar2以外の何かを返すだろうと思っていただろうが、descがどういう形であってもテキストではないようでない限り。 –

答えて

2

Oracleプロシージャの呼び出しは、呼び出されるプロシージャのパラメータの型および順序と一致する必要があります。また、値を返すパラメータはOutPutパラメータです。コードが呼び出されたプロシージャのパラメータと一致しないため、エラーが発生します。

using (var connection = new OracleConnection(connectionString)) 
{ 
connection.Open(); 

OracleCommand command = new OracleCommand 
{ 
    Connection = connection, 
    CommandType = CommandType.StoredProcedure, 
    CommandText = "appowner.MEMBER_DATA_PACKAGE.UPDATE_NOTES_V001", 
    BindByName = true 
}; 

command.Parameters.Add(new OracleParameter("TAU_UID_IN", OracleDbType.Varchar2, ParameterDirection.Input)).Value = "7400"; 
command.Parameters.Add(new OracleParameter("INCOMING_FUNC_IN", OracleDbType.Varchar2, ParameterDirection.Input)).Value = "PROVCOUNT"; 
command.Parameters.Add(new OracleParameter("INCOMING_TEXT_IN", OracleDbType.Varchar2, ParameterDirection.Input)).Value = "Pypestream testing."; 
command.Parameters.Add(new OracleParameter("SYS_SOURCE_IN", OracleDbType.Varchar2, ParameterDirection.Input)).Value = "CRM"; 
command.Parameters.Add(new OracleParameter("USER_ID_IN", OracleDbType.Varchar2, ParameterDirection.Input)).Value = "jac"; 
command.Parameters.Add(new OracleParameter("O_STATUS", OracleDbType.Varchar2, ParameterDirection.OutPut)); 

command.ExecuteNonQuery(); 
Console.WriteLine($"Insert output value is '{command.Parameters["O_STATUS"].Value.ToString()}'"); 

} 
+0

何らかの理由で、 "ReturnValue"が "OutPut"と同じであると私を打ち明けました。私は「BindByName」がそのようなものを覆すだろうと思ったので(私が正しい順序でそれらを配置すると名前が必要な理由がわからないため)、注文に関する心配はありませんでした。しかし、ここのヒントは私の問題を解決しました。 –

+0

'command.Parameters.Add'の名前部分では、その特定のパラメータを名前で呼び出すことができます。私が使用したものではありませんが、使用する必要がある場合はそこにあります。 –

関連する問題