繁体   English   中英

在C#中执行多个Select语句时,“ ORA-00933:SQL命令未正确结束”

[英]'ORA-00933: SQL command not properly ended' when executing multiple Select statements in C#

我想从下面的代码中的两个Select语句中检索数据,我得到了

Oracle.DataAccess.Client.OracleException:'ORA-00933:SQL命令未正确结束'

例外。

编辑:实际上,我用以下查询替换了查询: "Select id from T_penalty_order; Select id from T_payment;" 而且我仍然遇到相同的错误

“ Oracle.DataAccess.Client.OracleException:'ORA-00933:SQL命令未正确结束'

using (var connection = new OracleConnection(connectionString))
        using (var command = connection.CreateCommand())
        {
            connection.Open();
            command.CommandText = "select id from t_penalty_order where protokol_no = :invoiceNumber; select A.NAME, A.SURNAME , A.FATHER_NAME, P.PROTOKOL_NO,  P.PROTOKOL_TARIHI , P.PENALTY_FINE, A.FIN, PA.AMOUNT, P.LOCATION_DESCRIPTION, P.QARAR_TARIHI , e.name as \"KANUN\", P.IS_PAID from t_penalty_order p JOIN t_applicant a on p.applicant_id = a.id JOIN t_payment pa on p.id = pa.penalty_order_id JOIN t_penalty_order_kanun_maddesi km ON KM.PENALTY_ORDER_ID = p.id JOIN t_enum_value e ON km.kanun_maddesi_enum = e.id where km.kanun_maddesi_enum = e.id and p.protokol_no = :invoiceNumber group by a.name, a.surname, A.FATHER_NAME, P.PROTOKOL_NO,  P. PROTOKOL_TARIHI , P.PENALTY_FINE, A.FIN, PA.AMOUNT, P.LOCATION_DESCRIPTION, P.QARAR_TARIHI ,  e.name, P.IS_PAID;";

            command.Parameters.Add(new OracleParameter(@"invoiceNumber", OracleDbType.Varchar2, 255)).Value = request.identificationCode.invoiceNumber;


            using (var reader = command.ExecuteReader())
            {
                do
                {
                    while (reader.Read())
                    {
                        generalInfoResponse.account = new Account();
                        generalInfoResponse.account = null;
                        generalInfoResponse.invoice = new Invoice[1];
                        generalInfoResponse.invoice = null;

                        generalInfoResponse.response = new Response();
                        generalInfoResponse.response.code = 111;
                        generalInfoResponse.response.message = reader.GetInt32(0).ToString();
                    }
                    //Console.WriteLine("--next command--");
                } while (reader.NextResult());

            }
        }

格式化查询,使其保持可读性 ,您可以轻松地看到许多讨厌的语法错误:

command.CommandText = 
   @"select id 
       from t_penalty_order 
      where protokol_no = :invoiceNumber; -- <- Do you really want to perform next query?

     select A.NAME, 
            A.SURNAME, 
            A.FATHER_NAME, 
            P.PROTOKOL_NO, 
            P.PROTOKOL_TARIHI, 
            P.PENALTY_FINE, 
            A.FIN, 
            PA.AMOUNT, 
            P.LOCATION_DESCRIPTION, 
            P.QARAR_TARIHI, 
            e.name as ""KANUN"", -- <- double quots in case of verbatim strings @"..." 
            P.IS_PAID 
       from t_penalty_order                p 
       join t_applicant                    a ON p.applicant_id = a.id 
       join t_payment                     pa ON p.id = pa.penalty_order_id  
       join t_penalty_order_kanun_maddesi km ON KM.PENALTY_ORDER_ID = p.id 
       join t_enum_value                   e ON km.kanun_maddesi_enum = e.id 
      where km.kanun_maddesi_enum = e.id 
        and p.protokol_no = :invoiceNumber 
   group by a.name, 
            a.surname, 
            A.FATHER_NAME, 
            P.PROTOKOL_NO,  
            P.PROTOKOL_TARIHI, -- <- Not P. PROTOKOL_TARIHI
            P.PENALTY_FINE, 
            A.FIN, 
            PA.AMOUNT, 
            P.LOCATION_DESCRIPTION, 
            P.QARAR_TARIHI,  
            e.name, 
            P.IS_PAID;";

编辑:如果您坚持要一次性执行两个查询,则应通过Oracle中的匿名块来执行:

command.CommandText = 
 @"begin -- please, note begin..end anonymous block 
       open :prm_query1 for 
     select id 
       from t_penalty_order 
      where protokol_no = :invoiceNumber; 

       open :prm_query2 for     
     select A.NAME, 
            A.SURNAME, 
            A.FATHER_NAME, 
            P.PROTOKOL_NO, 
            P.PROTOKOL_TARIHI, 
            P.PENALTY_FINE, 
            A.FIN, 
            PA.AMOUNT, 
            P.LOCATION_DESCRIPTION, 
            P.QARAR_TARIHI, 
            e.name as ""KANUN"", 
            P.IS_PAID 
       from t_penalty_order                p 
       join t_applicant                    a ON p.applicant_id = a.id 
       join t_payment                     pa ON p.id = pa.penalty_order_id  
       join t_penalty_order_kanun_maddesi km ON KM.PENALTY_ORDER_ID = p.id 
       join t_enum_value                   e ON km.kanun_maddesi_enum = e.id 
      where km.kanun_maddesi_enum = e.id 
        and p.protokol_no = :invoiceNumber 
   group by a.name, 
            a.surname, 
            A.FATHER_NAME, 
            P.PROTOKOL_NO,  
            P.PROTOKOL_TARIHI, 
            P.PENALTY_FINE, 
            A.FIN, 
            PA.AMOUNT, 
            P.LOCATION_DESCRIPTION, 
            P.QARAR_TARIHI,  
            e.name, 
            P.IS_PAID;
   end;";

不要忘记声明:prm_query1:prm_query2

command.Parameters.Add(":prm_query1", OracleDbType.RefCursor).Direction = 
  ParameterDirection.Output;

command.Parameters.Add(":prm_query2", OracleDbType.RefCursor).Direction =
  ParameterDirection.Output;

通过ExecuteReader()执行时,我们应借助NextResult()读取每个游标:

      using (var reader = command.ExecuteReader()) {
        int queryIndex = 1; 

        do {
          while (reader.Read()) {
            //TODO: Read values here
            // Convert.ToString(reader[0]);
          }

          queryIndex += 1;
        }
        while(reader.NextResult());
      }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM