簡體   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