访问oracle之二,操作数据

本文介绍了在PLSQL中如何使用数据操纵语言(DML)进行数据的插入、更新和删除操作,并详细展示了通过PLSQL变量和子查询实现这些操作的具体方法。

在plsql块中不仅可以嵌入select语句,还可以嵌入DML语句。

插入数据
 插入数据同样使用insert语句,只不过在提供数据时可以使用plsql变量,既可以使用values子句,
 也可以使用子查询。
例如:
 /*使用value子句插入数据*/
declare
  v_name emp.ename%type;
  v_sal emp.sal%type;
begin
  v_name := '&name';
  v_sal := &sal;
  insert into emp(ename,sal) values(v_name,v_sal);
  dbms_output.put_line('插入了'||v_name||'工资是'||v_sal);
end;

 /*使用子查插入数据*/
declare
  v_sal emp.sal%type := 4000;
begin
  insert into emp2(ename,sal)
  select ename,sal from emp where sal = v_sal; 
end;

更新数据
 更新数据同样使用update语句,只不过可以使用plsql变量。
例如:
 /*使用表达式更新列值*/
declare
  v_empno emp.empno%type := 6044;
  v_name emp.ename%type;
  v_sal emp.sal%type := 5500.23;
begin
  select ename into v_name from emp where empno=v_empno;
  update emp set ename=v_name,sal=v_sal where empno=v_empno;
  dbms_output.put_line('更新了姓名'||v_name);
  dbms_output.put_line('更新了工资'||v_sal);
end;

/*使用子查询更新数据*/
declare
  v_name emp.ename%type := 'bbb';
  v_sal emp.sal%type := 2000.57;
begin
  update emp set sal=(select sal from emp where ename=v_name)
  where job in(select job from emp where sal=v_sal);
end;

删除数据
 同样使用delete语句来删除数据。
例如:
 /*使用变量删除数据*/
declare
  v_name emp.ename%type:='ddd';
  v_job emp.job%type:='工人';
begin
  delete from emp where ename=v_name and job=v_job;
end;

 /*使用子查询来删除数据*/
declare
  --v_name emp.ename%type:='ddd';
  v_sal emp.sal%type:=2000;
begin
  delete from emp where job in(select job from emp where sal=v_sal);
end;

游标
 当执行select,update,insert,delete时,oracle server会为这些sql语句分配相应的上下文区,
 并且oracle使用上下文区解析并执行相应的sql语句,而游标是指向上下文区的指针。

 游标分为隐式游标和显示游标2种,隐式游标又叫sql游标,专门用于处理select into,insert ,update,
 delete语句。显示游标用于处理多行的select语句。

 隐式游标的属性:
  SQL%ISOPEN,当select into,insert ,update,delete语句执行时,oracle会隐含的打开游标,处理结  束后隐含的关闭,所以对开发人员来说,该属性永远为false;
  
  SQL%FOUND,该属性用于判断sql语句的执行是否有作用行,有作用行代表执行成功,该属性的值  为true,没有作用行代表执行失败,该属性的值为false.
  例如:
declare
  v_sal emp.sal%type:=3000;
begin
  update emp set sal=v_sal where emp.empno=&no;
  if sql%found then
     dbms_output.put_line('有作用行,执行成功');
  else
     dbms_output.put_line('没有作用行,执行失败');
  end if;
end;

  SQL%NOTFOUND,该属性用于判断sql语句的执行是否有作用行,没有作用行代表执行成功,该属  性的值为true,有作用行代表执行失败,该属性的值为false.和SQL%FOUND属性的取值正好相反
  例如:
declare
  v_sal emp.sal%type:=3000;
begin
  update emp set sal=v_sal where emp.empno=&no;
  if sql%notfound then
     dbms_output.put_line('没有作用行');
  else
     dbms_output.put_line('有作用行');
  end if;
end;

  SQL%ROWCOUNT,该属性返回sql语句的作用行总数。
  例如:
declare
  v_sal emp.sal%type:=3000;
begin
  update emp set sal=v_sal where emp.empno=&no;
  dbms_output.put_line('修改了'||sql%rowcount||'行');
end;

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值