我对我的问题没有得到很好的答案,找到了如何做到这一点。这是仅当记录尚不存在时才将记录插入表中的方法:
1)在模式上创建或替换函数(这是检查2个参数,您可以将其设置为根据需要进行检查)PL / SQL非常具体,我编写的复制和粘贴应该成功编译。花了很多次尝试才使语法恰到好处。此函数检查要写入的表,并检查相应的列名称(如果它们已经存在)。
create or replace function Found(
var1 type,
var2 type)
return number
is
numberOfSelectedRows number := 0;
begin
select count(*)
into numberOfSelectedRows
from TABLE
where COLUMN_NAME = var1
and COLUMN_NAME = var2;
return numberOfSelectedRows;
end Found;
2)编写java以执行pl / sql函数:这是使用NetBeans完成的。单击该按钮时,它将从其他表中加载FORM数据,并确定该记录是否已存在于要插入的表中。
try {
DriverManager.registerDriver (new oracle.jdbc.OracleDriver());
con = DriverManager.getConnection(""+LOGIN.url+"");
String str1 = jTextField_VariableName.getText();
String str2 = jTextField_VariableName.getText();
String q = "insert into TABLE (var1 type, var2 type) VALUES ('"+str1+"', '"+str2+"')" ;
cs = con.prepareCall("{?=call Found(?, ?)}"); // cs = CallableStatement - defined in class CallableStatement cs = null;
cs.setString(2, str1);
cs.setString(3, str2);
cs.registerOutParameter(1, Types.INTEGER);
cs.execute();
if(cs.getInt(1)>= 1)
{
JOptionPane.showMessageDialog(null, " this record already exists");
}
else
{
try{
DriverManager.registerDriver (new oracle.jdbc.OracleDriver());
con = DriverManager.getConnection(""+LOGIN.url+"");
pst = con.prepareStatement(q);
pst.execute();
}catch(SQLException ex) {Logger.getLogger(REGISTER_STUDENT.class.getName()).log(Level.SEVERE, null, ex);}
}
} catch (SQLException ex) {Logger.getLogger(REGISTER_STUDENT.class.getName()).log(Level.SEVERE, null, ex);}
答案 0 :(得分:2)
只是做:
String q =
"insert into TABLE (var1, var2) " +
"SELECT ?, ? FROM dual "+
"WHERE NOT EXISTS(
" SELECT 1 FROM table
" WHERE var1 = ? AND var2 = ? )";
pst = con.prepareStatement(q);
pst.setString( 1, str1 );
pst.setString( 2, str2 );
pst.setString( 3, str1 );
pst.setString( 4, str2 );
int status = pst.execute();
if( status > 0 )
System.out.println("New row inserted");
else
System.out.println("Row already exists, insert skipped");
---编辑---
大多数DBMS都支持INSERT INTO .... SELECT ....
语法,有关详细信息,请参阅此链接:http://www.w3schools.com/sql/sql_insert_into_select.asp
它只是从一个表中选择行并将结果插入另一个表中。
dual
是Oracle数据库上的“虚拟”表,它有一列和一行,下面是一个示例:http://www.sqlfiddle.com/#!4/d41d8/11
在我们需要创建具有某些值的行的许多情况下,双表是有用的。在其他数据库中 - 特别是在MySql和PostGreSQL中 - 这可以通过简单的SELECT x, y
来完成,遗憾的是Oracle不支持这种语法,我们必须使用SELECT x, y FROM dual
。
在我们的例子中,它用于创建我们想要插入表中的一行值:
INSERT INTO table
SELECT x, y FROM dual;
但是,只有在满足某些条件时才必须插入行 - WHERE
子句中描述了这种情况:
INSERT INTO table
SELECT x, y FROM dual
WHERE NOT EXISTS(
SELECT 1 FROM table
WHERE var1 = X and var2 = Y
)
如果子查询SELECT 1 FROM ...
返回一行(存在一行) - 则条件NOT EXISTS ...
为假,SELECT x, y
不返回任何内容(空结果集),并且没有任何内容插入到表。另一方面,当子查询没有找到任何内容时,整个条件为真,SELECT x,y语句创建一个包含两列的行:X + Y,并将该行插入表中。
在我们使用的PreparedStatement(在java代码中)?而不是X,Y变量 - ?是placeholder
(替换变量)。此链接:http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html详细描述了PreparedStatement如何工作以及如何使用替换变量。
简单地说 - 我们的查询有4个占位符?
:
insert into TABLE (var1, var2)
SELECT ?, ? FROM dual
WHERE NOT EXISTS(
SELECT 1 FROM table
WHERE var1 = ? AND var2 = ? ) ;
和setXXX语句将值绑定到连续的占位符:
pst.setString( 1, str1 );
pst.setString( 2, str2 );
pst.setString( 3, str1 );
pst.setString( 4, str2 );
因此,在将值绑定到替换标记之后,查询(最终执行)看起来像:
INSERT INTO TABLE (var1, var2)
SELECT 'str1', 'str2' FROM dual
WHERE NOT EXISTS(
SELECT 1 FROM table
WHERE var1 = 'str1' AND var2 = 'str2' ) ;