1)SQL语句形式:
SELECT column_list -----指定要查看列
FROM table_list -------指定包括列的表
WHERE condition -------限制返回的数据,只能查看到满足条件的行
GROUP BY column_list -----根据指定列值汇总数据
HAVING condition ----限制汇总数据(与GROUP BY 成队使用)
ORDER BY column_list -----根据指定列排序
如果需要在字符串内放入单引号,些两次即可.
例:DON’’T
HAVING子句与WHERE子句的相互间比较:
HAVING子句用分组函数后的结果作为条件.而WHERE子句不允许这样使用.
2)连接查询结果
UNION----连接两条SELECT语句,排除重复行
UNION ALL----连接两条SELECT语句,不排除重复行
MINUS----从一个查询中减去另一个查询
INSERSECT---返回两条SELECT语句的重复行
3)插入一个查询结果
INSERT INTO A(COLA,COLB,….)
SELECT COLa,COLb,….
FROM B
WHERE ….;
4)使用相关子查询更新数据
UPDATE TAB_A A
SET (COLa,COLb,….)=
(SELECT COLA,COLB
FROM TAB_B B
WHERE A.PK=B.PK)
WHERE A…….
5)事务处理
事务的开始:
当第一条DML语句开始执行时
前一个事务结束后
调用SET TRANSACTION来显式开始一个事务
事务的结束:
遭遇COMMIT或ROLLBACK(将缓冲区数据写入数据库或清除).
SET TRANSACTION—用来显式开始一个事务
格式: SET TRANSACTION READ ONLY|READ WRITE
[USE ROLLBACK SEGMENT 回滚段名];
READ ONLY--事务处理时只能做查询,存在DML语句时会报错.
READ WRITE--事务处理时可以读写.
例: BEGIN
ROLLBACK;
SET TRANSACTION READ WRITE;
INSERT INTO TEST(A)
VALUES(5);
COMMIT;
END;
��� SAVEPOINT—设置检查点(常与ROLLBACK TO SAVEPOINT 检查点名 配套使用)
格式: SAVEPOINT 检查点名
例: BEGIN
ROLLBACK;
SAVEPOINT SP1;
INSERT INTO A(A)
VALUES(5);
SAVEPOINT SP2;
INSERT INTO A(A)
VALUES(6);
SAVEPOINT SP3;
INSERT INTO A(A)
VALUES(7);
ROLLBACK TO SAVEPOINT SP3;
COMMIT;
END;
第一,二条数据INSERT成功,第三条数据被ROLLBACK.
八 动态SQL
执行动态SQL语句有两种方法:
1)调用DBMS_SQL包
2)本机动态SQL
格式:
EXECUTE IMMEDIATE SQL_STRING
---包含SQL的字符串表达式
[INTO 变量名列表]
---仅在单行查询时可用逗号分隔
[USING [IN|OUT|INOUT]bind_argument,….]
---绑定输入输出参数.缺省为IN
[[RETURNING|RETURN] INTO bind_argument,….]
---仅用于DML语句,检索返回的数据被绑定到这里.
例:
插入数据
DECLARE
lv_sql VARCHAR2(100):= '';
lv_1 number:=2;
lv_2 number;
BEGIN
lv_sql := 'insert into A values(:1)';
EXECUTE IMMEDIATE lv_sql USING lv_1;
-SELECT 值到lv_2中
lv_sql :=’SELECT A FROM A WHERE A =:ID’;
EXECUTE IMMEDIATE lv_sql INTO lv_2 USING lv_1;
--将A表中A字段为5的记录设为4,并输出到lv_2中
Lv_sql := 'UPDATE YJQ SET A=:arg1 WHERE A= :arg2 RETURNING A INTO :arg3';
EXECUTE IMMEDIATE lv_sql USING 4 ,5 , OUT lv_2;
或者EXECUTE IMMEDIATE lv_sql USING 4,5 RETURNING INTO lv_2;
END;
返回游标
TYPE REF_CUR IS REF CURSOR;
OPEN REF_CUR FOR lv_sql;