Oracle Procedure VARCHAR2参数大小限制

时间:2015-06-18 13:47:42

标签: asp.net oracle

早上好。

我面临一个非常奇怪的问题。我有一个Oracle存储过程,它将接受VARCHAR2参数。

从我的ASP.NET应用程序中,我调用此存储过程并将逗号分隔的字符串传递给此参数。 逗号分隔字符串的长度为700个字符(包括逗号)。

现在问题是Oracle程序正在返回错误" 3421:应用程序使用错误类型的值进行当前操作"。

如果删除输入字符串的某些内容并将其发送到procedure,则表示它已成功运行。

我读到Oracle中的VARCHAR2最多接受4000个字符。我只发送700个字符。仍然没有接受它。

我试图给出过程参数的大小。但它给出了编译错误,我读到我们无法指定oracle过程参数的大小。

请帮我解决这个问题。

由于 SRINIVAS

在SP_TESTPROC过程中发送到VAR33的输入字符串:

    195083,195320,195815,196311,196247,196866,197002,197271,197294,197998,198107,
195322,195501,196537,196887,198194,198964,195125,196153,196454,196587,197158,
197082,197277,197482,198110,198312,196586,196403,196428,196510,196694,197075,
197543,198111,198351,195215,196399,197697,198200,198338,196267,195851,196069,
196435,197154,196411,196883,196898,196384,196892,196826,197138,198123,198590,
197384,196383,196438,197044,197831,198917,195787,198199,198120,195874,197155,
197262,197264,197447,198193,195730,196886,196891,196899,197076,198502,196232,
196538,196603,196857,196263,195380,196660,198041,198763,195616,195720,196430,
197559,197836,197844,198015,198666,195777,195951,196433,196795,195843,196398,
196448 




create or replace PROCEDURE   SP_TESTPROC 
     (VAR33  IN VARCHAR2 DEFAULT NULL
      RC1 IN OUT OMWB_EMULATION.GLOBALPKG.RCT1)
AS

BEGIN

        OPEN RC1 FOR
          SELECT *
          FROM   TABLE1 A
            INNER JOIN TABLE2 B ON A.ID = B.TABLE1ID
          WHERE A.ID IN (select TO_NUMBER(regexp_substr(SPCWKF_CASEASSIGNMASTERQUERY.VAR33,'[^,]+', 1, level)) from dual
                        connect by regexp_substr(SPCWKF_CASEASSIGNMASTERQUERY.VAR33, '[^,]+', 1, level) is not null);

END SP_TESTPROC;               

1 个答案:

答案 0 :(得分:0)

尝试:

create or replace PROCEDURE   SP_TESTPROC 
     (VAR33  IN VARCHAR2 DEFAULT NULL
      RC1 IN OUT OMWB_EMULATION.GLOBALPKG.RCT1)
AS

BEGIN
   VAR33 := regexp_replace(VAR33, '[^,0-9]', '');

    OPEN RC1 FOR
      SELECT *
      ..........
      ..........
      ..........
END SP_TESTPROC;   

以上将删除所有不需要的"隐藏"字符串中的字符。

例如,如果您在代码中以这种方式调用该过程:

proc_name('1234,2345,
           2345,5432,
           4545,7777', ..... )

然后该字符串包含一些隐藏的换行符和一些空格,这些字符是显而易见的,而不是数字' - 但是该过程正在尝试使用to_number将它们转换为数字。

看一下这个演示:http://sqlfiddle.com/#!4/f270bc/1

CREATE TABLE t(
  x varchar(4000)
);

INSERT INTO t VALUES(
       '1234,2345,
        2345,5432,
        4545,7777'
);
select x, dump(x)
from t;

你会看到输出的转储包含一些隐藏的' charachers(20空格,10行馈送):
    Typ = 1 Len = 47:49,50,51,52,44,50,51,52,53,44, 10,32,32,32,32,32,32,32,32 ,50,51,52,53,44,
53,52,51,50,44,的 10,32,32,32,32,32,32,32,32 下,52,53,52,53,44,55 ,55,55,55