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;
上面这三条语句从作用上来说是没有差别的,都是查看是否有记录,一般是作条件查询用的。 
select 1 from 中的1是一常量(可以为任意数值),查到的所有行的值都是它,但从效率上来说,1>anycol>*,因为不用查字典表。
 
7.Oracle 删除用户时报 “必须指定 CASCADE 以删除 'nini'”
这说明你要删除的oracle 用户"nini" 下面还有数据库对象,如 table, view 等,这样你删除用户时必须加选项 cascade:
drop user se cascade; 表示删除用户SE,同时删除 SE 用户下的所有数据对象。
还有一个办法就是先删除 se 下的所有数据对象,使 se 变成一个啥也没有的空用户,再 drop user se; 
一般来说要具有 dba 权限的用户才能删除其他用户
8.as is
一直纠结于存储过程的is与as最近在网上查了巨多资料,总结如下:
在存储过程(PROCEDURE)和函数(FUNCTION)中没有区别;
在视图(VIEW)中只能用AS不能用IS;
在游标(CURSOR)中只能用IS不能用AS。 
从其定义也可以看出没什么区别,要是有估计暂时也很少有人发下:
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。

 10.创建物化视图权限不足

如上创建物化视图,

大家都知道目标用户需要给创建用户 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种解决办法

在oracle创建了一个新的表空间和一个新的用户,当用这个新用户创建表时,
    却出现:ORA-01950: 表空 间'USERS'中无权限 。
   我已经把创建表的权限赋给了此用户,怎么还会缺少权限呢?
解决办法
   方法1:赋予该用户RESOURCE角色 
    SQL> connect / as sysdba
       已连接。
     SQL> grant resource to zhaoh;
      授权成功。
     SQL> connect zhaoh/a
     已连接。
    SQL> create table test (ID number,name varchar2(40));
     表已创建。
   方法2:增加该用户表空 间'USERS'中的配额
        SQL> select * from user_sys_privs;
               USERNAME                       PRIVILEGE                                ADM
                ------------------------------ ---------------------------------------- ---
                  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;

 

posted @ 2020-09-12 22:15  nbako555  阅读(433)  评论(0编辑  收藏  举报