Передача анонимных параметров в Oracle с использованием ODP.net - PullRequest
0 голосов
/ 31 июля 2011

Так или иначе, я узнал, что я могу просто передать параметры в хранимый процесс Oracle, и он сможет преобразовать параметры в соответствующий тип.Ну, я сталкиваюсь с проблемами, связанными с этимМне возвращается сообщение «ORA-00900: неверный оператор SQL» ... Я предполагаю, что это потому, что я пытаюсь передать строки ... Это то, что я все равно где-то читал ... "http://www.dba -oracle.com/sf_ora_00900_invalid_sql_statement.htm"

Каков метод ввода параметров Oracle в хранимый процесс, а затем выполнение этого хранимого процесса с использованием переменных .net?Придется ли мне преобразовывать строки .net в типы данных ODP?Я надеюсь, что нет ...

Вот что делает мой генератор кода ...

    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 Ответ

1 голос
/ 01 августа 2011

cmd.Parameters.Add () ожидает объект, который является параметром (не значением параметра)

, так что это выполнимо, с несколькими оговорками, но вот тестовый пример:


установите бит Oracle:

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 ;
/

теперь для бита .net:

  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();   

Теперь стоит обратить внимание:

  1. Обратите внимание, как я создаю параметр и присваиваю ему значение "string" (http://download.oracle.com/docs/cd/B19306_01/win.102/b14307/OracleParameterClass.htm#i1011127 вы увидите, что конструкторы не имеют dbtype или вы должны явно указать это, это обходит это)
  2. если параметры не названы (т.е. вы полагаетесь на порядковый номер), вы должны "cmd.BindByName = false;"
  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 ;
*/


РЕДАКТИРОВАТЬ

За ваш комментарий;в параметрах в 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

Не уверен в «анонимном / родовом типе данных», который вы можете передать в

...