Java 是否可以检查列是否存在,并使用oracle执行不同的操作?

Java 是否可以检查列是否存在,并使用oracle执行不同的操作?,java,oracle,Java,Oracle,我的表格如下所示: id | value1 | count 我在RAM中有一个value1列表,我想执行以下操作: (if value1 exists in table){ count + 1}else{ insert new row into table} 这在Oracle中是可能的,还是我必须将其带到代码中,执行for循环并一次执行列表中的一个元素?该列表包含500万个值。我必须在代码中执行类似的操作: for(int i=0; i<list.size; i

我的表格如下所示:

id | value1 | count
我在RAM中有一个value1列表,我想执行以下操作:

    (if value1 exists in table){
    count + 1}else{
    insert new row into table}
这在Oracle中是可能的,还是我必须将其带到代码中,执行for循环并一次执行列表中的一个元素?该列表包含500万个值。我必须在代码中执行类似的操作:

for(int i=0; i<list.size; i++){
  boolean exists = checkifexists(list.get(i));
  if(exists=true){
    countPlusOne(list.get(i);
  }else{
    createNewRow(list.get(i));
  }
}

因此,我必须对每个值至少进行两次查询,总计1000多个查询。这可能需要很长时间,而且可能不是最有效的方法。我在想另一种方法。

你可以通过两种方法来实现

方法1:

在数据库中创建一个临时表,并将RAM中的所有值插入该临时表 根据主表和临时表的联接编写更新计数的查询,并 在临时表中设置一个标志,该标志表示哪些值已更新,哪些值未更新 使用插入查询来插入。 方法2:

您可以创建自己的数据类型,该类型接受值数组作为输入: 创建或替换类型MyType为VARCHAR250的VARRAY200; 您可以用自己的逻辑编写程序,程序将以数组的值作为输入:在MyType中创建或替换程序测试t_
您可以通过两种方法来实现这一点

方法1:

在数据库中创建一个临时表,并将RAM中的所有值插入该临时表 根据主表和临时表的联接编写更新计数的查询,并 在临时表中设置一个标志,该标志表示哪些值已更新,哪些值未更新 使用插入查询来插入。 方法2:

您可以创建自己的数据类型,该类型接受值数组作为输入: 创建或替换类型MyType为VARCHAR250的VARRAY200; 您可以用自己的逻辑编写程序,程序将以数组的值作为输入:在MyType中创建或替换程序测试t_ 在Oracle中,我们可以使用MERGE语句检查行是否存在,并仅在行不存在时进行插入

首先创建一个定义列表的类型

CREATE OR REPLACE TYPE value1_type as TABLE OF VARCHAR2(10); --use the datatype of value1
合并语句

MERGE INTO yourtable t 
USING (
   select distinct column_value as value1 FROM TABLE(value1_type(v1,v2,v3))
)s ON ( s.value1 =  t.value1 )
WHEN NOT MATCHED THEN INSERT
(col1,col2,col3) VALUES ( s.col1,s.col2,s.col3);
您也可以使用“不存在”

在Oracle中,我们可以使用MERGE语句检查行是否存在,并仅在行不存在时进行插入

首先创建一个定义列表的类型

CREATE OR REPLACE TYPE value1_type as TABLE OF VARCHAR2(10); --use the datatype of value1
合并语句

MERGE INTO yourtable t 
USING (
   select distinct column_value as value1 FROM TABLE(value1_type(v1,v2,v3))
)s ON ( s.value1 =  t.value1 )
WHEN NOT MATCHED THEN INSERT
(col1,col2,col3) VALUES ( s.col1,s.col2,s.col3);
您也可以使用“不存在”


首先在临时表格TMP中填写RAM列表

您可以使用MERGE语句来处理logik

如果存在键,则将计数增加1 如果密钥不存在,请插入初始计数为1的密钥

请注意,我假设列ID中有键,因此不需要重新指定键

如果TMP表中存在重复记录,则会出现具有相同VALUE1键的更多记录,因为Merge不能使用一个键执行更多操作,因此会出现错误

 ORA-30926: unable to get a stable set of rows in the source tables
如果要将每个重复的密钥计为一个- 必须使用GROUP BY预聚合临时表,并添加计数

否则,使用DISTINCT忽略重复项


首先在临时表格TMP中填写RAM列表

您可以使用MERGE语句来处理logik

如果存在键,则将计数增加1 如果密钥不存在,请插入初始计数为1的密钥

请注意,我假设列ID中有键,因此不需要重新指定键

如果TMP表中存在重复记录,则会出现具有相同VALUE1键的更多记录,因为Merge不能使用一个键执行更多操作,因此会出现错误

 ORA-30926: unable to get a stable set of rows in the source tables
如果要将每个重复的密钥计为一个- 必须使用GROUP BY预聚合临时表,并添加计数

否则,使用DISTINCT忽略重复项

我将它们从数据库加载到RAM中

数据库中已经有了源数据,因此应该在数据库中进行处理。在本地内存中实例化一个包含500万个字符串的列表不是一个便宜的操作,尤其是在不必要的情况下

Oracle支持合并功能,我们可以使用该功能测试目标表中是否存在记录,并有条件地填充新行。集合操作合并比Java循环中的单行插入更具性能

棘手的一点是独特性。您需要从包含唯一值的源表中创建一个驱动查询,否则MERGE将抛出。在本例中,我汇总了源表中value1每次出现的次数。这给了我们一组value1加上一个数字,我们可以用它来维护目标表上的count列

merge into you_target_table tt
using ( select value1
               , count(*) as dup_cnt
        from your_source_table
        group by value1
      ) st
on ( st.value1 = tt.value1 )
when not matched then
   insert (id, value1, cnt) 
   values (someseq.nextval, st.value1, st.dup_cnt)
when matched then
   update
   set tt.cnt = tt.cnt + st.dup_cnt;
我假设目标表的ID列由一个序列填充;按你的要求修改

我将它们从数据库加载到RAM中

数据库中已经有了源数据,因此应该在数据库中进行处理。在本地内存中实例化一个包含500万个字符串的列表不是一个便宜的操作,尤其是在不必要的情况下

Oracle支持合并功能,我们可以使用该功能测试目标表中是否存在记录 并有条件地填充新行。集合操作合并比Java循环中的单行插入更具性能

棘手的一点是独特性。您需要从包含唯一值的源表中创建一个驱动查询,否则MERGE将抛出。在本例中,我汇总了源表中value1每次出现的次数。这给了我们一组value1加上一个数字,我们可以用它来维护目标表上的count列

merge into you_target_table tt
using ( select value1
               , count(*) as dup_cnt
        from your_source_table
        group by value1
      ) st
on ( st.value1 = tt.value1 )
when not matched then
   insert (id, value1, cnt) 
   values (someseq.nextval, st.value1, st.dup_cnt)
when matched then
   update
   set tt.cnt = tt.cnt + st.dup_cnt;


我假设目标表的ID列由一个序列填充;根据您的要求进行修改。

可能的重复项是否可以将您的500万个值放入oracle表中?@KevinBurton我认为这将是另一个问题,我需要回答这500万个条目从何处出现?它们不会神奇地出现在RAM中,因此必须有一个填充列表的进程。另外,当你说RAM时,你指的是应用程序的哪一层?本地电脑?应用服务器?数据库服务器?另一件事:列表的数据质量如何?这500万个值是唯一的还是重复的?@APC好极了!可能的重复是否可能将您的500万个值放入oracle表?@KevinBurton我认为这将是另一个问题,我需要回答这500万个条目从何处出现?它们不会神奇地出现在RAM中,因此必须有一个填充列表的进程。另外,当你说RAM时,你指的是应用程序的哪一层?本地电脑?应用服务器?数据库服务器?另一件事:列表的数据质量如何?这500万个值是唯一的还是重复的?@APC好极了!虽然我喜欢使用一种类型的概念,但是我们需要考虑PGA对PL/SQL集合的影响,其中有五百万个条目。虽然我喜欢使用类型的想法,但是我们需要考虑PGA对PL/SQL集合的影响,这五百万个条目填充PL/SQL集合。然而,获取5m记录的实际查询比仅从source_表中选择value1更复杂。它包括3张桌子。我需要从表1中获取一些id。然后,我需要使用表1中的id从表2和表3的原始问题中获取另一种类型的Value1。这相当复杂,但我会试试看。你可以在USING子句中使查询尽可能复杂。唯一的限制是它必须返回ON子句中计算的列的一组唯一值。是的,目标的ID列由sequenceGreat填充!这就是我们希望在这里做的。这个主意很棒。然而,获取5m记录的实际查询比仅从source_表中选择value1更复杂。它包括3张桌子。我需要从表1中获取一些id。然后,我需要使用表1中的id从表2和表3的原始问题中获取另一种类型的Value1。这相当复杂,但我会试试看。你可以在USING子句中使查询尽可能复杂。唯一的限制是它必须返回ON子句中计算的列的一组唯一值。是的,目标的ID列由sequenceGreat填充!这就是我们希望在这里做的。