由于需要更大的大小,更改了oracle中的varchar2数据类型

jexiocij  于 2022-11-28  发布在  Oracle
关注(0)|答案(1)|浏览(234)

我正在使用一个应用程序,其中我使用jdbc。到目前为止,我们在UI中为用户输入的长度为320000(320k)。因此,我们将此字段分为10个部分,并将其发送到Pl/SQL db过程以插入到表中。我们在过程参数中的10个varchar2变量中接收消息。
但是现在客户端改变了要求,他想让用户的大小加倍。因此,如果我们除以640000/10,将得到64000,这超出了varchar2的限制,即32767。这意味着我们不能在过程中使用varchar2类型变量来存储这些值。
许多其他应用程序都会呼叫这个程序。
我的问题是,我应该为过程中的pl/sql变量而不是varchar2更改哪种数据类型,这样代码就不会因其他应用程序而中断?
现有的是

create procedure(field 1 varchar2, field2 varchar2...........field10 varchar2)
begin

end

我们应该使用什么数据类型来代替这里的varchar2。
在过程中,我们将这些输入聚合起来,并存储到一个CLOB类型的列中。
我阅读了文档,但仍然没有得到解决方案

3ks5zfa0

3ks5zfa01#

如果可以将数据拆分为2组VarChar 2字段,每组10个字段(32000)值-在这种情况下,您可以(具有较小干预),我想说的是,你可以像以前一样将第一组320 K数据分成10个字段--将它们放入一个数组中,然后使用相同的逻辑获取第二组320 K数据。在这种情况下,您应该在原始程序中再添加一个参数,说明它是设置为1还是2。
你应该用一个小 Package 和一个阵列来处理这个过程。
不确定你的手术是什么样子,只是提供一些思考的东西。
下面是一个选项-首先创建一个适当大小的数组:

create or replace TYPE X_ARRAY 
AS VARRAY(32) OF VarChar2(32000);

接下来是处理数据并获取要写入数据库的CLOB的包:

create or replace PACKAGE MANAGE_CLOBS AS 
-- -----------------------------------------------  
  Procedure Init;
-- -----------------------------------------------
  Procedure AddPart(p_Part IN VARCHAR2);
-- ----------------------------------------------
  Function GetArray RETURN X_ARRAY;
-- ----------------------------------------------
  Function GetCLOB RETURN CLOB;
-- ----------------------------------------------
  Procedure SetToArray(P_FIELD1 IN VARCHAR2, P_FIELD2 IN VARCHAR2, P_FIELD3 IN VARCHAR2, P_FIELD4 IN VARCHAR2, P_FIELD5 IN VARCHAR2, 
                       P_FIELD6 IN VARCHAR2, P_FIELD7 IN VARCHAR2, P_FIELD8 IN VARCHAR2, P_FIELD9 IN VARCHAR2, P_FIELD10 IN VARCHAR2, P_SET_NUMBER IN NUMBER := 1);
--
END MANAGE_CLOBS;

...和程序包主体...

create or replace PACKAGE BODY MANAGE_CLOBS AS
    mSet      NUMBER(1);
    mArray    X_ARRAY;
    mCLOB     CLOB;
  -- -----------------------------------------------  
    Procedure Init IS
        Begin
            mSet := 0;
            mArray := X_ARRAY();
             mCLOB := Null;
        End Init;
  -- -----------------------------------------------
    Procedure AddPart(P_Part IN VARCHAR2) is
        Begin
            mCLOB := mCLOB || P_Part;
        End AddPart;
  -- ---------------------------------------------
    Function GetArray RETURN X_ARRAY IS
        BEGIN
            RETURN mArray;
        END GetArray;
  -- ---------------------------------------------
    Function GetCLOB RETURN CLOB IS
        BEGIN
            FOR i In 1..mArray.count LOOP
                AddPart(mArray(i));
            END LOOP;
            RETURN mCLOB;
        END GetCLOB;
-- ---------------------------------------------
    Procedure SetToArray(P_FIELD1 IN VARCHAR2, P_FIELD2 IN VARCHAR2, P_FIELD3 IN VARCHAR2, P_FIELD4 IN VARCHAR2, P_FIELD5 IN VARCHAR2, 
                         P_FIELD6 IN VARCHAR2, P_FIELD7 IN VARCHAR2, P_FIELD8 IN VARCHAR2, P_FIELD9 IN VARCHAR2, P_FIELD10 IN VARCHAR2, P_SET_NUMBER IN NUMBER := 1) IS
            idx   Number(2);
            fld   VarChar2(32000);
            sq    VarChar2(1) := '''';
        BEGIN
            If mSet < P_SET_NUMBER Then
                mSet := P_SET_NUMBER;
                mArray.extend;
                mArray((P_SET_NUMBER - 1) * 10 + 1) := P_FIELD1;
                mArray.extend;
                mArray((P_SET_NUMBER - 1) * 10 + 2) := P_FIELD2;
                mArray.extend;
                mArray((P_SET_NUMBER - 1) * 10 + 3) := P_FIELD3;
                mArray.extend;
                mArray((P_SET_NUMBER - 1) * 10 + 4) := P_FIELD4;
                mArray.extend;
                mArray((P_SET_NUMBER - 1) * 10 + 5) := P_FIELD5;
                mArray.extend;
                mArray((P_SET_NUMBER - 1) * 10 + 6) := P_FIELD6;
                mArray.extend;
                mArray((P_SET_NUMBER - 1) * 10 + 7) := P_FIELD7;
                mArray.extend;
                mArray((P_SET_NUMBER - 1) * 10 + 8) := P_FIELD8;
                mArray.extend;
                mArray((P_SET_NUMBER - 1) * 10 + 9) := P_FIELD9;
                mArray.extend;
                mArray((P_SET_NUMBER - 1) * 10 + 10) := P_FIELD10;
            End If;
        END SetToArray;
END MANAGE_CLOBS;

现在,您从10(32000)个字段收集数据的过程应更改为如下所示的内容,其中您将以两个集合(最后一个参数)传递FIELD 1、FIELD 2、...、FIELD 10数据。数据将存储在数组中,然后收集到xCLOB变量中,您可以将该变量存储在表中。

SET SERVEROUTPUT ON
Declare 
    xArray    X_ARRAY;
    xCLOB     CLOB;
Begin
    MANAGE_CLOBS.Init;
    MANAGE_CLOBS.SetToArray('AAAAA', 'BBBBB', 'CCCCC', 'DDDDD', 'EEEEE',
                           'FFFFF', 'GGGGG', 'HHHHH', 'IIIII', 'JJJJJ', 1);
    --
    MANAGE_CLOBS.SetToArray('kkkkk', 'lllll', 'mmmmm', 'nnnnn', 'ooooo',
                           'ppppp', 'rrrrr', 'sssss', 'ttttt', 'uuuuu', 2);
    --
    xArray := MANAGE_CLOBS.GetArray;  -- this line is not needed - here it is just for you to do some cheks if you want before transfer to xCLOB
    xCLOB := MANAGE_CLOBS.GetCLOB;    -- xCLOB should contain all the data passed to the procedure
    DBMS_OUTPUT.PUT_LINE(SubStr(xCLOB, 1, 200));
End;
--  
--  R e s u l t :
--  anonymous block completed
--  AAAAABBBBBCCCCCDDDDDEEEEEFFFFFGGGGGHHHHHIIIIIJJJJJkkkkklllllmmmmmnnnnnoooooppppprrrrrssssstttttuuuuu

此致

相关问题