plsql 语法

1.   where 1=2

作用:用于创建一个表和别的表结构一样的。

例:
create table 新表名 as select * 
from 源表 where 1=2

2.  USERENV用法

USERENV( parameter )

作用:用于返回当前oracle的session


例:
Terminal:=USERENV('TERMINAL');
返回OS的当前session

3 .   insert into select 与select into区别

在oracle中,将一张表的数据复制到另外一个对象中。通常会有这两种方法:insert into select  和 select into from。

前者可以将select 出来的N行(0到任意数)结果集复制一个新表中,后者只能将"一行"结果复制到一个变量中。这样说吧,

select into是PL/SQL language 的赋值语句。而前者是标准的SQL语句。

4.  表空间tablespace

表空间是数据库的逻辑划分,一个表空间只能属于一个数据库。所有的数据库对象都存放在指定的表空间中。但主要存放的是表, 所以称作表空间。Oracle临时表空间主要用来做查询和存放一些缓冲区数据。临时表空间,可自动释放;而表空间中存储表数据、函数、过程、序列等。是随数据库永久存在的。表空间是建立在一个或者多个数据文件上的。默认表空间是USERS
创建表空间:
create tablespace DATATEST 
datafile 'D:\SERVER\DATABASE\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\DATATEST.dbf'
size 100M 
autoextend ON 
next 10M 
maxsize 200M;



创建临时表空间:
create temporary tablespace DATATEST_TEMP 
tempfile 'D:\SERVER\DATABASE\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\DATATEST_TEMP.dbf' 
size 50M 
autoextend ON 
next 10M 
maxsize 100M; 


#创建表空间
create  tablespace shopping --创建表空间shopping
datafile 'shopping.dbf'  --表空间使用的数据文件
size 50m  --大小50m
autoextend on  --自动扩展
next 50m maxsize 20480m  --最大可到20480m
extent management local;

比如你这个表空间创建好了你可以建立一个用户,给这个用户设置默认表空间为这个 shopping 语句如下:
create user joling identified by 1qaz2wsx   #创建一个用户joling/1qaz2wsx
default tablespace shopping   #分配一个默认的表空间shopping
其它用户建表的时候也可以使用这个表空间 
比如建表的时候:
create table test (id int) tablespace shopping--前边的建表语句不变,最后加一个使用表空间。

注:表空间只是方便管理

5.over(partition by)分析函数

实现组内累加;group by只能列出group 字段,但是分析函数,可以把表中的不group的字段也列出来。

over(partiton by)用处:
比如初中一年假,有很多班,你用普通的order by只能排出总的名次。
如果要实现班级的前3名,就要写很多sql, 但是用分析函数的排序功能,一步就能实现。
例如:统计各班成绩第一名的同学信息
    NAME   CLASS Score                        
    ----- ----- ---------------------- 
    fda    1      80                     
    ffd    1      78                     
    dss    1      95                     
    cfe    2      74                     
    gds    2      92                     
    gf     3      99                     
    ddd    3      99                     
    adf    3      45                     
    asdf   3      55                     
    3dd    3      78              
   
    通过:   
    --
    select * from                                                                       
    (                                                                            
    select name,class,score,rank()over(partition by class order by score desc) mm from t2
    )                                                                            
    where mm=1 
    --
    得到结果:
    NAME   CLASS Score                MM                                                                                        
    ----- ----- ---------------------- ---------------------- 
    dss    1      95                      1                      
    gds    2      92                      1                      
    gf     3      99                      1                      
    ddd    3      99                      1          
   
    注意:
    1.在求第一名成绩的时候,不能用row_number(),因为如果同班有两个并列第一,row_number()只返回一个结果         
    2.rank()和dense_rank()的区别是:
      --rank()是跳跃排序,有两个第二名时接下来就是第四名
      --dense_rank()l是连续排序,有两个第二名时仍然跟着第三名

6.where current of 

游标之select for update和where current of 语句,当游标使用了select for update要进行update表和delete操作时才要使用where current of。 
使用select for update语句可以使用行锁锁定你要更改的记录.以免别人更改之类的。
当遇到下一个commit和rollback语句时会被释放.

语法如下:The syntax for the Select For Update is:

CURSOR cursor_name
IS
   select_statement
   FOR UPDATE [of column_list] [NOWAIT];
当你要使用游标进行更新和删除操作时,则需要使用where current of 语句,这个是标示出当前游标的位置.


语法如下:The syntax for the Where Current Of statement is either:

UPDATE table_name
    SET set_clause
    WHERE CURRENT OF cursor_name;
OR
DELETE FROM table_name
WHERE CURRENT OF cursor_name;

举例如下:

例:更新
Declare
	cursor test_cur
		IS
			select * from test 
			for update of sal;
BEGIN
	for test_rec IN test_cur Loop
	update test set sal=test_rec.sal+1 where current of test_cur;
	end Loop;
	commit;
END;

例:删除
Declare
	cursor test_cur IS
		select * from test for update;
BEGIN
	For test_rec IN test_cur LOOP
	delete from test where current of test_cur;
	end LOOP;
END;
     

7.purge

清除oracle 回收站(recyclebin)中的表和索引并释放与其相关的空间,还可清空回收站,或者清除表空间中记录的已删除的部分表空间。

注意:purge后不能回滚rollback和恢复(闪回flashback)。

purge和drop的区别:

查看回收站:
SELECT * FROM RECYCLEBIN;  

清除回收站:
PURGE recyclebin;

若删除表不进入recycle:
drop table tableName purge;
一般删除的表是进入回收站中:
drop table tablename;

用drop不小心删除了的表可以闪回:
例如:
drop table goodsinfo1;
commit;
删除错了,恢复,可以用flashback drop的功能:
show recyclebin;
FLASHBACK TABLE goodsinfo1 TO BEFORE DROP;
闪回成功,查看:
select count(*) from goodsinfo1;

若用purge table goodsinfo2是不可以恢复的。它不进入recyclebin的。

8.where子句中的LNNVL函数

lnnvl用于某个语句的where子句中的条件,如果条件为真就返回真,否则为假。

其含义可理解为LNNVL == IS NULL OR IS NOT TRUE

Condition=false——>true
Condition=true——>false
Condition 结果未知——>true

它的优势在于处理简单条件判断无法实现的null条件,用举例说明

SQL> select * from plch_employees;
 EMPLOYEE_ID LAST_NAME           SALARY              COMMISSION_PCT
--------------------------------------- -------------------------------------
           300      O'Keefe                1000000
           100      Picasso                 1000000             0.3
            200    Mondrian               1000000            0.15
 
如果要查询commision)不大于20%, 或者为NULL的员工的姓名,则可以用下面
SQL> SELECT last_name FROM plch_employees e WHERE LNNVL (e.commission_pct > .2);
 
LAST_NAME
--------------------------------------------------------------------------------
O'Keefe
Mondrian
查出小于commision0.2和为null的值,这种方法可以查询出null的值是比较方便的。
selectempno,ename from scott.emp where LNNVL(DEPTNO=0);

9.COALESCE

COALESCE(expr1,expr2……) 如果第一个为NULL就判断第二个,如果第二个为NULL判断第三个,直到最后一个

selectCOALESCE(null,1) a1,COALESCE(null,null,1) a2,COALESCE(null,null) a3 from dual;

10.NANVL

NANVL(n1,n2) 如果n1是数字就返回n1,否则返回n2

select NANVL(1.24,2) a1,NANVL(deptno,2) a2 from scott.emp;

11.NULLIF

NULLIF(expr1,expr2) 如果expr1=expr2返回null,否则返回expr1

selectNULLIF(1,1) a1,NULLIF(1,2) a2 from dual;
12.NVL

NVL(expr1,expr2) 如果expr1为NULL则返回expr2,否则返回expr1

select NVL(NULL,'A') a1,NVL(1,2) a2from dual;

13.NVL2

NVL2(expr1,expr2,expr3)如果expr1不为NULL返回expr2,否则返回expr3

select NVL2(NULL,'A','B')a1,NVL2(NULL,NULL,'Hello')a2,NVL2('A',NULL,'Hello') a3,NVL2('A','A','Hello') a4 from dual;

猜你喜欢

转载自blog.csdn.net/u012474716/article/details/79865072