Oracle存在则修改,不存在插入记录

    首先是创建表有着细微的区别,判断一个表是否存在,习惯了MS SQL的OBJECT_ID('对象表','对象类型')的童鞋们,你们是不是想到Oracle中也应该有这样的功能呢?遗憾了,Oracle中没有此类函数来判断一个表是否存在,那就只能通过委婉的方式来实现,MS SQL中有类似于 Select Name From SysObjects Where XType='U'这样的数据库表,那对应的Oracle中就有了select  * from user_tables,通过查询系统表,判断这个表在数据库中是否存在,如果存在就删除,然后再创建。

复制代码
declare num number;   
begin
    select count(1) into num from user_tables where table_name='ACCOUNT';   
    if num > 0 then   
      dbms_output.put_line('存在!');
      execute immediate 'drop table ACCOUNT '; 
    end if;   
      execute immediate 'create table Account
                        (
                                AccountID nvarchar2(50) primary key,
                                AccountName nvarchar2(50) 
                        )';  
      dbms_output.put_line('成功创建表!');
end; 
复制代码

与MS SQL创建一个表对比,是不是还是有一些显微的差异呢?答案当然是肯定的。
  这个演示是前奏,现在来开始我们今天的主题,在Oracle中,表创建成功了,现在我要往这个表中插入数据,如果新插入的数据在表中存在则修改,不存在则插入,我在网上一搜,惊奇的发现Oracle中的exists()函数是判断两个数据集合的交集是否存在,与MS SQL有一定的区别。这样的对比虽然会显的不专业,但是我还是有对比和发表自己观点自由。于是我在网上疯狂的搜索Oracle在这个问题上的解决方案,总结了以下几种方案,以供大家选择:

1:隐式游标法 SQL%NOTFOUND   SQL%FOUND

SQL%NOTFOUND 是SQL中的一个隐式游标,在增删查改的时候自动打开,如果有至少有一条记录受影响,都会返回false,这就就巧妙的构思出了第一种解决方案:

复制代码
begin
update account set AccountName = '修改-a' where AccountID = '5';
IF SQL%NOTFOUND THEN
   insert into account(AccountID,AccountName) values('5','添加-b');
END IF;
end;
复制代码

先根据唯一ID到数据表中修改一条记录,如果这条记录在表中存在,则修改,并且SQL%NOTFOUND返回false。如果修改的记录不存在,SQL%NOTFOUND返回true,并且执行插入语句。

2:异常法 DUP_VAL_ON_INDEX

当Oracle语句执行时,发生了异常exception进行处理

复制代码
begin
insert into account(AccountID,AccountName) values('6','添加-b');
exception 
when DUP_VAL_ON_INDEX then begin 
update account set AccountName = '修改-b' where AccountID = '6';
end;
end;
复制代码

当往表中插入一条数据,因为表中有主键约束,如果插入的数据在表中已经存在,则会抛出异常,在异常抛出后进行修改。

3:虚拟表法  dual

dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录。

复制代码
declare t_count number;
begin
select count(*) into t_count from dual where exists(select 1 from account where AccountID='11');
if t_count< 1 then
  dbms_output.put_line('添加');
  insert into account(AccountID,AccountName) values('11','添加-11');
else
  dbms_output.put_line('修改');
  update account set AccountName = '修改-11' where AccountID = '11';
  end if;
end;
复制代码

先声明一个变量t_count,表dual表的值赋给t_count,如果这个值小于1,表示记录不存在,进行插入操作,反之,存在就进行修改操作。

4:no_data_found法

先查找要插入的记录是否存在,存在则修改,不存在则插入。具体的实现如下:

复制代码
declare t_cols number;
begin
select AccountName into t_cols from account where AccountID = '8';
exception 
when no_data_found then begin 
   --dbms_output.put_line('添加');
   insert into account(AccountID,AccountName) values('8','添加-8');
end;
when others then 
  begin
    --dbms_output.put_line('修改');
    update account set AccountName = '修改-8' where AccountID = '8';
end;
end;
复制代码

5:merge法

先来看一下merge的语法,

复制代码
MERGE INTO table_name alias1   
USING (table|view|sub_query) alias2  
ON (join condition)   
WHEN MATCHED THEN   
    UPDATE table_name SET col1 = col_val1
WHEN NOT MATCHED THEN   
    INSERT (column_list) VALUES (column_values);
复制代码

看了merge的语法后,依葫芦画瓢对于我这种抄袭的人来说已经不是什么难事了。 

复制代码
merge into Account t1  
using (select '3' AccountID,'肖文博' AccountName from dual) t2  
on (t1.AccountID = t2.AccountID)  
when matched then  
     update set t1.AccountName = t2.AccountName
when not matched then  
     insert values (t2.AccountID, t2.AccountName);  
commit; 
复制代码

至此介绍了五种方法来解决我提出的问题。问题是小,但是已经牵涉了Oracle的好几个知识点。最后你与MS SQL相比,在用法上还是有很大的差异。至此,仁者见仁智者见智。

### Oracle 数据库中的插入修改操作 #### 插入操作 为了向Oracle数据库中插入记录,通常会使用`INSERT INTO`语句。此命令允许指定要插入数据的目标表以及具体的列名和对应的值。例如,在Python环境中执这样的插入操作可以通过如下方式实现: ```python import cx_Oracle connection = cx_Oracle.connect("username/password@hostname:port/service_name") cursor = connection.cursor() try: cursor.execute( "INSERT INTO your_table (column1, column2) VALUES (:1, :2)", ("value1", "value2")) connection.commit() # 提交事务以保存更改 finally: cursor.close() connection.close() ``` 上述代码展示了如何利用绑定变量(`:1`, `:2`)来安全地传递参数给SQL查询,从而防止SQL注入攻击的发生[^4]。 对于Java应用程序来说,则需先加载相应的JDBC驱动程序并建立到目标数据库的连接之后再执插入动作: ```java // 加载特定类型的JDBC驱动器类 Class.forName("oracle.jdbc.OracleDriver"); Connection conn = DriverManager.getConnection(url, user, password); PreparedStatement pstmt = null; String sql = "INSERT INTO your_table(column1,column2)VALUES (?,?)"; pstmt = conn.prepareStatement(sql); pstmt.setString(1, "value1"); pstmt.setString(2, "value2"); int result = pstmt.executeUpdate(); conn.commit(); // 确认交易 ``` 这段代码片段说明了在Java应用里怎样准备预编译的SQL语句并通过设置占位符的实际值得到最终可执的形式[^3]。 #### 修改操作 当需要更新已存在记录时,应采用`UPDATE`语句配合条件表达式定位待更正的数据。下面是一个简单的例子展示如何构建一个用于更新某张表格内某些字段值的操作: ```sql UPDATE your_table SET column1='newValue', column2='anotherValue' WHERE condition_column=value_to_match; ``` 值得注意的是,在实际开发过程中应当始终注意确保所使用的WHERE子句能够唯一识别受影响的;否则可能会意外影响多条希望被改变的信息项。 另外,无论是在Python还是其他编程语言环境下工作,都建议每次完成写入型操作后调用相应的方法提交当前事务(如前所述),以便使这些变更正式生效于数据库之中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值