常用sql(一)

查看所有SEQUENCES:
select sequence_name from  USER_SEQUENCES;

修改表字段不允许为空
alter table table_name modify cloumn_name not null;

查询序列
select seq_major_site_reg.nextval from dual;

添加主键
alter table table_name add constraint PK_SEEDSITE_ID primary key (ID);

导入.sql文件
su - oracle
sqlplus username/password@orclname
@/tmp/filename.sql

-------------------------------------------------

Oracle Temporary Tables(Oracle 临时表)

1. 建立临时表语法

A.ON COMMIT DELETE ROWS 定义了建立事务级临时表的方法

CREATE GLOBAL TEMPORARY TABLE TABLE_NAME

-----(COUMNS …)

-----AS SELECT … FROM TABLE…

ON COMMIT DELETE ROWS;

当前session发出commit/rollback命令,则该事务周期发生的所有数据自动被Oracle删除(Oracle truncate table)。但不影响任何其他session的数据。

B.ON COMMIT PRESERVE ROWS 定义了创建会话级临时表的方法

CREATE GLOBAL TEMPORARY TABLE TABLE_NAME

-----(COUMNS …)

-----AS SELECT … FROM TABLE…

ON COMMIT PRESERVE ROWS;

当前session结束(用户正常退出 / 用户不正常退出 / Oracle实例崩溃),Oracle对这个会话的中发生的数据进行删除(Oracle truncate table)。但不影响任何其他session的数据。

2. 特点说明

A.临时表数据自动清空后,但是临时表的结构以及元数据还存储在用户的数据字典中。表的定义对所有的会话可见

B.临时表不需要DML锁

C.可以索引临时表和在临时表基础上建立视图

D.在临时表上的索引也是临时的,也是只对当前会话或者事务有效

E.临时表可以拥有触发器

F.可以用export和import工具导入导出临时表的定义,但是不能导出数据

3. 使用技巧

A.当某一个SQL语句关联的表在2张及以上,并且和一些小表关联。可以采用将大表进行分拆并且得到比较小的结果集合存放在临时表中

B.程序执行过程中可能需要存放一些临时的数据,可以将这类数据放在临时表里非常方便

C.存储过程中用到临时表:

1> 在建立临时表前,应先加上对表名的判断

Select count(*) into v_count from user_tables where table_name = ‘XXX’;

If v_count=0 then

Create global temporary table …

在存储过程结束处,应该记得删除表

execute immediate 'drop table t_temp';


4、查看锁表信息
SELECT l.session_id sid, s.serial#, l.locked_mode, l.oracle_username, s.user#,
       l.os_user_name,s.machine, s.terminal,a.sql_text, a.action 
     FROM v$sqlarea a,v$session s, v$locked_object l
    WHERE l.session_id = s.sid
      AND s.prev_sql_addr = a.address
ORDER BY sid, s.serial#;

5、解除锁表
alter system kill session 'sid,serial#';
例:alter system kill session '135,16';

--以下几个为相关表
SELECT * FROM v$lock;
SELECT * FROM v$sqlarea;
SELECT * FROM v$session;
SELECT * FROM v$process ;      
SELECT * FROM v$locked_object;  
SELECT * FROM all_objects;  
SELECT * FROM v$session_wait;

1.查出锁定object的session的信息以及被锁定的object名
SELECT l.session_id sid, s.serial#, l.locked_mode,l.oracle_username,
       l.os_user_name,s.machine, s.terminal, o.object_name, s.logon_time
    FROM v$locked_object l, all_objects o, v$session s
   WHERE l.object_id = o.object_id
     AND l.session_id = s.sid
ORDER BY sid, s.serial# ;

2.查出锁定表的session的sid, serial#,os_user_name, machine name, terminal和执行的语句
--比上面那段多出sql_text和action
SELECT l.session_id sid, s.serial#, l.locked_mode, l.oracle_username, s.user#,
       l.os_user_name,s.machine, s.terminal,a.sql_text, a.action 
     FROM v$sqlarea a,v$session s, v$locked_object l
    WHERE l.session_id = s.sid
      AND s.prev_sql_addr = a.address
ORDER BY sid, s.serial#;
     
3.查出锁定表的sid, serial#,os_user_name, machine_name, terminal,锁的type,mode
SELECT s.sid, s.serial#, s.username, s.schemaname, s.osuser, s.process, s.machine,
       s.terminal, s.logon_time, l.type
    FROM v$session s, v$lock l
   WHERE s.sid = l.sid
     AND s.username IS NOT NULL
ORDER BY sid;

4. case语句:

SELECT count(*) cnt, field
    FROM (SELECT case
                   when salary < 1000 then
                    '饥饿'
                   WHEN salary >= 1000 and salary <= 1500 THEN
                    '温饱'
                   WHEN salary > 1500 and salary <= 2000 THEN
                    '富裕'
                   WHEN salary > 2000 and salary <= 2500 THEN
                    '小康'
                   ELSE
                    '太富了'
                 END field
            FROM persion) a
   GROUP by field;

5.根据某一条件查出星期
select to_char(to_date(' 2009-03-09 ', ' yyyy-mm-dd ') + rownum - 1, 'DAY') as 星期,
       to_date(' 2009-03-09 ', ' yyyy-mm-dd ') + rownum - 1 as 日期
  from user_objects
where rownum <= (to_date(' 2009-03-09 ', ' yyyy-mm-dd ') + 7 -
       to_date(' 2009-03-09 ', ' yyyy-mm-dd '));

6、在数据库服务器上 查看 那台机器连接到了数据库,连接的会话数是多少
select count(*),machine  from v$session v group by machine;


7、查看当前session执行的sql
SELECT/*+ordered*/ a.username,
   a.machine,
   a.program,
   a.sid,
   a.serial#,
     c.hash_value,
     b.spid,
   a.status,
   c.piece,
   c.sql_text
 FROM v$session a,
   v$process b,
   v$sqltext c
WHERE a.STATUS='ACTIVE'
   AND b.addr=a.paddr
   AND a.sql_address=c.address(+)
     and a.sid>10
     and a.AUDSID<>userenv('sessionid')
     and a.username is not null
  /*   and sid=239*/
ORDER BY A.SID,c.piece;

你可能感兴趣的:(oracle,sql,C++,c,OS)