簡體   English   中英

使用 12c 客戶端截斷的存儲過程 OUTPUT VARCHAR2 值

[英]Stored procedure OUTPUT VARCHAR2 value truncated using 12c client

我正在使用oracle 11g 我的存儲過程返回varchar2但它的值被oracle client截斷。 下面是我的代碼:

            if ((ds != null) && (ds.Tables.Count > 0))
                {

                    foreach (DataRow rw in ds.Tables[0].Rows)
                    {

                        OracleParameter param = new OracleParameter((rw["argument_name"]).ToString(), GetOracleType(rw["data_type"].ToString().ToUpper()));
                        param.Direction = GetParameterDirection((rw["in_out"]).ToString().ToUpper());
                        discoveryCommand.Parameters.Add(param);
                        if (param.Direction == ParameterDirection.Output && param.OracleType == OracleType.VarChar)
                        {
                            param.Size = 4000;
                        }
                    }
                }

我將param.size增加到4000但值仍然被截斷。 有沒有辦法解決這個問題。 在服務器上我有Oracle 12c 我需要在不更新項目中的 oracle 客戶端版本的情況下獲得解決方案,因為由於某些原因這是不允許的。

下面是SP。 我修改了它以返回硬編碼值。 還是一樣的問題。

PROCEDURE access_level (
          p_emp_id IN  employees.emp_id%TYPE,
        p_id IN  NUMBER,
        p_type VARCHAR2,
          p_access_level OUT VARCHAR2
 ) IS
  BEGIN


 p_access_level := 'X' || 'RO' || 'RW';






 END IF;

對於連接到服務器 12.1.0.1.0 的客戶端版本 11.2.0.1.0,我無法重現您的問題。 Oracle 12c 客戶端截斷輸出變量是一種已知情況,但是如果您使用的是 11g 版本的客戶端,則不應該是這種情況。

我使用了以下測試表和存儲過程:

CREATE TABLE TEST_TABLE
(
    ID NUMBER(11) NOT NULL,
    NAME VARCHAR2(256),
    CONSTRAINT TEST_TABLE_PK PRIMARY KEY (ID)
)
/

INSERT INTO TEST_TABLE(ID, NAME) VALUES(1, 'Some test data')
/

CREATE PROCEDURE TEST_PROCEDURE
(
   P_ID OUT NUMBER,
   P_NAME OUT VARCHAR2
)
AS
BEGIN
   SELECT ID, NAME INTO P_ID, P_NAME FROM TEST_TABLE;
END;

這是正確獲取數據的客戶端代碼:

using (OracleConnection connection = new OracleConnection())
{
    connection.ConnectionString = ConfigurationManager.ConnectionStrings["TestDatabase"].ConnectionString;
    connection.Open();

    using (OracleCommand command = connection.CreateCommand())
    {
        command.CommandText = "TEST_PROCEDURE";
        command.CommandType = CommandType.StoredProcedure;

        OracleParameter param1 = new OracleParameter("P_ID", OracleType.Number);
        param1.Direction = ParameterDirection.Output;
        command.Parameters.Add(param1);

        OracleParameter param2 = new OracleParameter("P_NAME", OracleType.VarChar);
        param2.Size = 4000;
        param2.Direction = ParameterDirection.Output;
        command.Parameters.Add(param2);

        using (command.ExecuteReader())
        {
            Console.WriteLine($"Output: [{param2.Value}]");
        }
    }
}

要繼續您的問題,請執行以下操作:

  1. 如果可能的話,創建上面的測試表和存儲過程,並檢查如何使用上面的代碼獲取字符串數據。
  2. 如果由於某種原因無法實現,請提供以下信息:

    • 被調用存儲過程的完整代碼
    • 參與存儲過程的所有表的 DDL
    • 獲取數據的完整客戶端代碼

魔鬼總是在細節中。 我們應該只了解您的情況與上面的示例代碼有何不同。

我試圖解決問題,通過遷移到ODP.NETSystem.Data.OracleClient正在被棄用Microsoft提到這里,但問題沒有得到解決。 以下是問題的解決方法:

  1. 機器12.1.0.2.2上安裝的Oracle客戶端版本
  2. Output parameter truncation錯誤在Oracle文檔中被提及為Bug21616079
  3. Oracle已經給出了版本的修訂12.2.0.1.0中提到Oracle文檔在這里
  4. 因此,從12.1.0.2.2升級到版本12.2.0.1.0為我解決了這個問題,因為Oracle僅在此版本中提供了修復,這在官方Oracle文檔中提到,我在上面的第 3 點中提供了鏈接。

我在 64 位 Windows 操作系統上的客戶端 10g 和服務器 11g 都遇到了同樣的問題,我通過在 IIS 上托管我的 .net 應用程序並將 app_pool 的高級設置“啟用 32 位應用程序”更改為 False 來規避它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM