PL/SQL检索单行数据和游标

2 篇文章 0 订阅
2 篇文章 0 订阅

检索单行数据
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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值