一、TRUNCATE
语法
TRUNCATE TABLE TableName
特点
1、删除表全部内容,但保留表结构
2、速度快,但不可回滚,要三思
3、触发器中没有TRUNCATE,即这个语句无法触发任何操作
4、行标识的序号重置(或者可以说:新行标识所用的计数值重置为该列的种子)
5、DELETE语句每删除一条记录都是一个事务,会产生若干"日志"。但TRUNCATE是释放整个数据页(一个页8K),所以解释了上述的第二点。
二、 IMMEDIATE
2.1 在PL/SQL运行DDL语句
在Oracle存储过程中,可以使用exectue immediate语句绕开编译时对DDL语句的检查,生成运行代码。
begin
execute immediate 'set role all';
end;
2.2 给动态语句传值
declare
l_depnam varchar2(20) := 'testing';
l_loc varchar2(10) := 'D?i';
begin
execute immediate 'insert into dept vals (:1, :2, :3)' using 50, l_depnam, l_loc;
commit;
end;
2.3 从动态语句检索值
declare
l_cnt varchar2(20);
begin
execute immediate 'select count(1) from emp'
into l_cnt;
dbms_output.put_line(l_cnt);
end;
2.4 动态调用例程
例程中用到的绑定变量参数必须指定参数类型。
黓认为IN类型,其它类型必须显式指定。
declare
l_routin varchar2(100) := 'gen2161.get_rowcnt';
l_tblnam varchar2(20) := 'emp';
l_cnt number;
l_status varchar2(200);
begin
execute immediate 'begin ' || l_routin || '(:2, :3, :4); end;'
using in l_tblnam, out l_cnt, in out l_status;
if l_status != 'OK' then
dbms_output.put_line('error');
end if;
end;
2.5 将返回值传递到PL/SQL记录类型
同样也可用%rowtype变量。
declare
type empdtlrec is record (empno number(4),
ename varchar2(20),
deptno number(2));
empdtl empdtlrec;
begin
execute immediate 'select empno, ename, deptno ' ||
'from emp where empno = 7934'
into empdtl;
end;
2.6 传递并检索值
INTO子句用在USING子句前。
declare
l_dept pls_integer := 20;
l_nam varchar2(20);
l_loc varchar2(20);
begin
execute immediate 'select dname, loc from dept where deptno = :1'
into l_nam, l_loc
using l_dept ;
end;
2.7 多行查询选项
对此选项用insert语句填充临时表。
用临时表进行进一步的处理,也可以用REF cursors纠正此缺憾。
declare
l_sal pls_integer := 2000;
begin
execute immediate 'insert into temp(empno, ename) '||'select empno, ename from emp '||'where sal > :1'
using l_sal;
commit;
end;
三、CASE WHEN
-- 简单Case函数 使用表达式确定返回值
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END
-- Case搜索函数 使用条件确定返回值
CASE
WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' END
这两种方式,可以实现相同的功能。简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判断式。还有一个需要注意的问题,Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略。
SELECT * FROM ACCOUNT;
SELECT
ID,
NAME,
CASE
WHEN POSITION = 1 THEN
'管理员'
WHEN POSITION = 2 THEN
'普通用户' ELSE '游客'
END CASE
FROM
ACCOUNT;