|
PL/SQL块中只能直接嵌入SELECT,DML(INSERT,UPDATE,DELETE)
以及事务控制语句(COMMIT,ROLLBACK,SAVEPOINT),
而不能直接嵌入DDL语句(CREATE,ALTER,DROP)和DCL语句(GRANT,REVOKE)
1.检索单行数据
1.1使用标量变量接受数据
- v_ename emp.ename%type;
- v_sal emp.sal%type;
- select ename,sal into v_ename,v_sal from emp where empno=&no;
1.2使用记录变量接受数据
- type emp_record_type is record(
- ename emp.ename%type,sal emp.sal%type);
- emp_record emp_record_type;
- select ename,sal into emp_record from emp where empno=&no;
1.3嵌入SELECT语句注意事项:
使用SELECT INTO语句时,必须要返回一条数据,并且只能返回一条数据
no_date_found:
select into没有返回数据
too_many_rows:
select into返回多条数据
where子句使用注意事项:
使用的变量名不能与列名相同,否则触发TOO_MANY_ROWS例外.
2.操纵数据
2.1使用VALUES子句插入数据
- v_deptno dept.deptno%type;
- v_dname dept.dname%type;
- v_deptno:=no;
- v_dname:='&name';
- insert into dept (deptno,dname) values(v_deptno,v_dname);
2.2使用子查询插入数据
- v_deptno emp.deptno%type:=&no;
- insert into employee select * from emp where deptno=v_deptno;
2.3更新数据
使用表达式更新列值
- v_deptno dept.deptno%type:=no;
- v_loc dept.loc%type:='&loc';
- update dept set loc=v_loc where deptno=v_deptno;
2.4使用子查询更新列值
- v_ename emp.ename%type:='&name';
- update emp set (sal,comm) = (select sal,comm from emp where ename=v_ename) where job = (select job from emp where ename=v_ename) ;
2.5删除数据
使用变量删除数据
- v_deptno dept.deptno%type:=&no;
- delete from dept where deptno=v_deptno;
2.6使用子查询删除数据
- v_ename emp.ename%type:='&name';
- delete from emp where deptno=(select deptno from emp where ename=v_ename);
3.SQL游标
游标是指向上下文区的指针,包括隐含游标(SQL游标)和显式游标两种类型
SQL游标用于处理SELECT INTO ,INSERT,UPDATE以及DELETE语句.
显式游标用于处理多行的SELECT语句
SQL游标包括:SQL%FOUND,SQL%NOTFOUND,SQL%ROWCOUNT,SQL%ISOPEN等四种属性
3.1 SQL%ISOPEN:执行时,会隐含的打开和关闭游标.因此该属性的值永远都是FALSE
3.2 SQL%FOUND:用于确定SQL语句执行是否成功.当SQL有作用行时,为TRUE,否则为FALSE
- v_deptno emp.deptno%type:=&no;
- update emp set salsal=sal*1.1 where deptno=v_deptno;
- if sql%found
- then dbms_output.put_line('执行成功');
- else
- dbms_output.putline('失败');
- endif
3.3 sql%notfound:确定SQL语句执行是否成功,当SQL有作用行时,为false,否则为true
3.4 sql%rowcount:返回SQL语句所作用的总计行数
- v_deptno emp.deptno%type:=&no;
- update emp set salsal=sal*1.1 where deptno=v_deptno;
- dbms_output.put_line('修改了'||sql%rowcount||'行');
4.事务控制语句(TCL)
事务控制语句包括COMMIT,ROLLBACK以及SAVEPOINT等三种语句
- v_sal emp.sal%type:=&salary;
- v_ename emp.ename%type:='&name';
- update emp set sal=v_sal where ename=v_ename;
- commit;
- exception
- when others then
- rollback;
- insert into temp values(1);
- savepoint a1;
- insert into temp values(2);
- savepoint a2;
- insert into temp values(3);
- savepoint a3;
- rollback to a2;
- commit;
5.控制结构
条件分支语句
5.1简单条件判断
- v_sal number(6,2);
- select sal into v_sal from emp where
- lower(ename)=lowe('&&name');
- if v_sal
|
|