数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

Oracle中使用的若干技术经典总结


发布日期:2022年05月02日
 
Oracle中使用的若干技术经典总结

怎么样让我的用户名和密码不洩漏?

=====================

在unix下我用sqlplus sys/sys登陆别的用户很容易就能看到我的密码怎么办?

$ ps ef|grep sqlplus

oracle :: pts/ : sqlplus sys/sys

oracle :: pts/ : grep sqlplus

采用sqlplus /nolog

sql>connect sys/sys这样别的用户就看不到你的密码啦

怎样生成建表的完整的DDL语句?

====================

用exp 再Impshow=y可以看到

或者使用某些Oracle 的小工具比如quest的toad和sql*navigator

truncate table和delete table有些什么区别?

==========================

truncate: DDL no rollback possibility and no rollback segment usage quick release space used by the table except the original one

delete: dml can rollback use rollback space not release space slow delete large table may cause ora error

如何删除重复的记录

=============

第一个办法 生成建表的完整DDL语句并且生成tab_bak的表名

insert into tab_bak select distinct * from tab_name;

drop table tab_name rename tab_bak to tab_name;

第二个办法

DELETE FROM table_name A WHERE ROWID >

( SELECT min(rowid) FROM table_name B

WHERE Akey_values = Bkey_values);

第三个办法

Delete from my_table where rowid not in

( SQL> select max(rowid) from my_table

group by my_column_name );

第四个办法

delete from my_table t

where exists (select x from my_table t

where tkey_value = tkey_value

and tkey_value = tkey_value

and trowid > trowid);

如何快速为已有的表加上一个主键?

=====================

加上一个非空的列比如seqno然后

update table_name set seqno=rownum;

或者

CREATE SEQUENCE testseq START WITH INCREMENT BY ;

update table_name set seqno=testseqnextval;

SQL排序问题我怎么才能选择出按照某个列排序后前N行来?

=====================================

在SQL*Server 里面可以用这样的语句select top colcol from table_name;

从Oraclei开始支持这样的语法(在子查询里面使用order by语句)

select * from (select colcol from table_name order by colcol)

where rownum<;

这样就能够起到同样的效果

在Oracle或者以下可以这样

SELECT colcol FROM

(SELECT /*+ INDEX_DESC (table_name index_name) */ colcol FROM table_name)

WHERE rownum < ;

使用提示可以让Oracle在子查询返回结果之前先对他进行排序一般可以使用hintINDEX_DESC(TABLE_NAMEINDEX_NAME)来起到这个作用

我们可以分别查看两个SQL的执行计划

scott@testdb> select * from sort_sample;

ID NAME

aa

s

fdisk

format

low format

rows selected

scott@testdb> create index sort_id_idx on sort_sample(id);

Index created

scott@testdb> set autotrace on explain

scott@testdb> way :

scott@testdb> select * from (select * from sort_sample order by id desc) where rownum<;

ID NAME

s

Execution Plan

SELECT STATEMENT Optimizer=CHOOSE

COUNT (STOPKEY)

VIEW

SORT (ORDER BY STOPKEY)

TABLE ACCESS (FULL) OF SORT_SAMPLE

scott@testdb> way :wrong result

scott@testdb> select * from sort_sample where rownum<;

ID NAME

aa

Execution Plan

SELECT STATEMENT Optimizer=CHOOSE

COUNT (STOPKEY)

TABLE ACCESS (FULL) OF SORT_SAMPLE

scott@testdb> ANALYZE TABLE SORT_SAMPLE COMPUTE STATISTICS;

Table analyzed

scott@testdb> ANALYZE INDEX SORT_ID_IDX COMPUTE STATISTICS;

Index analyzed

scott@testdb> way : can work in oracle and oracle

scott@testdb> select * from (select /*+index_desc(sort_sample sort_id_idx)*/ * from sort_sample)

where rownum<;

ID NAME

aa

//原因col sort_id_idx列为nullable所以CBO不能确定加上not null约束即可达到目的

用group by可以生成从小开始的排序

scott@testdb> SELECT IDNAME FROM

(SELECT IDNAMECOUNT(*) FROM SORT_SAMPLE GROUP BY ID NAME)

WHERE ROWNUM<;

ID NAME

aa

low format

Execution Plan

SELECT STATEMENT Optimizer=CHOOSE (Cost= Card= Bytes=)

COUNT (STOPKEY)

VIEW (Cost= Card= Bytes=)

SORT (GROUP BY STOPKEY) (Cost= Card= Bytes=)

TABLE ACCESS (FULL) OF SORT_SAMPLE (Cost= Card=

怎么每隔N条记录获得一条记录?比如第等?

=================================

CHAO@PING>select * from testseq;

ID NAME

this is th record

this is th record

this is th record

this is th record

this is th record

this is th record

this is th record

this is th record

this is th record

this is th record

rows selected

CHAO@PING>select id name from

(select id name rownum rz from testseq) temp

where mod(rz)=;

ID NAME

this is th record

this is th record

this is th record

CHAO@PING>

如何删除一个列?

===========

从Oraclei开始Oracle支持一个列的删除语法如下

alter table tab_name drop column col;

如何重命名一个列?

==============

CHAO@PING> create table testrename(id number nama varchar());

Table created

CHAO@PING> begin

for x in loop

insert into testrename values(xthis is ||to_char(x)||th record);

end loop;

end;

/

PL/SQL procedure successfully completed

CHAO@PING> commit;

Commit complete

CHAO@PING> alter table testrename add name varchar();

Table altered

CHAO@PING> update testrename set name=nama;

rows updated

CHAO@PING> alter table testrename drop column nama;

Table altered

CHAO@PING> select * from testrename;

ID NAME

上一篇:Oracle创建表空间

下一篇:让PL/SQL Developer记住登陆密码