Как выполнить функцию с помощью приложения Oracle C # для Windows

Нужна помощь! Я новичок в выполнении функции в пакете хранимых процедур, мне нужно выполнить этот пакет с помощью приложения oracle C # для Windows ..

 CREATE OR REPLACE PACKAGE TSCBE1005_PKG IS

FUNCTION TSCBE1005_001_FNC( P_BLD_LVL_CD         IN VARCHAR2,
                            P_IN_DATE            IN VARCHAR2,
                            P_IN_PC              IN VARCHAR2,
                            P_BLD_SPEC_NO        IN OUT VARCHAR2,
                            P_BLD_SPEC_NO_SEQ    IN OUT NUMBER,
                            P_ART_NO             IN OUT VARCHAR2`,
                            P_CURE_KIBN          IN OUT VARCHAR2,
                            P_CURE_LR_KBN        IN OUT VARCHAR2,
                            P_HINMEI             IN OUT VARCHAR2,
                            P_TIRE_SIZE          IN OUT VARCHAR2,
                            P_E4_MARK            IN OUT NUMBER,
                            P_SECTOR_NO          IN OUT VARCHAR2,
                            P_UPLATE_NO          IN OUT VARCHAR2,
                            P_LPLATE_NO          IN OUT VARCHAR2,
                            P_BLADER_NO          IN OUT VARCHAR2,
                            P_MAX_TCLC_SINGLE    IN OUT NUMBER,
                            P_TCLC_UNIT_SINGLE   IN OUT VARCHAR2,
                            P_MAX_IP_SINGLE      IN OUT NUMBER,
                            P_IP_UNIT_SINGLE     IN OUT VARCHAR2,
                            P_PR                 IN OUT NUMBER,
                            P_MSG                IN OUT VARCHAR2
                            ) RETURN NUMBER;

PROCEDURE TSCBE1005_002_PRC( P_RET_DATA           IN NUMBER,
                             P_INFO1              IN VARCHAR2,
                             P_INFO2              IN VARCHAR2,
                             P_IN_PC              IN VARCHAR2
                             ) ;
END TSCBE1005_PKG;

Когда я запускаю его в Oracle, используя приведенный ниже сценарий, он действительно успешен.

variable O_BLD_SPEC_NO        VARCHAR2(7)
variable O_BLD_SPEC_NO_SEQ    NUMBER
variable O_ART_NO             VARCHAR2(5)
variable O_CURE_KIBN          VARCHAR2(4)
variable O_CURE_LR_KBN        VARCHAR2(1)
variable O_HINMEI             VARCHAR2(50)
variable O_TIRE_SIZE          VARCHAR2(20)
variable O_E4_MARK            NUMBER
variable O_SECTOR_NO          VARCHAR2(6)
variable O_UPLATE_NO          VARCHAR2(6)
variable O_LPLATE_NO          VARCHAR2(6)
variable O_BLADER_NO          VARCHAR2(7)
variable O_MAX_TCLC_SINGLE    NUMBER
variable O_TCLC_UNIT_SINGLE   VARCHAR2(3)
variable O_MAX_IO_SINGLE      NUMBER
variable O_IO_UNIT_SINGLE     VARCHAR2(3)
variable O_PR                 NUMBER
variable O_MSG                VARCHAR2(20)
variable ret                  varchar2(100)

execute :ret := TSCBE1005_PKG.TSCBE1005_001_FNC('R123456789','20170124120644','YRC07400',:O_BLD_SPEC_NO,:O_BLD_SPEC_NO_SEQ,:O_ART_NO,:O_CURE_KIBN,:O_CURE_LR_KBN,:O_HINMEI,:O_TIRE_SIZE,:O_E4_MARK,:O_SECTOR_NO,:O_UPLATE_NO,:O_LPLATE_NO,:O_BLADER_NO,:O_MAX_TCLC_SINGLE,:O_TCLC_UNIT_SINGLE,:O_MAX_IO_SINGLE,:O_IO_UNIT_SINGLE,:O_PR,:O_MSG)
;
print O_BLD_SPEC_NO      
print O_BLD_SPEC_NO_SEQ  
print O_ART_NO           
print O_CURE_KIBN        
print O_CURE_LR_KBN      
print O_HINMEI           
print O_TIRE_SIZE        
print O_E4_MARK          
print O_SECTOR_NO        
print O_UPLATE_NO        
print O_LPLATE_NO        
print O_BLADER_NO        
print O_MAX_TCLC_SINGLE  
print O_TCLC_UNIT_SINGLE 
print O_MAX_IO_SINGLE    
print O_IO_UNIT_SINGLE   
print O_PR               
print O_MSG              
print ret                

Я попытался выполнить это в оракуле С #, используя приведенный ниже код,

        using (OracleConnection objConn = new OracleConnection("User    id=skraze; Password=skraze; Data source=database"))
        {
            objConn.Open();

            OracleCommand objCmd = new OracleCommand();
            objCmd.Connection = objConn;
            objCmd.CommandText = "TSCBE1005_PKG.TSCBE1005_001_FNC";
            objCmd.CommandType = CommandType.StoredProcedure;

            OracleParameter P_BLD_LVL_CD = new OracleParameter();
            P_BLD_LVL_CD.ParameterName = ":P_BLD_LVL_CD";
            P_BLD_LVL_CD.OracleType = OracleType.VarChar;
            P_BLD_LVL_CD.Direction = ParameterDirection.Input;
            P_BLD_LVL_CD.Value = "R123456789";
            objCmd.Parameters.Add(P_BLD_LVL_CD);

            OracleParameter P_IN_DATE = new OracleParameter();
            P_IN_DATE.ParameterName = ":P_IN_DATE";
            P_IN_DATE.OracleType = OracleType.VarChar;
            P_IN_DATE.Direction = ParameterDirection.Input;
            P_IN_DATE.Value = "20170124120644";
            objCmd.Parameters.Add(P_IN_DATE);


            OracleParameter P_IN_PC = new OracleParameter();
            P_IN_PC.ParameterName = ":P_IN_PC";
            P_IN_PC.OracleType = OracleType.VarChar;
            P_IN_PC.Direction = ParameterDirection.Input;
            P_IN_PC.Value = "YRC07400";
            objCmd.Parameters.Add(P_IN_PC);

            OracleParameter P_BLD_SPEC_NO = new OracleParameter();
            P_BLD_SPEC_NO.ParameterName = ":P_BLD_SPEC_NO";
            P_BLD_SPEC_NO.OracleType = OracleType.VarChar;
            P_BLD_SPEC_NO.Direction = ParameterDirection.Input;
            objCmd.Parameters.Add(P_BLD_SPEC_NO);

            OracleParameter P_BLD_SPEC_NO_SEQ = new OracleParameter();
            P_BLD_SPEC_NO_SEQ.ParameterName = ":P_BLD_SPEC_NO_SEQ";
            P_BLD_SPEC_NO_SEQ.OracleType = OracleType.Number;
            P_BLD_SPEC_NO_SEQ.Direction = ParameterDirection.Input;
            objCmd.Parameters.Add(P_BLD_SPEC_NO_SEQ);

            OracleParameter P_ART_NO = new OracleParameter();
            P_ART_NO.ParameterName = ":P_ART_NO";
            P_ART_NO.OracleType = OracleType.VarChar;
            P_ART_NO.Direction = ParameterDirection.Input;
            objCmd.Parameters.Add(P_ART_NO);

            OracleParameter P_CURE_KIBN = new OracleParameter();
            P_CURE_KIBN.ParameterName = ":P_CURE_KIBN";
            P_CURE_KIBN.OracleType = OracleType.VarChar;
            P_CURE_KIBN.Direction = ParameterDirection.Input;
            objCmd.Parameters.Add(P_CURE_KIBN);

            OracleParameter P_CURE_LR_KBN = new OracleParameter();
            P_CURE_LR_KBN.ParameterName = ":P_CURE_LR_KBN";
            P_CURE_LR_KBN.OracleType = OracleType.VarChar;
            P_CURE_LR_KBN.Direction = ParameterDirection.Input;
            objCmd.Parameters.Add(P_CURE_LR_KBN);

            OracleParameter P_HINMEI = new OracleParameter();
            P_HINMEI.ParameterName = ":P_HINMEI";
            P_HINMEI.OracleType = OracleType.VarChar;
            P_HINMEI.Direction = ParameterDirection.Input;
            objCmd.Parameters.Add(P_HINMEI);


            OracleParameter P_TIRE_SIZE = new OracleParameter();
            P_TIRE_SIZE.ParameterName = ":P_TIRE_SIZE";
            P_TIRE_SIZE.OracleType = OracleType.VarChar;
            P_TIRE_SIZE.Direction = ParameterDirection.Input;
            objCmd.Parameters.Add(P_TIRE_SIZE);

            OracleParameter P_E4_MARK = new OracleParameter();
            P_E4_MARK.ParameterName = ":P_E4_MARK";
            P_E4_MARK.OracleType = OracleType.Number;
            P_E4_MARK.Direction = ParameterDirection.Input;
            objCmd.Parameters.Add(P_E4_MARK);


            OracleParameter P_SECTOR_NO = new OracleParameter();
            P_SECTOR_NO.ParameterName = ":P_SECTOR_NO";
            P_SECTOR_NO.OracleType = OracleType.VarChar;
            P_SECTOR_NO.Direction = ParameterDirection.Input;
            objCmd.Parameters.Add(P_SECTOR_NO);


            OracleParameter P_UPLATE_NO = new OracleParameter();
            P_UPLATE_NO.ParameterName = ":P_UPLATE_NO";
            P_UPLATE_NO.OracleType = OracleType.VarChar;
            P_UPLATE_NO.Direction = ParameterDirection.Input;
            objCmd.Parameters.Add(P_UPLATE_NO);

            OracleParameter P_LPLATE_NO = new OracleParameter();
            P_LPLATE_NO.ParameterName = ":P_LPLATE_NO";
            P_LPLATE_NO.OracleType = OracleType.VarChar;
            P_LPLATE_NO.Direction = ParameterDirection.Input;
            objCmd.Parameters.Add(P_LPLATE_NO);

            OracleParameter P_BLADER_NO = new OracleParameter();
            P_BLADER_NO.ParameterName = ":P_BLADER_NO";
            P_BLADER_NO.OracleType = OracleType.VarChar;
            P_BLADER_NO.Direction = ParameterDirection.Input;
            objCmd.Parameters.Add(P_BLADER_NO);

            OracleParameter P_MAX_TCLC_SINGLE = new OracleParameter();
            P_MAX_TCLC_SINGLE.ParameterName = ":P_MAX_TCLC_SINGLE";
            P_MAX_TCLC_SINGLE.OracleType = OracleType.Number;
            P_MAX_TCLC_SINGLE.Direction = ParameterDirection.Input;
            objCmd.Parameters.Add(P_MAX_TCLC_SINGLE);

            OracleParameter P_TCLC_UNIT_SINGLE = new OracleParameter();
            P_TCLC_UNIT_SINGLE.ParameterName = ":P_TCLC_UNIT_SINGLE";
            P_TCLC_UNIT_SINGLE.OracleType = OracleType.VarChar;
            P_TCLC_UNIT_SINGLE.Direction = ParameterDirection.Input;
            objCmd.Parameters.Add(P_TCLC_UNIT_SINGLE);

            OracleParameter P_MAX_IO_SINGLE = new OracleParameter();
            P_MAX_IO_SINGLE.ParameterName = ":P_MAX_IO_SINGLE";
            P_MAX_IO_SINGLE.OracleType = OracleType.Number;
            P_MAX_IO_SINGLE.Direction = ParameterDirection.Input;
            objCmd.Parameters.Add(P_MAX_IO_SINGLE);

            OracleParameter P_IO_UNIT_SINGLE = new OracleParameter();
            P_IO_UNIT_SINGLE.ParameterName= ":P_IO_UNIT_SINGLE";
            P_IO_UNIT_SINGLE.OracleType = OracleType.VarChar;
            P_IO_UNIT_SINGLE.Direction = ParameterDirection.Input;
            objCmd.Parameters.Add(P_IO_UNIT_SINGLE);

            OracleParameter P_PR = new OracleParameter();
            P_PR.ParameterName = ":P_PR";
            P_PR.OracleType = OracleType.Number;
            P_PR.Direction = ParameterDirection.Input;
            objCmd.Parameters.Add(P_PR);



            OracleParameter W_BLD_SPEC_NO = new OracleParameter();
            W_BLD_SPEC_NO.OracleType = OracleType.VarChar;
            W_BLD_SPEC_NO.Size = 7;
            W_BLD_SPEC_NO.Direction = ParameterDirection.ReturnValue;
            objCmd.Parameters.Add(W_BLD_SPEC_NO);

            OracleParameter W_BLD_SPEC_NO_SEQ = new OracleParameter();
            W_BLD_SPEC_NO_SEQ.OracleType = OracleType.Number;
            W_BLD_SPEC_NO_SEQ.Size = 1;
            W_BLD_SPEC_NO_SEQ.Direction = ParameterDirection.ReturnValue;
            objCmd.Parameters.Add(W_BLD_SPEC_NO_SEQ);

            OracleParameter W_ART_NO = new OracleParameter();
            W_ART_NO.OracleType = OracleType.VarChar;
            W_ART_NO.Size = 5;
            W_ART_NO.Direction = ParameterDirection.ReturnValue;
            objCmd.Parameters.Add(W_ART_NO);

            OracleParameter W_CURE_KIBN = new OracleParameter();
            W_CURE_KIBN.OracleType = OracleType.VarChar;
            W_CURE_KIBN.Size = 4;
            W_CURE_KIBN.Direction = ParameterDirection.ReturnValue;
            objCmd.Parameters.Add(W_CURE_KIBN);

            OracleParameter W_CURE_LR_KBN = new OracleParameter();
            W_CURE_LR_KBN.OracleType = OracleType.VarChar;
            W_CURE_LR_KBN.Size = 1;
            W_CURE_LR_KBN.Direction = ParameterDirection.ReturnValue;
            objCmd.Parameters.Add(W_CURE_LR_KBN);

            OracleParameter W_HINMEI = new OracleParameter();
            W_HINMEI.OracleType = OracleType.VarChar;
            W_HINMEI.Size = 50;
            W_HINMEI.Direction = ParameterDirection.ReturnValue;
            objCmd.Parameters.Add(W_HINMEI);

            OracleParameter W_TIRE_SIZE = new OracleParameter();
            W_TIRE_SIZE.OracleType = OracleType.VarChar;
            W_TIRE_SIZE.Size = 20;
            W_TIRE_SIZE.Direction = ParameterDirection.ReturnValue;
            objCmd.Parameters.Add(W_TIRE_SIZE);

            OracleParameter W_E4_MARK = new OracleParameter();
            W_E4_MARK.OracleType = OracleType.Number;
            W_E4_MARK.Size = 1;
            W_E4_MARK.Direction = ParameterDirection.ReturnValue;
            objCmd.Parameters.Add(W_E4_MARK);

            OracleParameter W_SECTOR_NO = new OracleParameter();
            W_SECTOR_NO.OracleType = OracleType.VarChar;
            W_SECTOR_NO.Size = 6;
            W_SECTOR_NO.Direction = ParameterDirection.ReturnValue;
            objCmd.Parameters.Add(W_SECTOR_NO);

            OracleParameter W_UPLATE_NO = new OracleParameter();
            W_UPLATE_NO.OracleType = OracleType.VarChar;
            W_UPLATE_NO.Size = 6;
            W_UPLATE_NO.Direction = ParameterDirection.ReturnValue;
            objCmd.Parameters.Add(W_UPLATE_NO);

            OracleParameter W_LPLATE_NO = new OracleParameter();
            W_LPLATE_NO.OracleType = OracleType.VarChar;
            W_LPLATE_NO.Size = 6;
            W_LPLATE_NO.Direction = ParameterDirection.ReturnValue;
            objCmd.Parameters.Add(W_LPLATE_NO);

            OracleParameter W_BLADER_NO = new OracleParameter();
            W_BLADER_NO.OracleType = OracleType.VarChar;
            W_BLADER_NO.Size = 7;
            W_BLADER_NO.Direction = ParameterDirection.ReturnValue;
            objCmd.Parameters.Add(W_BLADER_NO);

            OracleParameter W_MAX_TCLC_SINGLE = new OracleParameter();
            W_MAX_TCLC_SINGLE.OracleType = OracleType.Number;
            W_MAX_TCLC_SINGLE.Size = 1;
            W_MAX_TCLC_SINGLE.Direction = ParameterDirection.ReturnValue;
            objCmd.Parameters.Add(W_MAX_TCLC_SINGLE);

            OracleParameter W_TCLC_UNIT_SINGLE = new OracleParameter();
            W_TCLC_UNIT_SINGLE.OracleType = OracleType.VarChar;
            W_TCLC_UNIT_SINGLE.Size = 3;
            W_TCLC_UNIT_SINGLE.Direction =     ParameterDirection.ReturnValue;
            objCmd.Parameters.Add(W_TCLC_UNIT_SINGLE);

            OracleParameter W_MAX_IO_SINGLE = new OracleParameter();
            W_MAX_IO_SINGLE.OracleType = OracleType.Number;
            W_MAX_IO_SINGLE.Size = 1;
            W_MAX_IO_SINGLE.Direction = ParameterDirection.ReturnValue;
            objCmd.Parameters.Add(W_MAX_IO_SINGLE);

            OracleParameter W_IO_UNIT_SINGLE = new OracleParameter();
            W_IO_UNIT_SINGLE.OracleType = OracleType.VarChar;
            W_IO_UNIT_SINGLE.Size = 3;
            W_IO_UNIT_SINGLE.Direction = ParameterDirection.ReturnValue;
            objCmd.Parameters.Add(W_IO_UNIT_SINGLE);

            OracleParameter W_PR = new OracleParameter();
            W_PR.OracleType = OracleType.Number;
            W_PR.Size = 1;
            W_PR.Direction = ParameterDirection.ReturnValue;
            objCmd.Parameters.Add(W_PR);


            objCmd.ExecuteNonQuery();

            objConn.Close();

        }

Но я все еще получаю ошибку

{"ORA-06550: line 1, column 34:\nPLS-00103: Encountered the symbol \"=\" when expecting one of the following:\n\n   . ( * @ % & = - + ; < / > at in is mod not rem\n   <an exponent (**)> <> or != or ~= >= <= <> and or like\n   between || indicator\n"}

Пожалуйста, надеюсь, кто-нибудь может мне помочь :(


person Skraze    schedule 10.03.2017    source источник
comment
Это обширный и громоздкий пример. С вашей стороны неразумно ожидать, что мы преодолеем все это. Я предлагаю вам попробовать меньший пример (скажем, процедуру, которая принимает один параметр) и заставить его работать. Затем приступайте к большему.   -  person APC    schedule 10.03.2017


Ответы (2)


Это выглядит неправильно

P_BLD_LVL_CD.ParameterName = ":P_BLD_LVL_CD";
                              ^

Двоеточие используется для обозначения заполнителей в строке SQL. Фактическое имя параметра должно быть

P_BLD_LVL_CD.ParameterName = "P_BLD_LVL_CD";

Также ParameterDirection.ReturnValue используется только для возвращаемого значения. Таким образом, для каждого вызова функции должен быть только один такой параметр. Кажется, вы используете его для всех параметров IN OUT. Это не правильно.

Для параметров IN OUT необходимо использовать ParameterDirection.InputOutput.

Между прочим, функция с параметрами IN OUT - плохая практика PL / SQL, но я думаю, что вы мало что можете с этим поделать.

Итак, TSCBE1005_001_FNC - это функция, которая принимает три параметра IN (только чтение) и восемнадцать параметров IN OUT (чтение / запись). Поэтому для вашего звонка необходимо:

  • один параметр с ParameterDirection.ReturnValue
  • три параметра с ParameterDirection.Input
  • восемнадцать параметров с ParameterDirection.InputOutput
person APC    schedule 10.03.2017
comment
Привет, спасибо за помощь :) Я очень признателен. У меня еще один вопрос, вы сказали один параметр с ParameterDirection.ReturnValue .. со всеми моими полями возвращаемое значение должно быть только это - ›переменная ret varchar2 (100) ??? извините, это действительно мой первый раз, когда я выполняю хранимую процедуру на C # .. - person Skraze; 13.03.2017
comment
Привет, сэр, не могли бы вы мне помочь, каков правильный подход к выполнению хранимой процедуры с помощью приложения C #? в нашей практике мы используем клиент данных Oracle. Есть ли способы применить это с помощью клиента данных оракула? - person Skraze; 13.03.2017

Я никогда не использовал objCmd.CommandType = CommandType.StoredProcedure;

Я всегда использую такой синтаксис:

objCmd.CommandText = "BEGIN :res := TSCBE1005_PKG.TSCBE1005_001_FNC(:P_BLD_LVL_CD, :P_IN_DATE, ...); END;";
objCmd.CommandType = CommandType.Text;

Тогда ваше объявление параметра неверно.

P_SECTOR_NO.Direction = ParameterDirection.Input;

ParameterDirection должен соответствовать сигнатуре вашей функции, то есть ReturnValue или Input или Output (не используется в вашем примере) или InputOutput

Тип тоже неправильный:

P_SECTOR_NO.OracleType = OracleType.VarChar;

Вы должны использовать OracleDbType, см. OracleDbType Enumeration. Для сопоставления OracleDbType и типа .NET см. C #: Эквивалентность типов данных Oracle с OracleDbType

кстати, вы можете поместить все это в одну команду, например

cmd.Parameters.Add("P_BLD_LVL_CD", OracleDbType.Varchar2, ParameterDirection.Input).Value = "R035570412";

Имейте в виду, что в случае ParameterDirection.Output вы должны установить DbType отдельно. Также в случае OracleDbType.Varchar2 необходимо указать размер и начальное значение:

cmd.Parameters.Add("parName", OracleDbType.Varchar2, 240, null, ParameterDirection.Output);
cmd.Parameters("parName").DbType = DbType.String;
person Wernfried Domscheit    schedule 10.03.2017
comment
Привет, Вернфрид, спасибо, что нашли время взглянуть на мою проблему, я очень ценю это. Итак, вы имеете в виду, я также могу использовать это как CommandText -------------- ›execute: ret: = TSCBE1005_PKG.TSCBE1005_001_FNC ('R035570412', '20170124120644', 'YRC07400',: O_BLD_SPEC_NO ,: O_BLD_SPEC_NO_SEQ,: O_ART_NO,: O_CURE_KIBN,: O_CURE_LR_KBN,: O_HINMEI,: O_TIRE_SIZE,: O_E4_MARK,: O_SECTOR_NO,: O_UPLATE_NO,: O_LPLATE_NO,: O_BLADER_NO,: O_MAX_TCLC_SINGLE,: O_TCLC_UNIT_SINGLE,: O_MAX_IO_SINGLE,: O_IO_UNIT_SINGLE,: O_PR ,: O_MSG) ?????? - person Skraze; 13.03.2017
comment
Привет, сэр, может ли эта функция применяться в клиенте данных Oracle? - person Skraze; 13.03.2017