修改字符集
使用用户system,通过sqlplus程序连接到Oracle数据库,输入以下命令,查看字符集:
SQL > select userenv('language') from dual; USERENV( 'LANGUAGE') -- -------------------------------------------------- AMERICAN_AMERICA.AL32UTF8 SQL >
我们可以看到查到的字符集为“ AMERICAN_AMERICA.AL32UTF8 ”,而国内数据库常用的字符集为“ ZHS16GBK ”。
例如:某字段在企业版中定义的为varchar2(4), 保存数据为''田田'',则导入oraclexe时,该字段定义仍为varchar2(4),但数据''田田''就需要占用6个字符长度,出现的问题如下所示:
IMP-00019: 由于 ORACLE 错误 12899 而拒绝行
IMP-00003: 遇到 ORACLE 错误 12899
ORA-12899: 列 "TEST"."TEST_TIANYC"."A" 的值太大 (实际值: 6, 最大值: 4)
此时就需要按照以下操作说明进行操作后即可解决问题。
操作说明:
开始菜单-->所有程序-->Oracle Database 11g Express Edition-->运行SQL命令行,启动sqlplus程序。
由于sqlplus程序不支持直接在程序窗口中右键,进行复制、粘贴等操作,所以博主采用的是在运行命令行中启动sqlplus程序。
开始菜单-->运行-->输入cmd,并回车-->打开cmd命令行。
Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。
C:\Users\Candy>
C:\oraclexe\app\oracle\product\11.2.0\server\bin\sqlplus.exe /nolog
SQL*Plus: Release 11.2.0.2.0 Production on 星期三 11月 26 12:11:59 2014
Copyright (c) 1982, 2010, Oracle. All rights reserved.
SQL>
connect system as sysdba
输入口令:
已连接。
SQL>
shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL>
startup mount
ORACLE 例程已经启动。
Total System Global Area 644468736 bytes
Fixed Size 1385488 bytes
Variable Size 192941040 bytes
Database Buffers 444596224 bytes
Redo Buffers 5545984 bytes
数据库装载完毕。
SQL>
alter system enable restricted session;
系统已更改。
SQL>
alter system set JOB_QUEUE_PROCESSES=0;
系统已更改。
SQL>
alter system set AQ_TM_PROCESSES=0;
系统已更改。
SQL>
alter database open;
数据库已更改。
SQL>
alter database character set internal_use ZHS16GBK;
数据库已更改。
SQL>
shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL>
startup
ORACLE 例程已经启动。
Total System Global Area 644468736 bytes
Fixed Size 1385488 bytes
Variable Size 192941040 bytes
Database Buffers 444596224 bytes
Redo Buffers 5545984 bytes
数据库装载完毕。
数据库已经打开。
SQL>
select userenv('language') from dual;
USERENV('LANGUAGE')
----------------------------------------------------
SIMPLIFIED CHINESE_CHINA.ZHS16GBK
SQL>
此时,再进行数据导入或者在字段类型为varchar2(4)的字段插入“田田”,就不会报错了。
修改字符集后可能导致navicat连不上Oracle数据库,请在菜单-->工具-->选项-->其他-->OCI中将OCI library(oci.dll)的值修改为
C:\oraclexe\app\oracle\product\11.2.0\server\bin\oci.dll,点击确定后,重启navicat即可。
Oracle自带的Scott用户下的Demo库的SQL
DROP TABLE EMP; DROP TABLE DEPT; DROP TABLE BONUS; DROP TABLE SALGRADE; CREATE TABLE DEPT ( DEPTNO NUMBER ( 2 ) CONSTRAINT PK_DEPT PRIMARY KEY , DNAME VARCHAR2 ( 14 ), LOC VARCHAR2 ( 13 ) ); CREATE TABLE EMP ( EMPNO NUMBER ( 4 ) CONSTRAINT PK_EMP PRIMARY KEY , ENAME VARCHAR2 ( 10 ), JOB VARCHAR2 ( 9 ), MGR NUMBER ( 4 ), HIREDATE DATE, SAL NUMBER ( 7 , 2 ), COMM NUMBER ( 7 , 2 ), DEPTNO NUMBER ( 2 ) CONSTRAINT FK_DEPTNO REFERENCES DEPT ); INSERT INTO DEPT VALUES ( 10 , ' ACCOUNTING ' , ' NEW YORK ' ); INSERT INTO DEPT VALUES ( 20 , ' RESEARCH ' , ' DALLAS ' ); INSERT INTO DEPT VALUES ( 30 , ' SALES ' , ' CHICAGO ' ); INSERT INTO DEPT VALUES ( 40 , ' OPERATIONS ' , ' BOSTON ' ); INSERT INTO EMP VALUES ( 7369 , ' SMITH ' , ' CLERK ' , 7902 , TO_DATE ( ' 17-12-1980 ' , ' dd-mm-yyyy ' ), 800 , NULL , 20 ); INSERT INTO EMP VALUES ( 7499 , ' ALLEN ' , ' SALESMAN ' , 7698 , TO_DATE ( ' 20-2-1981 ' , ' dd-mm-yyyy ' ), 1600 , 300 , 30 ); INSERT INTO EMP VALUES ( 7521 , ' WARD ' , ' SALESMAN ' , 7698 , TO_DATE ( ' 22-2-1981 ' , ' dd-mm-yyyy ' ), 1250 , 500 , 30 ); INSERT INTO EMP VALUES ( 7566 , ' JONES ' , ' MANAGER ' , 7839 , TO_DATE ( ' 2-4-1981 ' , ' dd-mm-yyyy ' ), 2975 , NULL , 20 ); INSERT INTO EMP VALUES ( 7654 , ' MARTIN ' , ' SALESMAN ' , 7698 , TO_DATE ( ' 28-9-1981 ' , ' dd-mm-yyyy ' ), 1250 , 1400 , 30 ); INSERT INTO EMP VALUES ( 7698 , ' BLAKE ' , ' MANAGER ' , 7839 , TO_DATE ( ' 1-5-1981 ' , ' dd-mm-yyyy ' ), 2850 , NULL , 30 ); INSERT INTO EMP VALUES ( 7782 , ' CLARK ' , ' MANAGER ' , 7839 , TO_DATE ( ' 9-6-1981 ' , ' dd-mm-yyyy ' ), 2450 , NULL , 10 ); INSERT INTO EMP VALUES ( 7788 , ' SCOTT ' , ' ANALYST ' , 7566 , TO_DATE ( ' 13-07-87 ' , ' dd-mm-rr ' ) - 85 , 3000 , NULL , 20 ); INSERT INTO EMP VALUES ( 7839 , ' KING ' , ' PRESIDENT ' , NULL , TO_DATE ( ' 17-11-1981 ' , ' dd-mm-yyyy ' ), 5000 , NULL , 10 ); INSERT INTO EMP VALUES ( 7844 , ' TURNER ' , ' SALESMAN ' , 7698 , TO_DATE ( ' 8-9-1981 ' , ' dd-mm-yyyy ' ), 1500 , 0 , 30 ); INSERT INTO EMP VALUES ( 7876 , ' ADAMS ' , ' CLERK ' , 7788 , TO_DATE ( ' 13-07-87 ' , ' dd-mm-rr ' ) - 51 , 1100 , NULL , 20 ); INSERT INTO EMP VALUES ( 7900 , ' JAMES ' , ' CLERK ' , 7698 , TO_DATE ( ' 3-12-1981 ' , ' dd-mm-yyyy ' ), 950 , NULL , 30 ); INSERT INTO EMP VALUES ( 7902 , ' FORD ' , ' ANALYST ' , 7566 , TO_DATE ( ' 3-12-1981 ' , ' dd-mm-yyyy ' ), 3000 , NULL , 20 ); INSERT INTO EMP VALUES ( 7934 , ' MILLER ' , ' CLERK ' , 7782 , TO_DATE ( ' 23-1-1982 ' , ' dd-mm-yyyy ' ), 1300 , NULL , 10 ); CREATE TABLE BONUS ( ENAME VARCHAR2 ( 10 ), JOB VARCHAR2 ( 9 ), SAL NUMBER , COMM NUMBER ); CREATE TABLE SALGRADE ( GRADE NUMBER , LOSAL NUMBER , HISAL NUMBER ); INSERT INTO SALGRADE VALUES ( 1 , 700 , 1200 ); INSERT INTO SALGRADE VALUES ( 2 , 1201 , 1400 ); INSERT INTO SALGRADE VALUES ( 3 , 1401 , 2000 ); INSERT INTO SALGRADE VALUES ( 4 , 2001 , 3000 ); INSERT INTO SALGRADE VALUES ( 5 , 3001 , 9999 ); COMMIT ;
练习题目
根据Oracle数据库scott模式下的emp表和dept表,完成下列操作。 ( 1 ) 查询20号部门的所有员工信息。 select * from emp where deptno = 20 ; ( 2 ) 查询所有工种为CLERK的员工的工号、员工名和部门名。 select empno,ename,deptno from emp where job like ' CLERK ' ; ( 3 ) 查询奖金(COMM)高于工资(SAL)的员工信息。 select * from emp where comm > sal; ( 4 ) 查询奖金高于工资的20 % 的员工信息。 select * from emp where comm > (sal * 0.2 ); ( 5 ) 查询10号部门中工种为MANAGER和20号部门中工种为CLERK的员工的信息。 select * from emp where (deptno = 10 and job like ' MANAGER ' ) or (deptno = 20 and job like ' CLERK ' ); ( 6 ) 查询所有工种不是MANAGER和CLERK,且工资大于或等于2000的员工的详细信息。 select * from emp where job not in ( ' MANAGER ' , ' CLERK ' ) and sal >= 2000 ; ( 7 ) 查询有奖金的员工的不同工种。 select distinct job from emp where comm is not null ; ( 8 ) 查询所有员工工资和奖金的和。 select ename,(sal + nvl(comm, 0 )) salcomm from emp; ( 9 ) 查询没有奖金或奖金低于100的员工信息。 select * from emp where (comm is null or comm < 100 ) ; ( 10 ) 查询各月倒数第2天入职的员工信息。 select * from emp where hiredate in ( select (last_day(hiredate) - 1 ) from emp); ( 11 ) 查询员工工龄大于或等于10年的员工信息。 select * from emp where (sysdate - hiredate) / 365 >= 10 ; ( 12 ) 查询员工信息,要求以首字母大写的方式显示所有员工的姓名。 select upper (substr(ename, 1 , 1 )) || lower (substr(ename, 2 ,length(ename) - 1 )) from emp; ( 13 ) 查询员工名正好为6个字符的员工的信息。 select * from emp where length(ename) = 6 ; ( 14 ) 查询员工名字中不包含字母“S”员工。 select * from emp where ename not in ( select ename from emp where ename like ' %S% ' ) ; select * from emp where ename not like ‘ % S % ’; ( 15 ) 查询员工姓名的第2个字母为“M”的员工信息。 select * from emp where ename like ' _M% ' ; ( 16 ) 查询所有员工姓名的前3个字符。 select substr(ename, 1 , 3 ) from emp ; ( 17 ) 查询所有员工的姓名,如果包含字母“s”,则用“S”替换。 select replace (ename, ' s ' , ' S ' ) from emp ; ( 18 ) 查询员工的姓名和入职日期,并按入职日期从先到后进行排列。 select ename,hiredate from emp order by hiredate asc ; ( 19 ) 显示所有的姓名、工种、工资和奖金,按工种降序排列,若工种相同则按工资升序排列。 select ename,job,sal,comm from emp order by job desc ,sal asc ; ( 20 ) 显示所有员工的姓名、入职的年份和月份,若入职日期所在的月份排序,若月份相同则按入职的年份排序。 select ename,to_char(hiredate, ' yyyy ' ) || ' - ' || to_char(hiredate, ' mm ' ) from emp order by to_char(hiredate, ' mm ' ),to_char(hiredate, ' yyyy ' ); ( 21 ) 查询在2月份入职的所有员工信息。 select * from emp where to_char(hiredate, ' mm ' ) = 2 ; ( 22 ) 查询所有员工入职以来的工作期限,用“ ** 年 ** 月 ** 日”的形式表示。 select ename, floor ((sysdate - hiredate) / 365 ) || ' 年 ' || floor (mod((sysdate - hiredate), 365 ) / 30 ) || ' 月 ' || cell(mod(mod((sysdate - hiredate), 365 ), 30 )) || ' 天 ' from emp ; ( 23 ) 查询至少有一个员工的部门信息。 select * from dept where deptno in ( select distinct deptno from emp where mgr is not null ) ; ( 24 ) 查询工资比SMITH员工工资高的所有员工信息。 select * from emp where sal > ( select sal from emp where ename like ' SMITH ' ) ; ( 25 ) 查询所有员工的姓名及其直接上级的姓名。 select staname,ename supname from ( select ename staname,mgr from emp) t join emp on t.mgr = emp.empno ; ( 26 ) 查询入职日期早于其直接上级领导的所有员工信息。 select * from emp where empno in ( select staempno from ( select empno staempno,hiredate stahiredate,mgr from emp) t join emp on t.mgr = emp.empno and stahiredate < hiredate) ; ( 27 ) 查询所有部门及其员工信息,包括那些没有员工的部门。 select * from dept left join emp on emp.deptno = dept.deptno order by dept.deptno ; ( 28 ) 查询所有员工及其部门信息,包括那些还不属于任何部门的员工。 ( 29 ) 查询所有工种为CLERK的员工的姓名及其部门名称。 select ename,dname from emp join dept on job like ' CLERK ' and emp.deptno = dept.deptno ; ( 30 ) 查询最低工资大于2500的各种工作。 select job from ( select min (sal) min_sal,job from emp group by job) where min_sal > 2500 ; ( 31 ) 查询最低工资低于2000的部门及其员工信息。 select * from emp where deptno in ( select deptno from ( select min (sal) min_sal,deptno from emp group by deptno) where min_sal < ' 2000 ' ) ; ( 32 ) 查询在SALES部门工作的员工的姓名信息。 select ename from emp where deptno = ( select deptno from dept where dname like ' SALES ' ); ( 33 ) 查询工资高于公司平均工资的所有员工信息。 select * from emp where sal > ( select avg (sal) from emp) ; ( 34 ) 查询与SMITH员工从事相同工作的所有员工信息。 select * from emp where job in ( select job from emp where ename like ' SMITH ' ) and ename not like ' SMITH ' ; ( 35 ) 列出工资等于30号部门中某个员工工资的所有员工的姓名和工资。 select ename,sal from emp where sal =any ( select sal from emp where deptno = 30 ) ; ( 36 ) 查询工资高于30号部门中工作的所有员工的工资的员工姓名和工资。 select ename,sal from emp where sal >all ( select sal from emp where deptno = 30 ) ; ( 37 ) 查询每个部门中的员工数量、平均工资和平均工作年限。 select dname, count ,avg_sal,avg_date from dept join ( select count ( * ) count , avg (sal) avg_sal, avg ((sysdate - hiredate) / 365 ) avg_date,deptno from emp group by deptno) t on dept.deptno = t.deptno ; ( 38 ) 查询从事同一种工作但不属于同一部门的员工信息。 select distinct t1.empno,t1.ename,t1.deptno from emp t1 join emp t2 on t1.job like t2.job and t1.deptno <> t2.deptno ; ( 39 ) 查询各个部门的详细信息以及部门人数、部门平均工资。 Select dept. * ,person_num,avg_sal from dept,( select count ( * ) person_num, avg (sal) avg_sal,deptno from emp group by deptno) t where dept.deptno = t.deptno ; ( 40 ) 查询各种工作的最低工资。 select job, min (sal) from emp group by job ; ( 41 ) 查询各个部门中的不同工种的最高工资。 select max (sal),job,deptno from emp group by deptno,job order by deptno,job ; ( 42 ) 查询10号部门员工以及领导的信息。 select * from emp where empno in ( select mgr from emp where deptno = 10 ) or deptno = 10 ; ( 43 ) 查询各个部门的人数及平均工资。 select deptno, count ( * ), avg (sal) from emp group by deptno ; ( 44 ) 查询工资为某个部门平均工资的员工信息。 select * from emp where sal in ( select avg (sal) avg_sal from emp group by deptno) ; ( 45 ) 查询工资高于本部门平均工资的员工的信息。 select emp. * from emp join ( select deptno, avg (sal) avg_sal from emp group by deptno) t on emp.deptno = t.deptno and sal > avg_sal ; ( 46 ) 查询工资高于本部门平均工资的员工的信息及其部门的平均工资。 select emp. * ,avg_sal from emp join ( select deptno, avg (sal) avg_sal from emp group by deptno) t on emp.deptno = t.deptno and sal > avg_sal ; ( 47 ) 查询工资高于20号部门某个员工工资的员工的信息。 select * from emp where sal >any ( select sal from emp where deptno = 20 ); ( 48 ) 统计各个工种的人数与平均工资。 select job, count ( * ), avg (sal) from emp group by job ; ( 49 ) 统计每个部门中各个工种的人数与平均工资。 select deptno,job, count ( * ), avg (sal) from emp group by deptno,job order by deptno,job; ( 50 ) 查询工资、奖金与10 号部门某个员工工资、奖金都相同的员工的信息。 select emp. * from emp join ( select sal,comm from emp where deptno = 10 ) t on emp.sal = t.sal and nvl(emp.comm, 0 ) = nvl(t.comm, 0 ) and emp.deptno != 10 ; ( 51 ) 查询部门人数大于5的部门的员工的信息。 select * from emp where deptno in ( select deptno from emp group by deptno having count ( * ) > 5 ); ( 52 ) 查询所有员工工资都大于1000的部门的信息。 select * from dept where deptno in ( select distinct deptno from emp where deptno not in ( select distinct deptno from emp where sal < 1000 )) ; ( 53 ) 查询所有员工工资都大于1000的部门的信息及其员工信息。 select * from emp join dept on dept.deptno in ( select distinct deptno from emp where deptno not in ( select distinct deptno from emp where sal < 1000 )) and dept.deptno = emp.deptno; ( 54 ) 查询所有员工工资都在900 ~ 3000之间的部门的信息。 select * from dept where deptno in ( select distinct deptno from emp where deptno not in ( select distinct deptno from emp where sal not between 900 and 3000 )) ; ( 55 ) 查询所有工资都在900 ~ 3000之间的员工所在部门的员工信息。 select * from emp where deptno in ( select distinct deptno from emp where deptno not in ( select distinct deptno from emp where sal not between 900 and 3000 )) ; ( 56 ) 查询每个员工的领导所在部门的信息。 select * from ( select e1.empno,e1.ename,e1.mgr mno,e2.ename mname,e2.deptno from emp e1 join emp e2 on e1.mgr = e2.empno) t join dept on t.deptno = dept.deptno ; ( 57 ) 查询人数最多的部门信息。 select * from dept where deptno in ( select deptno from ( select count ( * ) count ,deptno from emp group by deptno) where count in ( select max ( count ) from ( select count ( * ) count ,deptno from emp group by deptno))); ( 58 ) 查询30号部门中工资排序前3名的员工信息。 select * from emp where empno in ( select empno from ( select empno,sal from emp where deptno = 30 order by sal desc ) where rownum < 4 ) ; ( 59 ) 查询所有员工中工资排在5 ~ 10名之间的员工信息。 select * from emp where empno in ( select empno from ( select empno,rownum num from ( select empno,sal from emp order by sal desc )) where num between 5 and 10 ) ; select empno from ( select empno,sal from emp order by sal desc ) where rownum <= 10 minus select empno from ( select empno,sal from emp order by sal desc ) where rownum < 5 ; ( 60 ) 查询SMITH员工及所有其直接、间接下属员工的信息。 ( 61 ) 查询SOCTT员工及其直接、间接上级员工的信息。 ( 62 ) 以树状结构查询所有员工与领导之间的层次关系。 ( 63 ) 向emp表中插入一条记录,员工号为1357,员工名字为oracle,工资为2050元,部门号为20,入职日期为2002年5月10日。 insertinto emp(empno,ename,sal,deptno,hiredate) values ( 1357 , ' oracle ' , 2050 , 20 ,to_date( ' 2002年5月10日 ' , ' yyyy"年"mm"月"dd"日" ' )) ; ( 64 ) 向emp表中插入一条记录,员工名字为FAN,员工号为8000,其他信息与SMITH员工的信息相同。 ( 65 ) 将各部门员工的工资修改为该员工所在部门平均工资加1000。 update emp t1 set sal = ( select new_sal from ( select avg (sal) + 1000 new_sal,deptno from emp group by deptno) t2 wher e t1.deptno = t2.deptno ) ;
解锁用户、设置密码
使用sqlplus程序登录
SQL*Plus: Release 11.2.0.2.0 Production on 星期四 11月 27 15:58:01 2014
Copyright (c) 1982, 2010, Oracle. All rights reserved.
SQL> connect sys as sysdba
输入口令:
已连接。
SQL> alter user HR account unlock;
用户已更改。
SQL> alter user HR identified by 123456;
用户已更改。
SQL>