一、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;

image-20201217152806258

SELECT
	ID,
	NAME,
CASE
		
		WHEN POSITION = 1 THEN
		'管理员' 
		WHEN POSITION = 2 THEN
		'普通用户' ELSE '游客' 
END CASE 
FROM
	ACCOUNT;

image-20201217152828154