Oracle常见问题总结
文章来源
https://www.cnblogs.com/lukelook/p/11151915.html
1.账号锁定了
ORA-28000: the account is locked
原因:这个用户已经被锁住了,一般是用错误的密码尝试次数太多,得解锁或者某些账号刚创建默认锁定的如scott用户。
解决办法:
用system或sys用户登陆,然后
ALTER USER username ACCOUNT UNLOCK;
或者
第一步:使用PL/SQL,登录名为system,数据库名称不变,选择类型的时候把Normal修改为Sysdba;
第二步:选择myjob,查看users;
第三步:选择system,右击点击“编辑”;
第四步:修改密码,把“帐户被锁住”的勾去掉;
第五步:点击“应用”再点击“关闭”;
第六步:重新登录就可以通过验证了;
2.忘记密码
ORA-01017: invalid username/password; logon denied
以sysdba登陆:
alter user scott identified by scott1234;
3.Oracle create session权利
user lacks CREATE SESSION privilege;logon denied
原因:
用户至少需要会话的权利,否则连接也不成功;
用户在会话的权利上,应该有其他操作的权利;
1 grant connect, resource to aaaa;
2 grant create session to aaaa;
4.oracle中单引号与双引号的作用
在Oracle数据库,单引号我们经常会用到,相对来说双引号用的频率少,但双引号的作用也是不可代替的,现简要说一下两者的作用。
一.单引号
1.单引号用于标识字符与数字的区别;
例如
select * from table_name where id=1;这种代表查询的是数字
select * from table_name where id='1';这种代表查询的是字符
2.当指定字符串文本时,必须用单引号将字符串文本引注
3.两个单引号表示一个单引号(两个'' 表示了一个')
二.双引号
1.如果创建对象的时候,对象名、字段名加双引号,则表示Oracle将严格区分大小写,否则Oracl都默认大写。
示例:
select '字段1' As "列a",'字段2' "小写b",'字段c' 默认大写c from dual;
列名分别是:列a,小写b,默认大写C
2.双引号用在字符串中当成普通字符处理
当表中字段与oracle数据库关键字相同时,可以用双引号引注,这样可以避免冲突
3.双引号用在to_char函数里的字符串中时,有特殊作用,可以将特殊字符包起来,避免出现ORA-01821: date format not recognized错误。也就是说,去掉双引号和其包含的字符后,剩下的应该是一个合法的格式串。
例如:select to_char(sysdate, 'hh24"小时"mi"分"ss"秒"') ASRESULT from dual;
5.不支持 insert into tableName values (...),(...)的写法
mysql中的写法:
INSERT INTO 某表 VALUES(各个值),VALUES(各个值),.....; -- 或者 INSERT INTO 某表 VALUES(各个值),(各个值),.....;
Oracle 和 SQL Server也是不支持这两种写法的
oracle 中要么单行插入 要么可以如下表示:
INSERT ALL INTO 某表 VALUES(各个值) INTO 某表 VALUES(各个值) INTO 某表 VALUES(各个值) select 1 from dual;
后边跟的SELECT 语句我们可以从虚拟表里查如 SELECT 1 FROM DUAL。注意后边跟的SELECT语句可以随意,不过不是把它SELECT出来的内容插入前边的表里,而是起到前边的多个数据每次插入多少行的作用,这个多少行是和后边跟的SELECT语句查出来几条而定的,如后边的跟的SELECT 语句查出了15条记录,那么前边的"INSERT ALL INTO a表 VALUES(各个值1) INTO a表 VALUES (其它值2) INTO a表 VALUES(其它值3)"就会先插入值1对应的各个字段插入15条记录,然后插入值2各个对应的字段15条记录,然后插入值3对应的各个字段15条记录,也就是说有点按列插入的意思。
我们要的是批量插入多个VALUES这样的一条记录,所以后边的SELECT 语句只要能查出一条记录就行,建议大家后边用SELECT 1 FROM DUAL。
6.SELECT 1 FROM dual
select 1 from table; select anycol(目的表集合中的任意一行) from table; -- (目的表集合中的任意一行) select * from table;
drop user se cascade; 表示删除用户SE,同时删除 SE 用户下的所有数据对象。
还有一个办法就是先删除 se 下的所有数据对象,使 se 变成一个啥也没有的空用户,再 drop user se;
一般来说要具有 dba 权限的用户才能删除其他用户
在存储过程(PROCEDURE)和函数(FUNCTION)中没有区别;
![](http://blog.itpub.net/kindeditor/plugins/emoticons/images/20.gif)
在视图(VIEW)中只能用AS不能用IS;
![](http://blog.itpub.net/kindeditor/plugins/emoticons/images/13.gif)
在游标(CURSOR)中只能用IS不能用AS。
![](http://blog.itpub.net/kindeditor/plugins/emoticons/images/12.gif)
从其定义也可以看出没什么区别,要是有估计暂时也很少有人发下:
create [or replace] procedure procedure_name [(parameter_name [in | out | in out] type [,........])] {is | as} begin procedure_body end procedure_name;
9.等号和不等号
不等号
<>
!=
~=
^=
等于号
=
赋值
:=
Oracle 提供了>(大于),>=(大于等于),<(小于),<=(小于等于),=(等于),<>或!=6(不等于)6个常用的比较运算符。
记住:null只能通过is null或者is not null来判断,其它操作符与null操作都是false。
如上创建物化视图,
大家都知道目标用户需要给创建用户 CREATE MATERIALIZED VIEW 权限
但是只是这样还是会报权限错误
如何处理:
REFRESH FORCE ON COMMIT
ENABLE QUERY REWRITE
因为在创建该物化视图的时候带了两个参数 需要把使用这两个权限给创建用户
GRANT ON COMMIT REFRESH to ANALYSIS;
GRANT GLOBAL QUERY REWRITE TO analysis;
这样就可以了...
其他同理
-
11.ORA-01950: 表空间'USERS'中无权限的2种解决办法
SQL> connect / as sysdba
已连接。
SQL> grant resource to zhaoh;
已连接。
SQL> create table test (ID number,name varchar2(40));
------------------------------ ---------------------------------------- ---
ZHAOH CREATE TABLE NO
SQL> connect / as sysdba;
已连接。
SQL> ALTER USER "ZHAOH" QUOTA UNLIMITED ON "USERS";
用户已更改。
SQL> connect zhaoh/a
已连接。
SQL> create table test (ID number,name varchar2(40));
表已创建。
12.创建序列出错 SP2-0042: 未知命令 "MINVALUE 1" - 其余行忽略。
语句
-- create SEQUENCE for user id CREATE SEQUENCE id_control MINVALUE 1 MAXVALUE 9999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER CYCLE;
报错
SP2-0042: 未知命令 "MINVALUE 1" - 其余行忽略。 SP2-0734: 未知的命令开头 "MAXVALUE 9..." - 忽略了剩余的行。 SP2-0734: 未知的命令开头 "INCREMENT ..." - 忽略了剩余的行。 SP2-0310: 无法打开文件 "WITH.sql" SP2-0042: 未知命令 "CACHE 20" - 其余行忽略。 SP2-0734: 未知的命令开头 "NOORDER CY..." - 忽略了剩余的行。
解决办法( sql脚本按行执行)
-- create SEQUENCE for user id CREATE SEQUENCE id_control MINVALUE 1 MAXVALUE 9999999999 INCREMENT BY 1 START WITH 1 CACHE 20NOORDER CYCLE;