2011-07-31 30 views
0

何らかの形で、Oracleストアドプロシージャにパラメータを渡すだけで、パラメータを適切な型に変換できることがわかりました。さて、私はそれに対処する問題に取り組んでいます。私は "ORA-00900:無効なSQL文"を返してきました...私は文字列を渡そうとしているので、推測しています...それはとにかくどこかで読んだものです... "http: /www.dba-oracle.com/sf_ora_00900_invalid_sql_statement.htm "ODP.netを使用して無名パラメータをOracleに渡す

ストアドプロシージャにOracleパラメータを入力し、.net変数を使用してそのストアドプロシージャを実行する方法は何ですか? .net文字列をODPデータ型に変換する必要がありますか?私はないと思い...ここ

は、私のコードのgenerallはありません...

XmlAttribute xAttribute; 
     using (OracleConnection conn = new OracleConnection(ConfigurationManager.ConnectionStrings["ACODBConnectionString"].ConnectionString)) 
     { 

      using (OracleCommand cmd = new OracleCommand(sProc, conn)) 
      { 
       int i = 0; 
       foreach (string path in paths) 
       { 
        string OracleParam; 
        xAttribute = AcoXMLDoc.SelectSingleNode(string.Format("//dataTemplateSpecification/templates/template/elements/element[@name='{0}']", path)).Attributes["value"]; 
        if ((xAttribute.Value == null)) 
        { 
         OracleParam = ""; 
         cmd.Parameters.Add(colName[i], OracleParam); 
        } 
        else 
        { 
         OracleParam = xAttribute.Value; 
         cmd.Parameters.Add(colName[i], OracleParam); 
        } 
        i++; 
       } 
       conn.Open(); 
       outcome = cmd.ExecuteNonQuery(); 
      } 
     } 

は、あなたが見ることができるように、私は、XML文書から値を引っ張っていますので、自然に値があることを行っているものです文字列...適切なデータ型に文字列を変更する方法を理解しなければならない場合、$$をあまりにも吸うつもりです...

答えて

1

cmd.Parameters.Add()は、パラメータ(パラメータの値ではない)

これは実行可能ですが、いくつかの注意点がありますがeは、テストケースである:今のノートを取るために物事を

OracleConnection con = Connect(constr); 

    // Set the command 
    OracleCommand cmd = new OracleCommand("testProcParam", con); 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.BindByName = false; /*mark this false to bind by position*/ 

    string AA = "123456" ; 
    OracleParameter oparamAA = new OracleParameter() ; 
    oparamAA.Value = AA; 
    cmd.Parameters.Add(oparamAA); 

    string BB = "abcdefghijklmnopqrst" ; 
    OracleParameter oparamBB = new OracleParameter() ; 
    oparamBB.Value = BB;  
    cmd.Parameters.Add(oparamBB); 

    string CC = "01-AUG-11" ; /*we rely on the nls date parameter to 'cast' this*/ 
    OracleParameter oparamCC = new OracleParameter() ; 
    oparamCC.Value = CC;  
    cmd.Parameters.Add(oparamCC);  

    cmd.ExecuteNonQuery(); 

    con.Close(); 
    con.Dispose(); 

:.NETのビットのために今

create table testParam(aa number, bb varchar2(50) , cc date) 
/
create or replace procedure testProcParam(
        p_aa IN TESTPARAM.AA%TYPE , --usage of tableName.ColumnName%Type has this "scoped" to the table.column AA (here it is number) 
        p_BB IN TESTPARAM.BB%TYPE , --The usage of TYPE here has it defined as VARCHAR2 
        p_CC IN TESTPARAM.CC%TYPE --this is DATE 
) is 
BEGIN 
    INSERT INTO testParam (AA, BB, CC) VALUES(P_AA, P_BB, P_CC); 
END testProcParam ; 
/


は、Oracleビットを設定します。

  1. パラメータを作成し、それに "string"値を割り当てる方法に注目してください(http://download.oracle.com/docs/cd/B19306_01/win.102/b14307/OracleParameterClass.htm#i1011127)。コンストラクタパラメータが指定されていない場合(つまり、序数に依存している場合)、 "cmd.BindByName = false;"を指定する必要があります。
  2. 日付の
  3. 、NLSフォーマットはここに遊びに来て(あなたが日付形式などを変更した場合ので、あなたは、日付の問題に自分自身を開放している)

、あなたはあなたのデータを持っています:

SELECT * FROM testParam; 

AA      BB             CC       
---------------------- -------------------------------------------------- ------------------------- 
123456     abcdefghijklmnopqrst        01/08/11 00:00:00 

/* --now to clean up 
DROP procedure testProcParam ; 
DROP table testParam ; 
*/ 


EDIT

あなたのコメントごとに。使用時のPL/SQLのパラメータには、

tableNameがあります。ColumnName%Type

実際には、テーブルの列のデータ型にそのデータ型を結び付けているだけです(これによって列が変更され、パッケージが破損することはありません)。例えば

は私が提供:

    p_aa IN TESTPARAM.AA%TYPE , 
        p_BB IN TESTPARAM.BB%TYPE , 
        p_CC IN TESTPARAM.CC%TYPE 

    p_aa IN NUMBER, 
        p_BB IN VARCHAR2 , 
        p_CC IN DATE 

あなたは

+0

うわーで渡すことができます '匿名/ジェネリックデータ型' のわからないと同じです。今それは質問に対するマスターの完全な答えです...助けをありがとう。私が欠けていたのは、とりわけ、nameパラメータでバインドをfalseに設定していることです...私はそれをテストします。おそらく、今日の午後(今日は何トンものものを手に入れた)でしょう。 – SoftwareSavant

+0

@DmainEvent素晴らしいですが、何か問題が発生した場合は教えてください – Harrison

+0

ちょっと、私は苦労して正しいフォーマットに日付時刻を取得しています。あなたはそのことをどうお勧めしますか...私は文字列とDateTime.Parse(文字列 "DD-MM-YYYY")として日付を取得し、そのDateTimeを文字列に変換します。 – SoftwareSavant

関連する問題