在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, delete语句。显示游标用于处理多行的select语句。
隐式游标的属性: SQL%ISOPEN,当select into,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; (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|