由于更大的大小要求,在 Oracle 中更改 Varchar2 数据类型



我正在使用一个应用程序,其中我正在使用jdbc. 截至目前,我们在用户界面中的用户输入长度为320000(320k)。 因此,我们将此字段分为 10 个部分,并将其发送到Pl/SQLDB 过程以插入到表中。我们在过程参数中收到 10 个 varchar2 变量的消息。

但是现在客户已经改变了要求。 他想为用户增加一倍的大小。 因此,如果我们除以640000/10它将64000超出varchar2极限,即 32767。意味着我们不能在过程中使用 varchar2 类型变量来存储这些值。

此过程由许多其他应用程序调用。

我的问题是我应该在过程中为我的pl/sql变量更改哪种数据类型,而不是varchar2这样代码就不会为其他应用程序中断?

现有是

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

我们应该在这里使用什么数据类型而不是 varchar2。

在此过程中,我们将这些输入聚合并存储到一个 CLOB 类型的列中。

我阅读了文档,但仍然没有得到解决方案

如果您有可能将数据拆分为 2 组 10 个 VarChar2(32000) 值字段 - 在这种情况下(只需少量干预),您可以保持程序正常工作。 我想说的是,您像已经做的那样将第一个 320K 拆分为十个字段 - 将它们放入一个数组中,然后使用相同的逻辑获取第二组 320K 数据。在这种情况下,您应该在原始过程中再添加一个参数,说明如果它设置为 1 或 2.
您应该使用一个小包和数组来处理过程.
不确定您的过程是什么样子的,只是提供一些需要考虑的东西.
这是一个选项 - 第一个创建适当大小的数组:

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) 个字段中收集数据的过程应更改为如下所示的内容,您将分两组(最后一个参数)传递 FIELD1、FIELD2,... , FIELD10 数据。数据将存储在数组中,然后收集到可以存储在表中的 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

问候。。。

Oracle LONG 类型最多可以容纳 2GB,因此 2G 单字节字符或 1G Unicode 字符。

最新更新