读书人

经典SQL语句收集(ORACLE),该怎么处理

发布时间: 2012-02-21 16:26:23 作者: rapoo

经典SQL语句收集(ORACLE)
1、经典的查询语句
2、经典的字定义函数
3、经典的与业务相关的存储过程
等等



抛砖引玉:备注本人彩票迷
(有点缺陷)
create or replace function f_ssqrandom(priornum in integer,endnum in integer)
return varchar2
is
v_prior_rand integer :=0;
v_end_rand integer;
v_string string(32000):='红色球';
begin
for v in 1..5 loop
for v_count in 1..3 loop
v_prior_rand:=floor(dbms_random.value(1,priornum));

v_end_rand:=v_prior_rand;
<<random>>
v_prior_rand:=floor(dbms_random.value(1,priornum));
if v_prior_rand!=v_end_rand then
v_string:=v_string||','||v_prior_rand||','||v_end_rand;
else
goto random;
end if;
dbms_output.put_line(v_string);
end loop;
v_string:=v_string||' 蓝色球, '||floor(dbms_random.value(1,endnum))||' 红色球';
end loop;
return v_string;

end f_ssqrandom;

希望不要恶意回帖 MARK 顶的大哥大姐 放心理就行 小弟心领了

[解决办法]
查询新建用户
select username
from dba_users
where username not in
('TEXT', 'RMAN_USER', 'TEST', 'SCOTT', 'TSMSYS', 'MDDATA', 'DIP',
'DBSNMP', 'SYSMAN', 'MDSYS', 'ORDSYS', 'EXFSYS', 'DMSYS', 'WMSYS',
'CTXSYS', 'ANONYMOUS', 'XDB', 'ORDPLUGINS', 'SI_INFORMTN_SCHEMA',
'OLAPSYS', 'MGMT_VIEW', 'SYS', 'SYSTEM', 'OUTLN');


查询那些用户,操纵了那些表造成了锁机
SELECT s.username,
decode(l.type,'TM','TABLE LOCK',
'TX','ROW LOCK',
NULL) LOCK_LEVEL,
o.owner,o.object_name,o.object_type,
s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser
FROM v$session s,v$lock l,all_objects o
WHERE l.sid = s.sid
AND l.id1 = o.object_id(+)
AND s.username is NOT Null
其中 TM 为表锁定 TX 为行锁定


看锁阻塞的方法是
SELECT (select username FROM v$session WHERE sid=a.sid) blocker,
a.sid,
'is blocking',
(select username FROM v$session WHERE sid=b.sid) blockee,
b.sid
FROM v$lock a, v$lock b
WHERE a.block = 1
AND b.request > 0
AND a.id1 = b.id1
AND a.id2 = b.id2
[解决办法]
比如:获取系统信息:
select
SYS_CONTEXT('USERENV','TERMINAL') terminal,
SYS_CONTEXT('USERENV','LANGUAGE') language,
SYS_CONTEXT('USERENV','SESSIONID') sessionid,
SYS_CONTEXT('USERENV','INSTANCE') instance,
SYS_CONTEXT('USERENV','ENTRYID') entryid,
SYS_CONTEXT('USERENV','ISDBA') isdba,
SYS_CONTEXT('USERENV','NLS_TERRITORY') nls_territory,
SYS_CONTEXT('USERENV','NLS_CURRENCY') nls_currency,
SYS_CONTEXT('USERENV','NLS_CALENDAR') nls_calendar,
SYS_CONTEXT('USERENV','NLS_DATE_FORMAT') nls_date_format,
SYS_CONTEXT('USERENV','NLS_DATE_LANGUAGE') nls_date_language,
SYS_CONTEXT('USERENV','NLS_SORT') nls_sort,
SYS_CONTEXT('USERENV','CURRENT_USER') current_user,
SYS_CONTEXT('USERENV','CURRENT_USERID') current_userid,
SYS_CONTEXT('USERENV','SESSION_USER') session_user,
SYS_CONTEXT('USERENV','SESSION_USERID') session_userid,
SYS_CONTEXT('USERENV','PROXY_USER') proxy_user,
SYS_CONTEXT('USERENV','PROXY_USERID') proxy_userid,
SYS_CONTEXT('USERENV','DB_DOMAIN') db_domain,
SYS_CONTEXT('USERENV','DB_NAME') db_name,
SYS_CONTEXT('USERENV','HOST') host,
SYS_CONTEXT('USERENV','OS_USER') os_user,
SYS_CONTEXT('USERENV','EXTERNAL_NAME') external_name,


SYS_CONTEXT('USERENV','IP_ADDRESS') ip_address,
SYS_CONTEXT('USERENV','NETWORK_PROTOCOL') network_protocol,
SYS_CONTEXT('USERENV','BG_JOB_ID') bg_job_id,
SYS_CONTEXT('USERENV','FG_JOB_ID') fg_job_id,
SYS_CONTEXT('USERENV','AUTHENTICATION_TYPE')
authentication_type,
SYS_CONTEXT('USERENV','AUTHENTICATION_DATA')
authentication_data
from dual
[解决办法]

SQL code
Oracle计算时间差表达式 --获取两时间的相差豪秒数select ceil((To_date('2008-05-02 00:00:00' , 'yyyy-mm-dd hh24-mi-ss') - To_date('2008-04-30 23:59:59' , 'yyyy-mm-dd hh24-mi-ss')) * 24 * 60 * 60 * 1000) 相差豪秒数 FROM DUAL;/*相差豪秒数----------  864010001 row selected*/--获取两时间的相差秒数select ceil((To_date('2008-05-02 00:00:00' , 'yyyy-mm-dd hh24-mi-ss') - To_date('2008-04-30 23:59:59' , 'yyyy-mm-dd hh24-mi-ss')) * 24 * 60 * 60) 相差秒数 FROM DUAL;/*相差秒数----------     864011 row selected*/--获取两时间的相差分钟数select ceil(((To_date('2008-05-02 00:00:00' , 'yyyy-mm-dd hh24-mi-ss') - To_date('2008-04-30 23:59:59' , 'yyyy-mm-dd hh24-mi-ss'))) * 24 * 60)  相差分钟数 FROM DUAL;/*相差分钟数----------      14411 row selected*/--获取两时间的相差小时数select ceil((To_date('2008-05-02 00:00:00' , 'yyyy-mm-dd hh24-mi-ss') - To_date('2008-04-30 23:59:59' , 'yyyy-mm-dd hh24-mi-ss')) * 24)  相差小时数 FROM DUAL;/*相差小时数----------        251 row selected*/--获取两时间的相差天数select ceil((To_date('2008-05-02 00:00:00' , 'yyyy-mm-dd hh24-mi-ss') - To_date('2008-04-30 23:59:59' , 'yyyy-mm-dd hh24-mi-ss')))  相差天数 FROM DUAL;/*相差天数----------         21 row selected*/--获取两时间月份差select (EXTRACT(year FROM to_date('2009-05-01','yyyy-mm-dd')) - EXTRACT(year FROM to_date('2008-04-30','yyyy-mm-dd'))) * 12 +        EXTRACT(month FROM to_date('2008-05-01','yyyy-mm-dd')) - EXTRACT(month FROM to_date('2008-04-30','yyyy-mm-dd')) monthsfrom dual;/*MONTHS----------        131 row selected*/--获取两时间年份差select EXTRACT(year FROM to_date('2009-05-01','yyyy-mm-dd')) - EXTRACT(year FROM to_date('2008-04-30','yyyy-mm-dd')) years from dual;/*YEARS----------         11 row selected*/
[解决办法]
大家用过吗?下面这个
SQL code
--Insert multiple rows into different tables with a single statement: INSERT ALL   WHEN type=1 THEN INTO tab1 VALUES (myseq.NEXTVAL, val)   WHEN type=2 THEN INTO tab2 VALUES (myseq.NEXTVAL, val)   WHEN type IN (3,4,5) THEN INTO tab3 VALUES (myseq.NEXTVAL, val)   ELSE INTO tab4 VALUES (myseq.NEXTVAL, val)SELECT type, val FROM source_tab;
[解决办法]
--动态sql创建ORACLE存储过程.txt
create or replace procedure p3(v_tname varchar2) as
i number;
m number;
/*v_tname varchar2(10) := 't1';*/
e_createerror exception;
begin
execute immediate 'select count(*) from all_tables where table_name =''' ||
upper(v_tname) || '''' into i;
if i > 0 then
dbms_output.put_line('table is also exists');
execute immediate 'drop table ' || v_tname;
end if;
begin
execute immediate 'create table ' || v_tname || ' (id1 number)';
exception
when others then
raise e_createerror;
end;
execute immediate 'insert into ' || v_tname || ' values (3)';
execute immediate 'insert into ' || v_tname || ' values (3)';
execute immediate 'insert into ' || v_tname || ' values (3)';
execute immediate 'insert into ' || v_tname || ' values (3)';
commit;
execute immediate ' select count(*) from all_tables where table_name =''' ||upper(v_tname) || ''''
into m;

if m > 0 then
--execute immediate ' select count(*) from '''||upper(v_tname) || '''' into m;
dbms_output.put_line('good1!');dbms_output.put_line('count of v_tname:'||m);


end if;
exception
when e_createerror then
dbms_output.put_line('表创建语句出错请检查');
end;
/
[解决办法]
-- 定义游标
declare
cursor aa is
select names,num from test;
begin
for bb in aa
loop
if bb.names = "ORACLE" then

end if
end loop;
end
论坛里的例子:
create or replace procedure test is
cursor v_cur_6(ids varchar2) is
select * from T where instr(','||ids||',',','||to_char(A)||',')=0;
v_cur_line_6 v_cur_6%ROWTYPE;
begin
open v_cur_6('1,2');
loop

fetch v_cur_6 into v_cur_line_6;
exit when v_cur_6%notfound;
dbms_output.put_line('---------');
end loop;
close v_cur_6;
end;
[解决办法]
我也看到一篇文章,分享
http://www.cnblogs.com/liuweitoo/archive/2007/04/02/697293.html
[解决办法]
以工作分组,按名称排序,取出汇总每个工作下的人员名称,并以“,”符号作为分隔符

SQL code
select job, ltrim(sys_connect_by_path(ename, ','), ',') scbp  from (select job,               ename,               row_number() over(partition by job order by ename) rn,               count(*) over(partition by job) cnt          from scott.emp) t where rn = cnt start with rn = 1connect by prior job = job       and prior rn = rn - 1 order by job
[解决办法]
SQL code
-- 定义游标 declare   cursor aa is       select names,num from test; begin   for bb in aa   loop         if bb.names = "ORACLE" then                 end if   end loop;     end 论坛里的例子: create or replace procedure test is cursor v_cur_6(ids varchar2) is       select * from T where instr(','||ids||',',','||to_char(A)||',')=0; v_cur_line_6 v_cur_6%ROWTYPE; begin     open v_cur_6('1,2');     loop       fetch v_cur_6 into v_cur_line_6;       exit when v_cur_6%notfound;       dbms_output.put_line('---------');     end loop;     close v_cur_6; end;
[解决办法]
如何查找、删除表中重复的记录

方法原理:
1、Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的,
  rowid确定了每条记录是在ORACLE中的哪一个数据文件、块、行上。

2、在重复的记录中,可能所有列的内容都相同,但rowid不会相同,所以只要确定出重复记录中
  那些具有最大rowid的就可以了,其余全部删除。

实现方法:
SQL> create table a (
2 bm char(4), --编码
3 mc varchar2(20) --名称
4 )
5 /

表已建立.

SQL> insert into a values('1111','1111');
SQL> insert into a values('1112','1111');
SQL> insert into a values('1113','1111');
SQL> insert into a values('1114','1111');

SQL> insert into a select * from a;

插入4个记录.

SQL> commit;

完全提交.

SQL> select rowid,bm,mc from a;

ROWID BM MC
------------------ ---- -------
000000D5.0000.0002 1111 1111
000000D5.0001.0002 1112 1111
000000D5.0002.0002 1113 1111
000000D5.0003.0002 1114 1111
000000D5.0004.0002 1111 1111
000000D5.0005.0002 1112 1111
000000D5.0006.0002 1113 1111
000000D5.0007.0002 1114 1111

查询到8记录.


查出重复记录
SQL> select rowid,bm,mc from a where a.rowid!=(select max(rowid) from a b where a.bm=b.bm and a.mc=b.mc);

ROWID BM MC


------------------ ---- --------------------
000000D5.0000.0002 1111 1111
000000D5.0001.0002 1112 1111
000000D5.0002.0002 1113 1111
000000D5.0003.0002 1114 1111

删除重复记录
SQL> delete from a a where a.rowid!=(select max(rowid) from a b where a.bm=b.bm and a.mc=b.mc);

删除4个记录.

SQL> select rowid,bm,mc from a;

ROWID BM MC
------------------ ---- --------------------
000000D5.0004.0002 1111 1111
000000D5.0005.0002 1112 1111
000000D5.0006.0002 1113 1111
000000D5.0007.0002 1114 1111

[解决办法]
手动创建oracle9i数据库具体步骤

在linux操作系统上,以oracle用户名登录
1、停止linux上运行的数据库实例
2、更改linux上ORACLE_SID环境参数
ORACLE_SID=gaogao
export ORACLE_SID
3、手动添加文件目录
mkdir /opt/oracle/admin/gaogao
mkdir /opt/oracle/admin/gaogao/bdump
mkdir /opt/oracle/admin/gaogao/cdump
mkdir /opt/oracle/admin/gaogao/udump
mkdir /opt/oracle/admin/gaogao/pfile (这个目录为个人爱好,不是必须)
mkdir /opt/oracle/oradata/gaogao
4、创建参数文件init(sid).ora
Create pfile from spfile;
这样就可以在dbs目录下自动创建一个init(sid).ora文件.然后根据这个文件,略作修改,可以创建initgaogao.ora参数文件,然后放到/opt/oracle/admin/gaogao/pfile目录一个,在放到/opt/oracle/product/9.2.0/dbs一个就ok了.
5.创建密码文件orapw(sid)
[oracle@test oracle]$ orapwd file=/opt/oracle/product/9.2.0/dbs/orapwgaogao password=bscy entries=5
这样就创建了一个针对gaogao实例的密码文件.默认放到/opt/oracle/product/9.2.0/dbs目录下.
6、以nomount状态启动oracle实例
sqlplus /nolog
SQL> conn / as sysdba
Connected to an idle instance.
SQL> startup nomount
ORACLE instance started.
SQL>start 创建数据库的sql语句文件的路径
以下是创建数据库的标准SQL语句:
CREATE DATABASE gao
LOGFILE
GROUP 1 '/opt/oracle/oradata/gaogao/redo01.log' SIZE 100M,
GROUP 2 '/opt/oracle/oradata/gaogao/redo02.log' SIZE 100M,
GROUP 3 '/opt/oracle/oradata/gaogao/redo03.log' SIZE 100M
MAXINSTANCES 8
MAXLOGHISTORY 100
MAXLOGMEMBERS 3
MAXLOGFILES 16
MAXDATAFILES 254
NOARCHIVELOG
CHARACTER SET ZHS16GBK
NATIONAL CHARACTER SET AL16UTF16
DATAFILE '/opt/oracle/oradata/gaogao/system_01_gaogao.dbf' SIZE 100M
AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITED
UNDO TABLESPACE UNDOTBS1
DATAFILE '/opt/oracle/oradata/gaogao/undogaogao01.dbf' SIZE 35M
DEFAULT TEMPORARY TABLESPACE TEMP
TEMPFILE '/opt/oracle/oradata/gaogao/tempgaogao01.dbf' SIZE 20M;

等待大约2分钟后提示Database created. 建库成功.

7:建立数据字典的文件是:

$ORACLE_HOME/rdbms/admin/catalog.sql

$ORACLE_HOME/rdbms/admin/catproc.sql

$ORACLE_HOME/rdbms/admin/catexp.sql


二、心得体会
1、spfile文件不是建库必须,可以待数据库建成后再生成
2、pwd文件不是建库必须,可以待数据库建成后再生成
3、参数文件和建库脚本的相关内容必须匹配,特别是SID,datafile文件的位置和UNDO表空间的名字
4、建库一旦发生错误,所有的错误信息都会记录在/opt/oracle/admin/myocp/bdump目录的alert_myocp.log文件中,准确的定位错误才能修正错误
5、dbca是个好东西,但对它形成依赖后,在实际工作中就得启动X窗口并且必须在服务器上操作,有很大的局限性,所以学习OCP的同仁必须掌握手动建库。

读书人网 >oracle

热点推荐