1 检索单行数据
在PL/SQL块中使用select语句,可以将数据库数据检索到变量中。
当在PL/SQL块中使用select语句时,必须要带有into子句。语法如下:
SELECT select_list
INTO {variable_name[,variable_name]... | record_name}
FROM table_name
WHERE condition;
其中,select_list为指定查询列;variable_name为接收指定查询列的标量变量名;record_name为接收指定查询列的记录变量名
1.1 使用标量变量接收数据
使用标量变量接收 SELECT 语句的输出结果时,变量个数要与 SELECT 选择项相同,且变量类型和长度要匹配。
DECLARE
v_name USER.ename%TYPE;
v_age USER.age%TYPE;
BEGIN
SELECT name, age
INTO v_name, v_age
FROM USER
WHERE UID = &id;
DBMS_OUTPUT.put_line ('姓名:' || v_name);
DBMS_OUTPUT.put_line ('年龄:' || v_age);
END;
1.2 使用记录变量接收数据
使用记录变量接受数据时,记录成员的个数必须与选择列表项个数完全一致,且数据类型和长度要相匹配。上述例子使用记录变量可写成:
DECLARE
TYPE user_record_type IS RECORD (
name user.name%TYPE,
age user.age%TYPE
);
user_record user_record_type;
BEGIN
SELECT name,age into user_record
FROM user
WEHRE uid = &id;
dbms_output.put_line('姓名:'||user_record.name);
dbms_output.put_line('年龄:'||user_record.age);
END;
1.3 嵌入使用 SELECT ... INTO ... FROM ... [WHERE] 语句注意事项
1.3.1 在PL/SQL块中使用 SELECT INTO 语句时,该语句只能返回一条数据;
1.3.2 当3.1不成立时,会触发以下异常:
1.3.2.1 NO_DATA_FOUNT 异常:
该异常发生在 SELECT INTO 语句没有返回任何数据时
1.3.2.2 TOO_MANY_ROWS 异常:
该异常发生在 SELECT INTO 语句没有返回多条数据时
以上两个异常在没有捕获时将会将异常信息传递到调用环境中。
2 操作数据
2.1 插入数据
SQL*Plus 语法
:
INSERT INTO <table> [(column[,column,...])]
VALUES(value[,value,...])
或者
INSERT INTO <table> [(column[,column,...])] SubQuery
PL/SQL中与SQL*Plus INSERT数据相同,只不过在提供数值时需要使用PL/SQL变量。
2.1.1 在PL/SQL中使用INSERT VALUES插入数据
DECLARE
v_name USER.name%TYPE;
v_age USER.age%TYPE;
BEGIN
v_name := '&name';
v_age := &age;
INSERT INTO USER (name, age)
VALUES (v_name, v_age);
END;
2.1.2 在PL/SQL中使用子查询插入数据
DECLARE
v_deptno dep.no%TYPE;
BEGIN
INSERT INTO USER (name, age)
SELECT name, age
FROM dep
WHERE no = v_deptno;
END;
2.2 更新数据
SQL*Plus 语法
:
UPDATE <table|view>
SET <column> = <value> [, <column> = <value>...]
[WHERE <conditon>];
PL/SQL:
DECLARE
v_name USER.name%TYPE := '&name';
v_age USER.age%TYPE := &age;
BEGIN
UPDATE USER
SET name = v_name, age = v_age
WHERE UID = 1;
END;
DECLARE
v_uid user.uid%TYPE := &id;
BEGIN
UPDATE user SET (name,age) = (
SELECT name,age FROM user_tmp where uid_tmp = v_uid;
) WHERE uid = v_uid;
END;
2.3 删除数据
SQL*Plus 语法
:
DELETE FROM <table|view> [WHERE <condition>];
PL/SQL:
DECLARE
v_uid USER.UID%TYPE := &id;
BEGIN
DELETE FROM USER
WHERE UID = v_uid;
END;
DECLARE
v_age USER.age%TYPE := &age;
BEGIN
DELETE FROM USER
WHERE UID IN (SELECT tmp_uid
FROM user_tmp
WHERE age = v_age);
END;
2.4 SQL游标
执行 SELECT、INSERT、UPDATE、DELETE语句时,Oracle Service 会为这些SQL语句分配相应的上下文(Context Area).ORACLE使用上下文解析并执行SQL。而游标是指向上下文区的指针。
ORACLE中,游标包括隐式游标
和显式游标
。
隐式游标又被称作SQL游标,专用于处理 SELECT INTO,INSERT,UPDATE及DELETE语句;显式游标则用于处理多行SELECT语句。
在PL/SQL块中执行INSERT,UPDATE,DELETE时,为了取得DML语句作用的结果,必须要使用SQL游标属性。SQL游标属性包括:
2.4.1 SQL%ISOPEN 属性
该属性用于确定SQL游标是否已经打开。在PL/SQL块中执行SELECT INTO,INSERT,UPDATE及DELETE时,Oracle会隐含的打开游标,并且在执行完成后隐含的关闭游标。
该属性在实际的开发过程中可以不用考虑。
2.4.2 SQL%FOUND 属性
该属性用于确定SQL语句执行是否成功(是否有作用行)。当SQL语句有作用时,其属性为TRUE;否则为FALSE;
DECLARE
v_uid USER.UID%TYPE := &id;
BEGIN
UPDATE USER
SET age = 100
WHERE UID = v_uid;
IF SQL%FOUND
THEN
DBMS_OUTPUT.put_line ('语句执行成功');
ELSE
DBMS_OUTPUT.put_line ('语句执行失败');
END IF;
END;
2.4.3 SQL%NOTFOUND 属性
与SQL%FOUND 属性相反。有作用行时为FALSE,无作用行时为TRUE;
DECLARE
v_uid USER.UID%TYPE := &id;
BEGIN
UPDATE USER
SET age = 100
WHERE UID = v_uid;
IF SQL%NOTFOUND
THEN
DBMS_OUTPUT.put_line ('用户表中不存在该用户');
ELSE
DBMS_OUTPUT.put_line ('语句执行成功');
END IF;
END;
2.4.4 SQL%ROWCOUNT 属性
该属性用户统计SQL语句的作用行数。如果没有作用行,则返回0;
DECLARE
v_uid USER.UID%TYPE := &id;
BEGIN
UPDATE USER
SET age = 100
WHERE UID = v_uid;
DBMS_OUTPUT.put_line ('修改了' || SQL%ROWCOUNT || '行');
END;
3 事务控制
PL/SQL块中的事务同SQL*Plus直接使用事务语句(COMMIT,ROLLBACK,SAVEPOINT).
- COMMIT : 提交事务
- ROLLBACK : 回滚事务
- SAVEPOINT : 设置事务保存点
DECLARE
v_uid user.uid%TYPE :=&id;
BEGIN
UPDATE SET age = 100 WHERE uid = v_uid;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
END;
BEGIN
INSERT INTO user(name,age) VALUEs('name1',20);
SAVEPOINT u1;
INSERT INTO user(name,age) VALUEs('name2',30);
SAVEPOINT u2;
INSERT INTO user(name,age) VALUEs('name3',40);
SAVEPOINT u3;
ROLLBACK TO u2; //回滚到第二条SQL,实际插入两条数据
COMMIT;
END;
分享到:
相关推荐
以下是对PL/SQL的学习笔记的详细解析: 1. **什么是PL/SQL语言** PL/SQL是Oracle数据库为数据库管理员和开发人员设计的一种编程语言。它扩展了SQL的功能,允许编写包含控制结构、变量、过程和函数的程序段,这些...
在PL/SQL中使用SQL语句时,分为DML语句(如INSERT、UPDATE、DELETE)和DDL语句(如CREATE、ALTER、DROP),以及事务控制语句(如COMMIT和ROLLBACK)。这些语句用于操作数据库的数据和结构。 PL/SQL中的SELECT语句...
在学习PL/SQL的过程中,理解这些基本概念和结构是至关重要的。通过实践编写存储过程、函数和触发器,你可以逐渐掌握PL/SQL的强大功能,并利用它来解决实际的数据库编程问题。对于初学者来说,循序渐进、结合实例学习...
### PL/SQL学习笔记4 —— 集合与成员函数 #### 一、PL/SQL 表(索引表) 在PL/SQL中,**索引表**(也称为**PL/SQL表**)是一种非常有用的结构,它类似于数组但具有更多的灵活性。这种表是非持久化的,即它们不会...
PL/SQL数据库学习笔记 PL/SQL是一种高级的程序语言,主要用于Oracle数据库管理系统中。下面是PL/SQL数据库学习笔记的知识点总结。 一、基本原则 *瀑布模型:需求分析→设计(概要设计,详细设计:SQL语句,变量...
在这个“我的PL/SQL学习笔记(一)”中,我们将探讨PL/SQL的基础知识,包括其语法结构、变量声明、流程控制以及如何与Oracle数据库中的数据进行交互。 首先,PL/SQL的基本结构分为声明部分、执行部分和异常处理部分...
下面将详细解释游标的基本概念、分类以及如何在PL/SQL中使用。 1. **游标**: - 游标本质上是一个指向结果集中的特定位置的指针。通过游标,开发者可以在每次迭代中访问结果集中的一条记录。 - 游标分为两类:...
总的来说,“PL/SQL超级笔记”应该涵盖了从基本语法到高级特性的全面教程,通过学习,新手可以逐步掌握如何使用PL/SQL进行数据库编程,从而更好地管理和操作Oracle数据库。配合"oracle_ppt"中的PPT材料,学习效果会...
ORACLE PL/SQL是从入门到精通的专业知识,涵盖了数据库开发与管理的多个方面,包括触发器、过程、函数、软件包、异常处理、游标、循环、分支、变量使用、数据库安装等关键知识点。 触发器是数据库中用来保证数据...
### PL/SQL听课笔记 #### 一、PL/SQL简介 **PL/SQL**(Procedural Language for SQL)是一种专门为Oracle数据库设计的过程化语言扩展。它是在标准SQL基础上增加了一系列高级编程特性,如变量、控制结构、函数、...
在PL/SQL编程中,存储过程和函数是关键的组件,它们允许我们将可重用的代码逻辑存储在数据库中,以便于管理和调用。本文主要探讨了存储过程、函数以及程序包的概念,特点,创建方法,执行方式,权限管理以及参数处理...
本文将深入探讨从"SQL,PL/SQL学习笔记"中提取的关键知识点,帮助编程人员更好地理解和运用这两种语言。 首先,我们关注SQL并行查询。通过`ALTER SESSION ENABLE PARALLEL DMl`,我们可以开启会话的并行DML操作,这...
在PL/SQL的学习中,分区是数据库管理大型数据集的一种高效方法,特别是在处理大数据量时。本篇笔记主要探讨了何时应该使用分区以及Oracle支持的分区类型。 首先,当面对超过2GB的大数据表时,分区是十分必要的。这...
Oracle SQL和PL/SQL是数据库管理和编程的重要工具,主要用于处理Oracle数据库中的数据。这篇课堂笔记主要涵盖了基础的SQL查询语法和部分PL/SQL概念。 首先,SQL查询的基础是从数据库中选择数据。`SELECT`语句用于...
以上是对 PL/SQL 学习笔记中提到的关键知识点的详细解释。这些概念对于理解和使用 PL/SQL 非常重要,尤其是在 Oracle 数据库开发中。掌握这些基础知识能够帮助开发者更高效地编写高质量的数据库应用程序。