使用Oracle中的存储过程检索长数据类型

时间:2013-10-11 06:28:19

标签: visual-studio-2008 stored-procedures oracle11g

我在Oracle数据库中检索具有LONG数据类型的数据时遇到问题。在特定列处于VARCHAR2类型之前它工作正常之前,但由于我需要更多空间来存储更大的数据,所以我决定使用LONG类型。

我正在使用存储过程检索数据,以下代码从C#调用存储过程:

internal static Issue GetIssueById(int issueId)
    {
        List<OracleParameter> p = new List<OracleParameter>();

        // params
        p.Add(new OracleParameter("p_IssueId", OracleDbType.Varchar2, issueId, ParameterDirection.Input));
        p.Add(new OracleParameter("p_Cursor", OracleDbType.RefCursor, ParameterDirection.Output));

        // perform get
        using (DataTable dt = OracleDataAccessor.ExecuteDataTable(
            ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString,
            CommandType.StoredProcedure,
            "sp_Issues_GetByIssueId",
            p.ToArray()))
        {
            if (dt.Rows.Count < 1)
            {
                // could not get new id
                throw new Exception("Could not find issue with Id: " + issueId);
            }
            else
            {
                // get new Issue
                return new Issue(dt.Rows[0]);
            }
        }

这是存储过程:

 create or replace 
Procedure sp_Issues_GetByIssueId
(
       p_IssueId IN Number,
       p_Cursor OUT Sys_RefCursor
)
IS

BEGIN

  OPEN p_Cursor FOR
  SELECT * FROM Issues i
  WHERE i.IssueId = p_IssueId;

END sp_Issues_GetByIssueId;

我正在尝试使用issueId作为主键在ISSUES表中获取15行的完整行,并且我在检索具有LONG数据类型的列时遇到问题,具体而言,我无法从中检索数据它。就像我说的,在它的类型是VARCHAR2之前,没有问题,代码工作得非常好。我在这里错过了什么,或者LONG数据类型有什么问题吗?如果是这样,可能的解决方法是什么?如果可能,我仍然希望使用LONG数据类型而不是其他类型。

要添加,我使用的是Visual Studio 2008和Oracle 11g。

1 个答案:

答案 0 :(得分:0)

LONG自8.1.5天以来已被弃用,并且有许多限制。应不惜一切代价避免LONG

如果要存储超过4,000个字节的文本数据(12c中为32,000个字节),您将要使用CLOB,而不是LONG