检索单行数据
1.使用标量变量接受数据
DECLARE
v_ename emp.ename%TYPE;
v_sal emp.sal%TYPE;
BEGIN
SELECT ename,sal INTO v_ename,v_sal
FROM emp WHERE empno=&no;
dbms_output.put_line('雇员名'||v_ename);
dbms_output.put_line('雇员薪水'||v_sal);
END;
2.使用记录变量接受数据
DECLARE
TYPE emp_record_type IS RECORD (
ename emp.ename%TYPE, sal emp.sal%TYPE);
emp_record emp_record_type;
BEGIN
SELECT ename,sal INTO emp_record
FROM emp WHERE empno=&no;
dbms_output.put_line('雇员名:'||emp_record.ename);
dbms_output.put_line('雇员薪水'||emp_record.sal);
END;
3.嵌入SELECT 语句
(1)NO_DATA_FOUND 例外
DECLARE
v_ename emp.ename%TYPE;
v_sal emp.sal%TYPE;
BEGIN
SELECT ename,sal INTO v_ename, v_sal
FROM emp WHERE empno = &no;
dbms_output.put_line('雇员名'||v_ename);
dbms_output.put_line('雇员薪水'||v_sal);
END;
/
输入no的值:1111
DECLARE
*
ERROR 位于第一行:
ORA-01403:未找到数据
ORA-06512:在line 5
在执行了以上PL/SQL块以后,因为没有指定雇员1111,并没有捕捉到NO-DATA_FOUND 例外,所以会在调用环境中显示错误。
(2)TOO_MANY_ROWS 例外
DECLARE
v_ename emp.ename%TYPE;
v_sal emp.sal%TYPE;
BEGIN
SELECT ename,sal INTO v_ename, v_sal
FROM emp WHERE deptno=&no;
END;
部门存在多名员工, 所有会出现TOO_MANY_ROWS例外。
(3)WHERE 子句使用注意事项
变量名不能与列名相同。会发生TOO_MANY_ROWS例外。
DECLARE
empno NUMBER(6) :=7788;
v_ename VARCHAR2(10);
BEGIN
SELECT ename INTO v_ename FROM emp
WHERE empno = empno;
END;
DECLARE
*
ERROR 位于第一行:
ORA-01422:实际返回的行数超出请求的行数
ORA-06512:在line 5
操纵数据
插入数据
示例一:在PL/SQL块中使用VALUES子句插入数据
DECLARE
v_deptno dept.deptno%TYPE;
v_dname dept.dname%TYPE;
BEGIN
v_deptno:=&no;
v_dname:='&name';
INSERT INTO dept (deptno,dname)
VALUES(v_deptno, v_dname);
END;
示例二: 使用子查询插入数据
DECLARE
v_deptno emp.deptno%TYPE := &no;
BEGIN
INSERT INTO employee
SELECT * FROM emp WHERE deptno = v_deptno
END;
更新数据
示例一:使用表达式更新列值
DECLARE
v_deptno dept.deptno%TYPE:=&no;
v_loc dept.loc%TYPE:='&loc';
BEGIN
UPDATE dept SET loc=v_loc
WHERE deptno = v_deptno;
END;
/
输入no的值: 50
输入loc的值: BEIJING
示例二:使用子查询更新列值
DECLARE
v_ename emp.ename%TYPE:=‘&name’;
BEGIN
UPDATE emp SET (sal, comm)=
(SELECT sal, comm FROM emp WHERE ename=v_ename)
WHERE job=(SELECT job FROM emp WHERE ename= v_ename);
END;
删除数据
示例一:使用变量删除数据
DECLARE
v_deptno dept.deptno%TYPE:=&no;
BEGIN
DELETE FROM dept WHERE deptno = v_deptno;
END;
示例二:使用子查询删除数据
DECLARE
v_ename emp.ename%TYPE :='&name';
BEGIN
DELETE FROM emp
WHERE deptno=(SELECT deptno FROM emp
WHERE ename = v_ename);
END;
SQL游标
SQL%ISOPEN
游标属性SQL%ISOPEN 用于确定SQL游标是否已经打开。当直行sql语句时候,ORACLE会隐含地打开游标,
并且在执行完后,隐含地关闭游标。所以对于开发人员,该属性值永远是FALSE。并且在开发
PL/SQL应用时不需要使用该游标属性。
SQL%FOUND
用于确定SQL语句执行是否成功。 注意,SQL语句执行是否成功是根据是否有作用行来判断。
当SQL语句有作用行时,其属性值为TRUE;当SQL语句没有作用行时, 其属性值为FALSE。
DECLARE
v_deptno emp.deptno%TYPE:=&no
BEGIN
UPDATE emp SET sal=sal*1.1
WHERE deptno=v_deptno;
IF SQL%FOUND THEN
dbms_output.put_line('语句执行成功');
ELSE
dbms_output.put_line('该部门不存在雇员');
END IF;
END;
SQL%NOTFOUND
用于确定SQL语句执行是否成功。 注意,SQL语句执行是否成功是根据是否有作用行来判断。
当SQL语句有作用行时,其属性值为FALSE;当SQL语句没有作用行时, 其属性值为TRUE。
DECLARE
v_deptno emp.deptno%TYPE:=&no
BEGIN
UPDATE emp SET sal=sal*1.1
WHERE deptno=v_deptno;
IF SQL%NOTFOUND THEN
dbms_output.put_line('该部门不存在雇员');
ELSE
dbms_output.put_line('语句执行成功');
END IF;
END;
SQL%ROWCOUNT
游标属性SQL%ROWCOUNT 用于返回SQL语句所作用的总行数。
DECLARE
v_deptno emp.deptno%TYPE:=&no;
BEGIN
UPDATE emp SET sal=sal*1.1
WHERE deptno=v_deptno;
dbms_output.put_line('修改了'||SQL%ROWCOUNT||''行);
END;