SQL错误、工具语句整理

1不是SElECTed表达式
query="select distinct dwbm,area_no,dwmc,role_no,zgbm_no from s_mtab where role_no between 2 and 3 and (substr(zgbm_no,1,4)='6101' or dwbm=6101) and area_no is not null order by area_no ";
莫名其妙的报错信息。。。“ORA-01791:不是SElECTed表达式”

经分析,如果在ORDER BY中指定多个列,结果将先按照子句中的第一个列排序,然后第二个,依此类推
在 SELECT中未出现的列名也可用于ORDER BY 子句中,主要TABLE中有就行,但如果SELECT子句中出现了DISTINCT关键字,则只能用出现过的列名,而且如果SELECT子句中使用了任何运算符,在ORDER BY 子句中必须保持和SELECT子句中表达式完全一致,否则出现ORA-01791 ERROR
所以分析以后把上面的句子写成这样:

query="select distinct area_no, dwbm,dwmc,role_no,zgbm_no from s_mtab where role_no between 2 and 3 and (substr(zgbm_no,1,4)='6101' or dwbm=6101) and area_no is not nullorder by area_no ";

2恢复误删TABLE

曾经不小心把开发库的数据库表全部删除,当时吓的要死。结果找到下面的语句恢复到了1个小时之前的数据!很简单。

注意使用管理员登录系统:

select * from 表名 as of timestamp sysdate-1/12 //查询两个小时前的某表数据!既然两小时以前的数据都得到了,继续怎么做,知道了吧。。

如果drop了表,怎么办??见下面:

drop table 表名;

数据库误删除表之后恢复:(绝对ok,我就做过这样的事情,汗)不过要记得删除了哪些表名。
flashback table 表名 to before drop;

3查询得到当前数据库中锁,以及解锁:

查锁
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,dba_objects o
WHERE l.sid = s.sid
AND l.id1 = o.object_id(+)
AND s.username is NOT NULL;


解锁
alter system kill session 'sid,serial';
如果解不了。直接倒os下kill进程kill -9 spid

ORA-28000:账户被锁定

因为密码输入错误多次用户自动被锁定.

解决办法:alter user user_name account unlock;

4关于查询数据库用户,权限的相关语句:

      查看所有用户:

  1. select * from dba_user;
  2. select * from all_users;
  3. select * from user_users; 

   查看用户系统权限:

  1. select * from dba_sys_privs;
  2. select * from all_sys_privs;
  3. select * from user_sys_privs;

   查看用户对象权限:

  1. select * from dba_tab_privs;
  2. select * from all_tab_privs;
  3. select*fromuser_tab_privs;

   查看所有角色:

    1. select *fromdba_roles;

   查看用户所拥有的角色:

  1. select * from dba_role_privs;

  查询oracle中所有用户信息

select * from dba_user; 


只查询用户和密码


select username,password from dba_users;


 查询当前用户信息

select * from dba_ustats; 
 查询用户可以访问的视图文本 
select * from dba_varrays; 
 查询数据库中所有视图的文本 
select * from dba_views; 
查询全部索引 
select * from user_indexes; 
查询全部表格 
select * from user_tables; 
查询全部约束 
select * from user_constraints; 
查询全部对象 
select * from user_objects;

查看相关进程在数据库中的会话

Select a.sid,a.serial#,a.program, a.status , 
substr(a.machine,1,20), a.terminal,b.spid 
from v$session a, v$process b 
where a.paddr=b.addr 
and b.spid = &spid; 

查看相关会话正在执行的SQL

select sql_textfromv$sqlarea where address =( select sql_address from v$sessionwheresid = &sid );

查询表的结构:表名大写!!

select t.COLUMN_NAME,
t.DATA_TYPE,
nvl(t.DATA_PRECISION, t.DATA_LENGTH),
nvl(T.DATA_SCALE, 0),
c.comments
from all_tab_columns t, user_col_comments c
whEre t.TABLE_NAME = c.table_name
and t.COLUMN_NAME = c.column_name
and t.TABLE_NAME = UPPER('OM_EMPLOYEE_T')
order by t.COLUMN_ID

 

5 很基础的语句

1.在数据字典查询约束的相关信息:
SELECT constraint_name, constraint_type,search_condition
FROM user_constraints WHERE table_name = 'EMPLOYEES';
//这里的表名都是大写!
2对表结构进行说明:
desc Tablename
3查看用户下面有哪些表
select table_name from user_tables;
4查看约束在那个列上建立:
SELECT constraint_name, column_name
FROM user_cons_columns
WHERE table_name = 'EMPLOYEES';
5结合变量查找相关某个表中约束的相关列名:
select constraint_name,column_name from user_cons_columns where table_name = '&tablename'
6查询数据字典看中间的元素:
SELECT object_name, object_type
FROM user_objects
WHERE object_name LIKE 'EMP%'
OR object_name LIKE 'DEPT%'
7查询对象类型:
SELECT DISTINCT object_type FROM user_objects ;
8改变对象名:(表名,视图,序列)
rename emp to emp_newTable
9添加表的注释:
COMMENT ON TABLE employees IS 'Employee Information';
10查看视图结构:
describe view_name
11在数据字典中查看视图信息:
select viewe_name,text from user_views
12查看数据字典中的序列:
select * from user_sequences
13得到所有的时区名字信息:
select * from v$timezone_names
14显示对时区‘US/Eastern’的时区偏移量
select TZ_OFFSET('US/Eastern') from DUAL--dual英文意思是‘双重的’
显示当前会话时区中的当前日期和时间:
ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS';--修改显示时间的方式的设置
ALTER SESSION SET TIME_ZONE = '-5:0';--修改时区
SELECT SESSIONTIMEZONE, CURRENT_DATE FROM DUAL;--真正有用的语句!
SELECT CURRENT_TIMESTAMP FROM DUAL;--返回的时间是当前日期和时间,含有时区
SELECT CURRENT_TIMESTAMP FROM DUAL;--返回的时间是当前日期和时间,不含有时区!!!
15显示数据库时区和会话时区的值:
select datimezone,sessiontimezone from dual;

16普通的建表语句:
CREATE TABLE dept
(deptno NUMBER(2),
dname VARCHAR2(14),
loc VARCHAR2(13));
17使用子查询建立表:
CREATE TABLE dept80
AS SELECT employee_id, last_name,
salary*12 ANNSAL,
hire_date FROM employees WHERE department_id = 80;
18添加列:// alter table EMP add column (dept_id number(7));错误!!
alter table EMP add (dept_id number(7));
19删除一列:
alter table emp drop column dept_id;
20添加列名同时和约束:
alter table EMP add (dept_id number(7)
constraint my_emp_dept_id_fk references dept(ID));
21改变列://注意约束不能够修改 的!!
alter table dept80 modify(last_name varchar2(30));//这里使用的是modify而不是alter!
22增加一行:
insert into table_name values();

23添加主键:
alter Table EMP add constraint my_emp_id_pk primary key (ID);
24添加一个有check约束的新列:
alter table EMP
add (COMMISSION number(2) constraint emp_commission_ck check(commission>0))

24创建视图:
CREATE VIEW empvu80
AS SELECT employee_id, last_name, salary
FROM employees WHERE department_id = 80;

25找到工资最高的5个人。(top-n分析)(行内视图)
select rownum,employee_id from (select employee_id,salary from
employees order by salary desc)
where rownum<5;
26建立同义词:
create synonym 同义词名 for 原来的名字
或者 create public synonym 同义词名 for 原来的名字
27建立序列:(注意,这里并没有出现说是哪个表里面的序列!!)
CREATE SEQUENCE dept_deptid_seq
INCREMENT BY 10
START WITH 120
MAXVALUE 9999
NOCACHE
NOCYCLE
28使用序列:
insert into dept(ID,NAME) values(DEPT_ID_SEQ.nextval,'Administration');
29建立索引://默认就是nonunique索引,除非使用了关键字:unique
CREATE INDEX emp_last_name_idx ON employees(last_name);
30建立用户:(可能有错,详细查看帮助)
create user username(用户名)
identified by oracle(密码)
default tablespace data01(表空间名//默认存在system表空间里面)
quota 10M(设置大小,最大为unlimited) on 表空间名//必须分配配额!
31创建角色:create ROLE manager
赋予角色权限:grant create table,create view to manage
赋予用户角色:grant manager to DENHAAN,KOCHHAR( 两个用户)
32分配权限:
GRANT update (department_name, location_id)
ON departments
TO scott, manager;
回收权限
REVOKE select, insert
ON departments
FROM scott;

 

6常用应用语句

group语句:和高级的应用语句

SELECT department_id, job_id,SUM(salary),COUNT(employee_id)FROM employees

GROUP BY department_id, job_id ;

使用having进行约束:

group by rollup:对n列组合得到n+1种情况

SELECT department_id, job_id,SUM(salary)FROM employees WHERE department_id < 60GROUP BY ROLLUP(department_id, job_id);

group by cube:得到2的n次方种情况

SELECT department_id, job_id,SUM(salary)FROM employees WHERE department_id < 60GROUP BY CUBE (department_id, job_id) ;

使用grouping得到一行中构成列的情况,只是返回1和0:是空的话就返回1,否则返回0(注意不要弄反了!)

SELECT department_id DEPTID, job_id JOB,SUM(salary),GROUPING(department_id) GRP_DEPT,GROUPING(job_id) GRP_JOB

FROM employeesWHEREdepartment_id < 50 GROUP BYROLLUP(department_id, job_id);

grouping sets:根据需要得到制定的组合情况

SELECT department_id, job_id, manager_id,avg(salary)FROMemployees GROUP BY GROUPING SETS ((department_id,job_id), (job_id,manager_id));

exists语句的使用 

SELECT employee_id, last_name, job_id, department_id

FROM employeesouter--下面的 exists里面的select选择出来的是随便的一个字符或者数字都可以

WHERE EXISTS (SELECT 'X' FROM employees WHERE manager_id = outer.employee_id);

WITH

dept_costs AS (--定义了一个临时的表

SELECT d.department_name,SUM(e.salary) AS dept_total--其间定义了一个临时的列dept_total

FROM employees e, departments d

WHERE e.department_id = d.department_id

GROUP BY d.department_name),

avg_cost AS (

SELECT SUM(dept_total)/COUNT(*)AS dept_avg

FROM dept_costs)--这里的第二张临时表里面就引用了前面定义的临时表和之间的列!

SELECT * FROM dept_costs WHERE dept_total > (SELECTdept_avg FROM avg_cost) ORDERBY department_name;---最后的查询语句中使用了前面的临时表

遍历树

SELECT employee_id, last_name, job_id, manager_id

FROM employees

START WITH employee_id = 101

CONNECT BY PRIOR manager_id = employee_id ;--自底向上的遍历树

导入导出dmp文件

imp 用户名/密码@数据库 ignore=y file=备份文件 log=D:\DBtest\db_bak\imp.log
exp system/manager@TEST file=d:\daochu.dmp full=y

大对象字段blob:查看blob字段的大小

select dbms_lob.getLength(字段名) from表名

创建一个只允许在工作时间访问的视图

create or replace view newviewemp

as

select * from 表名

where exists(select 1 from dual where sysdate >=

to_date(to_char(sysdate, 'yyyy-mm-dd ') ||'08:00:00', 'yyyy-mm-dd hh24:mi:ss')

and sysdate < to_date(to_char(sysdate,'yyyy-mm-dd ') || '18:00:00','yyyy-mm-dd hh24:mi:ss'))

存储过程中执行ddl语句

Create Or Replace Procedure My_Proc As
Sqlddl Varchar2(1000);
Begin
Sqlddl := 'create table MyTable(ID Number(5), Name Varchar2(20))';
Dbms_Output.Put_Line(Sqlddl);
Execute Immediate Sqlddl;
End;

 7 oracle创建表空间

注意点:

1.如果在PL/SQL 等工具里打开的话,直接修改下面的代码中[斜体加粗部分]执行
2.确保路径存在,比如【D:\oracle\oradata\Oracle9i\】也就是你要保存文件的路径存在
 
 
create temporary tablespace user_temp  
tempfile 'D:\oracle\oradata\Oracle9i\user_temp.dbf' 
size 50m  
autoextend on  
next 50m maxsize 20480m  
extent management local;  
 
 
create tablespace test_data  
logging  
datafile 'D:\oracle\oradata\Oracle9i\user_data.dbf' 
size 50m  
autoextend on  
next 50m maxsize 20480m  
extent management local;  
 
 
create user username identified by password  
default tablespace user_data  
temporary tablespace user_temp;  
 
 
grant connect,resource,dba to username;

 

 关于oracle的锁表解决 ORA-00031: session marked for kill

1查询哪些对象被锁:
    select object_name,machine,s.sid,s.serial#
    from v$locked_object l,dba_objects o ,v$session s
    where l.object_id = o.object_id and l.session_id=s.sid;
2.下面的语句用来杀死一个进程:
    alter system kill session '524,1095'; (其中24,111分别是上面查询出的sid,serial#)
 
3.再一次查询目前锁定的对象,若发现以上方法不能解除锁定的表,则用以下方法:
  3.1 执行下面的语句获得进程(线程)号:
     select spid, osuser, s.program
     from v$session s,v$process p
     where s.paddr=p.addr and s.sid=524 (524是上面的sid)
 
  3.2 在OS上杀死这个进程(线程):
     unix上,用root身份或是相应的oracle身份执行命令:
     #kill -9 9846(9846 上一步查询出的spid)
     windows(unix也适用)用orakill杀死线程,orakill是oracle提供的一个可执行命令,语法为:
     orakill sid thread
     PS:
        sid:表示要杀死的进程属于的实例名
        thread:是要杀掉的线程号,即第3步查询出的spid。
     exp:
        c:>orakill orcl 9846

ORA-24324:未初始化服务句柄,不允许此值,正在关闭 - 不允许连接

今天使用Oracle遇到了这个问题ora-01033:oracle initialization or shutdown in progress,经过分析研究终于解决了,记下来。 
首先:问题的产生原因,出现这个错误是因为我将\oracle\product\10.1.0\oradata\oral下的一个文件删除掉后出现的。
    利用sql语句语句创建表空间时弄错了,就一时心急把创建的文件删除了。结果问题就出来了。sysdba可以登录,但是在使用中就出现“数据库未打开,仅允许在固定表/视图中查询”,而normal用户无法登录使用,出现ORA-01033: ORACLE initialization or shutdown in progress 的错误。
分析:这个错误的原因应该是Oracle在启动后,用户登录时是要将方案中原有配置信息装载进入,装载过程中配置中有文件未找到,所以就报出错误。
解决过程:
C:\Documents and Settings\DHai>sqlplus /nolog
SQL*Plus: Release 10.1.0.2.0 - Production on 星期一 9月 28 14:35:38 2009
Copyright (c) 1982, 2004, Oracle. All rights reserved.
SQL> connect sys/123 as sysdba;
已连接。
SQL> shutdown normal
ORA-01109: 数据库未打开
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area 171966464 bytes
Fixed Size                   787988 bytes
Variable Size             145750508 bytes
Database Buffers           25165824 bytes
Redo Buffers                 262144 bytes
数据库装载完毕。
SQL> alter database open;
alter database open
*
第 1 行出现错误:
ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项
SQL> alter database open resetlogs;
alter database open resetlogs
*
第 1 行出现错误:
ORA-01157: 无法标识/锁定数据文件 6 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 6: 'C:\ORACLE\PRODUCT\10.1.0\ORADATA\ORAL\FSCREDIT40'
SQL> alter database datafile 6 offline drop;
数据库已更改。
SQL> alter database open resetlogs;
数据库已更改。
SQL> alter database datafile 6 offline drop;
数据库已更改。
SQL> alter database open;
alter database open
*
第 1 行出现错误:
ORA-01531: 例程已打开数据库
SQL>shutdown normal
提示:数据库已经关闭
已经卸载数据库
ORACLE 例程已经关闭
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area 171966464 bytes
Fixed Size                   787988 bytes
Variable Size             145750508 bytes
Database Buffers           25165824 bytes
Redo Buffers                 262144 bytes
数据库装载完毕。
到此,问题解决了。
=============================================
============================================
网上另外的文章
=====================================
============================
oracle一个问题的解决方法:Error:ORA-01033:ORACLE initialization or shutdown in progress2009-07-14 18:42从网上找了一些资料,最后加上自己的实践终于解决了
后来发现原因既然是:用系统清理工具把系统垃圾清理了一番,结果在打开oracle 数据库时出现了错误:
解 决方法在DOS环境下sqlplus /NOLOGSQL>connect sys/sys as sysdbaSQL>shutdown normalSQL>startup mountSQL>alter database open;第 1 行出现错误:ORA-01157: 无法标识/锁定数据文件 6 - 请参阅 DBWR 跟踪文件ORA-01110: 数据文件 6: ''D:\ORACLE\ORADATA\ORAGWH\INDX01.DBF''出现这种问题时继续输入SQL> conn sys/sys as sysdba;已连接。SQL> alter database datafile 6 offline drop;直到用scott登陆为止SQL> conn scott/tiger然后接着输入即可SQL>shutdown normalSQL>startup本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/henlson/archive/2007/07/18/1696966.aspx
在输入上述命令的时候,可能会出现下面的问题:
ORA-00313: 无法打开日志组 1 (线程 1) 的成员
解决方法如下:
   运行Oracle----Integrated Management Tools----SQLPlus WorkSheet
SQL> connect / as sysdba;
已连接。
SQL> shutdown immediate;
ORA-01109: 数据库未打开
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup;
ORACLE 例程已经启动。
Total System Global Area 135338868 bytes
Fixed Size                   453492 bytes
Variable Size             109051904 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
ORA-00313: 无法打开日志组 1 (线程 1) 的成员
ORA-00312: 联机日志 1 线程 1: 'C:\ORACLE\ORADATA\ORCL\REDO01.LOG'
查看C:\ORACLE\ORADATA\myoracle\REDO01.LOG还在,但是REDO02.LOG,REDO03.LOG被误删了.
赶紧换个例程OEMREP试试,结果还是一样的错误!
蒙了,难道要重装数据库不成?有什么办法可以解决这个问题呢?
解决办法:
SQL> shutdown immediate;
ORA-01109: 数据库未打开
已经卸载数据库。
SQL> startup mount;
ORACLE 例程已经启动。
SQL>select * from v$log;
GROUP#    THREAD# SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ----------
                         0 104857600          1 NO UNCURRENT                 670680 05-12月-07
                        15 104857600          1 NO   unactive                    696119 06-12月-07
                         0 104857600          1 NO Unactive                     650182 05-12月-07
已选择3行。
alter database clear unarchived logfile group 1;   
数据库已经更改.
alter database clear unarchived logfile group 2;
数据库已经更改.
alter database clear unarchived logfile group 3;
数据库已经更改.
SQL>shutdown;
已经卸载数据库。
ORACLE 例程已经关闭。
SQL>startup;
ORACLE 例程已经启动。
Total System Global Area 135338868 bytes
Fixed Size                   453492 bytes
Variable Size             109051904 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
数据库已经打开。
问题解决!
但是,在对myoracle 例程进行同样的操作后,也不知道是哪里出了问题,
SQL>startup;
ORACLE 例程已经启动。
Total System Global Area 135338868 bytes
Fixed Size                   453492 bytes
Variable Size             109051904 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
ORA-03113: 通信通道的文件结束
在网上查找资料,出现这样的问题原因很多,一般是网络不通,或者是init.ora、C:\oracle\ora92\network\admin \sqlnet.ora或tnsnames.ora有问题.显然这些不适合我.我的两个例程,一个可以正常使用,另外一个有问题的!
在我关闭数据库后,重新打开,执行:
SQL>connect "/as sysdba";
SQL>select * from scott.emp;
ORA-27101 shared memory realm does not exist -
出现这个错误也有很多解释,一般要检查init.ora文件的内存配置是否有问题,但是在没有打开数据库的时候执行命令,也会出现这样的错误提示,我的属于后者,是由于没有挂载数据库造成的,这里提醒一下.
    后来又乱琢磨了一回,还出现了错误:
ORA-24324: 未初始化服务句柄
ORA-01041: 内部错误,hostdef 扩展名不存在
这是越来越乱了,无奈之下,只好重头再来整理一遍,从重新配置日志文件开始,操作一样,但是奇迹出现了,错误消失了,也不提示通信通道文件结束了,数据库正常了,呵呵,但是很晕!
解决问题知识整理:
首先,执行下面的语句看看group1是不是current日志组
select * from v$log;
如果被删除的日志不是当前日志组的成员,比较简单
alter database clear logfile group 1;
如果你的库是非归档的,或许要用下面的语句
alter database clear unarchived logfile group 1;
如果是当前日志组损坏,但是数据库是正常关闭的,上面的办法也可以使用
如果日志组中有活动的事务,那么可能需要利用备份来恢复了:过程如下:
解决过程:Microsoft Windows XP [版本 5.1.2600](C) 版权所有 1985-2001 Microsoft Corp.
C:\Documents and Settings\5201314>sqlplus /nolog
SQL*Plus: Release 10.2.0.1.0 - Production on 星期六 5月 27 11:19:52 2006Copyright (c) 1982, 2005, Oracle. All rights
reserved.
SQL> conn sys/dd as sysdba
已连接。
SQL> startup mount
ORA-01081: 无法启动已在运行的 ORACLE - 请首先关闭它
SQL> recover database until time '2006-05-19 13:45:02';
完成介质恢复。
SQL> alter database open resetlogs;
数据库已更改。           
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 205520896 bytes
Fixed Size 1248092 bytes
Variable Size 79692964 bytes
Database Buffers 117440512 bytes
Redo Buffers 7139328 bytes
数据库装载完毕。
数据库已经打开。

 

 

 

 

 

 

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值