我正在使用一个应用程序,其中我正在使用jdbc
. 截至目前,我们在用户界面中的用户输入长度为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 类型的列中。
我阅读了文档,但仍然没有得到解决方案
如果您有可能将数据拆分为 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 字符。