Java 数据库更新后的ORA-01733(此处不允许使用虚拟列)
我们的一个数据库已从Oracle 9i更新为11g。从那时起,我们的一个程序在试图通过视图更新列时不断出现上述错误。我们还将JDBC驱动程序更新为11g 观点:Java 数据库更新后的ORA-01733(此处不允许使用虚拟列),java,sql,oracle,jdbc,Java,Sql,Oracle,Jdbc,我们的一个数据库已从Oracle 9i更新为11g。从那时起,我们的一个程序在试图通过视图更新列时不断出现上述错误。我们还将JDBC驱动程序更新为11g 观点: CREATE OR REPLACE VIEW UIV AS SELECT (SELECT FIR_KO_KREIS FROM FIRMA WHERE FIR_KONZERN_NR = TRCO_KONZERN_NR AND FIR_FIRMA_NR = TRCO_FIRMA_NR) UIVNFIRMA, UIVAAENNKZ UIVAA
CREATE OR REPLACE VIEW UIV AS
SELECT
(SELECT FIR_KO_KREIS FROM FIRMA
WHERE FIR_KONZERN_NR = TRCO_KONZERN_NR
AND FIR_FIRMA_NR = TRCO_FIRMA_NR) UIVNFIRMA,
UIVAAENNKZ UIVAAENKZ,
UVVOL,
UVCLS,
UVID1,
UVID2,
UVID3,
UVID4,
UVID5,
UVID6,
TO_NUMBER(TRIM(UVGJ)) UVGJ,
UVEINH,
TO_NUMBER(TRIM(UVW00)) UVW00,
TO_NUMBER(TRIM(UVW01)) UVW01,
TO_NUMBER(TRIM(UVW02)) UVW02,
TO_NUMBER(TRIM(UVW03)) UVW03,
TO_NUMBER(TRIM(UVW04)) UVW04,
TO_NUMBER(TRIM(UVW05)) UVW05,
TO_NUMBER(TRIM(UVW06)) UVW06,
TO_NUMBER(TRIM(UVW07)) UVW07,
TO_NUMBER(TRIM(UVW08)) UVW08,
TO_NUMBER(TRIM(UVW09)) UVW09,
TO_NUMBER(TRIM(UVW10)) UVW10,
TO_NUMBER(TRIM(UVW11)) UVW11,
TO_NUMBER(TRIM(UVW12)) UVW12,
TO_NUMBER(TRIM(UVW13)) UVW13,
NULL UVK01,
NULL UVK02,
NULL UVK03,
NULL UVK04,
NULL UVK05,
NULL UVK06,
NULL UVK07,
NULL UVK08,
NULL UVK09,
NULL UVK10,
NULL UVK11,
NULL UVK12,
NULL UVK13
FROM CO_BUCH;
我们的程序选择UIVAAENKZ
为1的所有记录。此列应在javaResultSet
中更新并设置为0
在resultSet.updateRow()上代码>我们得到一个oracle代码01733的异常。有人知道我们能不能解决这个问题吗?它与Oracle 9i配合得很好
编辑:首先,我们将所有选定的条目写入一个文件。之后,我们倒带结果集(extractedData
)并更新行:
extractedData.beforeFirst();
while (extractedData.next()) {
extractedData.updateString("UIVAAENKZ", "0");
extractedData.updateRow();
}
请注意,视图中的列的名称与原始表UIVAAENKZ UIVAAENNKZ中的列的名称略有不同。但正如我所说,这在以前是没有问题的
原始表格:
create table CO_BUCH
(
uvvol VARCHAR2(4),
uvcls VARCHAR2(4),
uvid1 VARCHAR2(15),
uvid2 VARCHAR2(15),
uvid3 VARCHAR2(15),
uvid4 VARCHAR2(15),
uvid5 VARCHAR2(15),
uvid6 VARCHAR2(15),
fill001 VARCHAR2(1),
uvgj VARCHAR2(3),
uveinh VARCHAR2(4),
fill002 VARCHAR2(1),
uvw00 VARCHAR2(16),
fill003 VARCHAR2(1),
uvw01 VARCHAR2(16),
fill004 VARCHAR2(1),
uvw02 VARCHAR2(16),
fill005 VARCHAR2(1),
uvw03 VARCHAR2(16),
fill006 VARCHAR2(1),
uvw04 VARCHAR2(16),
fill007 VARCHAR2(1),
uvw05 VARCHAR2(16),
fill008 VARCHAR2(1),
uvw06 VARCHAR2(16),
fill009 VARCHAR2(1),
uvw07 VARCHAR2(16),
fill010 VARCHAR2(1),
uvw08 VARCHAR2(16),
fill011 VARCHAR2(1),
uvw09 VARCHAR2(16),
fill012 VARCHAR2(1),
uvw10 VARCHAR2(16),
fill013 VARCHAR2(1),
uvw11 VARCHAR2(16),
fill014 VARCHAR2(1),
uvw12 VARCHAR2(16),
fill015 VARCHAR2(1),
uvw13 VARCHAR2(16),
fill016 VARCHAR2(13),
trco_konzern_nr NUMBER,
trco_firma_nr NUMBER,
trco_betrieb_nr NUMBER,
trco_tras_beleg_nr NUMBER,
trco_senden_datum DATE,
trco_ausgabe VARCHAR2(1000),
uivaaennkz VARCHAR2(1),
uivaersben VARCHAR2(10),
uivdersdat DATE,
uivaaenben VARCHAR2(10),
uivdaendat DATE,
uivndsasta NUMBER(2),
uivnfirma NUMBER
)
编辑2:
从用户选项卡中选择列名称、数据类型、数据默认值、隐藏列、虚拟列,其中表名称='CO_BUCH'按列ID排序代码>
UVVOL;VARCHAR2;<null>;NO;NO
UVCLS;VARCHAR2;<null>;NO;NO
UVID1;VARCHAR2;<null>;NO;NO
UVID2;VARCHAR2;<null>;NO;NO
UVID3;VARCHAR2;<null>;NO;NO
UVID4;VARCHAR2;<null>;NO;NO
UVID5;VARCHAR2;<null>;NO;NO
UVID6;VARCHAR2;<null>;NO;NO
FILL001;VARCHAR2;<null>;NO;NO
UVGJ;VARCHAR2;<null>;NO;NO
UVEINH;VARCHAR2;<null>;NO;NO
FILL002;VARCHAR2;<null>;NO;NO
UVW00;VARCHAR2;<null>;NO;NO
FILL003;VARCHAR2;<null>;NO;NO
UVW01;VARCHAR2;<null>;NO;NO
FILL004;VARCHAR2;<null>;NO;NO
UVW02;VARCHAR2;<null>;NO;NO
FILL005;VARCHAR2;<null>;NO;NO
UVW03;VARCHAR2;<null>;NO;NO
FILL006;VARCHAR2;<null>;NO;NO
UVW04;VARCHAR2;<null>;NO;NO
FILL007;VARCHAR2;<null>;NO;NO
UVW05;VARCHAR2;<null>;NO;NO
FILL008;VARCHAR2;<null>;NO;NO
UVW06;VARCHAR2;<null>;NO;NO
FILL009;VARCHAR2;<null>;NO;NO
UVW07;VARCHAR2;<null>;NO;NO
FILL010;VARCHAR2;<null>;NO;NO
UVW08;VARCHAR2;<null>;NO;NO
FILL011;VARCHAR2;<null>;NO;NO
UVW09;VARCHAR2;<null>;NO;NO
FILL012;VARCHAR2;<null>;NO;NO
UVW10;VARCHAR2;<null>;NO;NO
FILL013;VARCHAR2;<null>;NO;NO
UVW11;VARCHAR2;<null>;NO;NO
FILL014;VARCHAR2;<null>;NO;NO
UVW12;VARCHAR2;<null>;NO;NO
FILL015;VARCHAR2;<null>;NO;NO
UVW13;VARCHAR2;<null>;NO;NO
FILL016;VARCHAR2;<null>;NO;NO
TRCO_KONZERN_NR;NUMBER;<null>;NO;NO
TRCO_FIRMA_NR;NUMBER;<null>;NO;NO
TRCO_BETRIEB_NR;NUMBER;<null>;NO;NO
TRCO_TRAS_BELEG_NR;NUMBER;<null>;NO;NO
TRCO_SENDEN_DATUM;DATE;<null>;NO;NO
TRCO_AUSGABE;VARCHAR2;<null>;NO;NO
UIVAAENNKZ;VARCHAR2;<null>;NO;NO
UIVAERSBEN;VARCHAR2;<null>;NO;NO
UIVDERSDAT;DATE;<null>;NO;NO
UIVAAENBEN;VARCHAR2;<null>;NO;NO
UIVDAENDAT;DATE;<null>;NO;NO
UIVNDSASTA;NUMBER;<null>;NO;NO
UIVNFIRMA;NUMBER;<null>;NO;NO
UVVOL;VARCHAR2;;不不
紫外线灯;VARCHAR2;;不不
UVID1;VARCHAR2;;不不
UVID2;VARCHAR2;;不不
UVID3;VARCHAR2;;不不
UVID4;VARCHAR2;;不不
UVID5;VARCHAR2;;不不
UVID6;VARCHAR2;;不不
FILL001;VARCHAR2;;不不
UVGJ;VARCHAR2;;不不
乌韦恩;VARCHAR2;;不不
FILL002;VARCHAR2;;不不
UVW00;VARCHAR2;;不不
FILL003;VARCHAR2;;不不
UVW01;VARCHAR2;;不不
FILL004;VARCHAR2;;不不
UVW02;VARCHAR2;;不不
FILL005;VARCHAR2;;不不
UVW03;VARCHAR2;;不不
2006年;VARCHAR2;;不不
UVW04;VARCHAR2;;不不
FILL007;VARCHAR2;;不不
UVW05;VARCHAR2;;不不
FILL008;VARCHAR2;;不不
UVW06;VARCHAR2;;不不
FILL009;VARCHAR2;;不不
UVW07;VARCHAR2;;不不
FILL010;VARCHAR2;;不不
UVW08;VARCHAR2;;不不
FILL011;VARCHAR2;;不不
UVW09;VARCHAR2;;不不
FILL012;VARCHAR2;;不不
UVW10;VARCHAR2;;不不
FILL013;VARCHAR2;;不不
UVW11;VARCHAR2;;不不
FILL014;VARCHAR2;;不不
UVW12;VARCHAR2;;不不
FILL015;VARCHAR2;;不不
UVW13;VARCHAR2;;不不
FILL016;VARCHAR2;;不不
TRCO_KONZERN_NR;数目;;不不
信托公司;数目;;不不
TRCO_BETRIEB_n;数目;;不不
TRCO_TRAS_BELEG_NR;数目;;不不
TRCO_SENDEN_基准;日期;;不不
TRCO_AUSGABE;VARCHAR2;;不不
尤瓦恩克斯;VARCHAR2;;不不
维瓦尔斯本;VARCHAR2;;不不
UIVDERSDAT;日期;;不不
维瓦恩本;VARCHAR2;;不不
乌伊夫达恩德;日期;;不不
UIVNDASTA;数目;;不不
UIVNFIRMA;数目;;不不
我们终于找到了解决方案。虽然它可能并不漂亮,但它很有效,而且很简单
问题在于视图中的以下列是从其他表中选择的:
(SELECT FIR_KO_KREIS FROM FIRMA
WHERE FIR_KONZERN_NR = TRCO_KONZERN_NR
AND FIR_FIRMA_NR = TRCO_FIRMA_NR) UIVNFIRMA
当我们在导出期间不选择此列时,一切正常。不幸的是,我们需要这个专栏,所以我们不得不想出一个不同的解决方案
对整个选定数据进行额外的选择可消除此问题:
CREATE OR REPLACE VIEW UIV AS
SELECT * FROM (
SELECT
(SELECT FIR_KO_KREIS FROM FIRMA
WHERE FIR_KONZERN_NR = TRCO_KONZERN_NR
AND FIR_FIRMA_NR = TRCO_FIRMA_NR) UIVNFIRMA,
UIVAAENNKZ UIVAAENKZ,
UVVOL,
UVCLS,
UVID1,
.
.
.
FROM CO_BUCH);
请同时为update语句添加代码。@Codo添加了引发异常的部分。CP\u BUCH
的表定义是什么?那是一张普通的桌子吗;UIVAAENNKZ
是普通列还是虚拟列?@AlexPoole添加了创建脚本;该列应为普通列。最初的表是在9i中创建的,他们说:“我们没有改变任何东西”像往常一样:)通过从用户选项卡中选择列名称、数据类型、数据默认值、隐藏列、虚拟列,表名称='CP\BUCH'按列ID排序,你得到了什么代码>?