1. 程式人生 > 實用技巧 >Oracle常見問題總結

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

原因:

使用者至少需要會話的權利,否則連線也不成功;

使用者在會話的權利上,應該有其他操作的權利;

1grant connect, resource to aaaa;

2grant 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 和SQLServer也是不支援這兩種寫法的

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 INTOa表 VALUES(各個值1)INTOa表 VALUES (其它值2)INTOa表 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;