【问题标题】:How to execute function using oracle C# windows application如何使用 oracle C# windows 应用程序执行功能
【发布时间】:2017-07-31 11:36:54
【问题描述】:

需要帮助!我是在存储过程包中执行函数的新手,我需要使用 oracle C# windows application 执行这个包..

 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                

我尝试使用以下代码在 C# oracle 中执行此操作,

        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"}

拜托,我希望任何人都可以帮助我:(

【问题讨论】:

  • 这是一个庞大而笨拙的例子。你期望我们经历这一切是不合理的。我建议您尝试一个较小的示例(例如一个带有一个参数的过程)并使其工作。然后开始做更大的事情。

标签: c# oracle stored-procedures oracle11g stored-functions


【解决方案1】:

我没用过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 必须与您的函数的签名相匹配,即ReturnValueInputOutput(在您的示例中未使用)或InputOutput

类型也错了:

P_SECTOR_NO.OracleType = OracleType.VarChar;

您必须使用 OracleDbType,请参阅 OracleDbType Enumeration。有关 OracleDbType 和 .NET 类型之间的映射,请参阅C#: Oracle Data Type Equivalence with 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;

【讨论】:

  • 您好 Wernfried,感谢您抽出宝贵时间查看我的问题,非常感谢。所以,你的意思是,我也可以将其用作 CommandText --------------> 执行 :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)??????
  • 您好,请问这个功能可能适用于Oracle数据客户端吗?
【解决方案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

【讨论】:

  • 您好,感谢您的帮助 :) 非常感谢。我还有一个问题,你说“一个带有ParameterDirection.ReturnValue的参数”..对于我所有的字段,返回值应该只有这个-->变量ret varchar2(100)???抱歉,这真的是我第一次在 C# 中执行存储过程..
  • 您好先生,您能帮帮我吗,如何使用 C# 应用程序执行存储过程的正确方法是什么?在我们的实践中,我们使用的是 oracle 数据客户端。有没有办法使用 oracle 数据客户端来应用它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-29
  • 1970-01-01
  • 1970-01-01
  • 2018-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多