亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

常見的SQL錯誤和解決方法

系統 1854 0

前言

  今天你會看到每個人——從新手到專家——在使用SQL時犯的各種常見錯誤。你不能永遠避免犯任何錯誤,但是熟悉廣泛的錯誤將幫助你在盡可能短的時間內解決這些錯誤。

  注:在我們的例子中我們使用的是Oracle7個人版。你特定的執行可能和這個錯誤類型相似,但是錯誤號和名稱可能不同。我們使用SQL*PLUS來運行我們的SQL語句,并設置ECHO和FEEDBACK為開的狀態來查看聲明。

  記住,一些錯誤會產生錯誤信息,而另一些可能只是在邏輯上不充分,它們將不可避免的在接下來引起重大的錯誤。如果你嚴格關注細節,你可以避免大多數錯誤,盡管你還總是會偶爾發現錯誤。

常見錯誤

  本節描述了許多你在執行所有類型的SQL語句時會得到的常見錯誤。大多數都很簡單,簡單到使你想踢自己一腳,而其它的看起來很明顯的錯誤則是由于理解錯誤而產生的。

表或視圖不存在

  當你收到一個錯誤聲明你要訪問的表不存在時,這是很容易查證的;例如:

輸入:

  SQL> @tables.sql

輸出:

SQL> spool tables.lst
            
              
                SQL> set echo on
              
            
          
            
              
                SQL> set feedback on
              
            
          
            
              
                SQL> set pagesize 1000
              
            
          
            
              
                SQL> select owner|| '.' || table_name
              
            
          
            
              
                 2 from sys.dba_table
              
            
          
            
              
                 3 where owner = 'SYSTEM'
              
            
          
            
              
                 4 order by table_name
              
            
          
            
              
                 5 /
              
            
          
            
              
                 from sys.dba_table
              
            
          
            
              
                 *
              
            
          
            
              
                ERROR at line 2:
              
            
          
            
              
                ORA-00942: table or view does not exist
              
            
          
            
              
                 SQL> spool off
              
            
          
SQL>

?

分析:

  注意在table 單詞下面的星號。正確的表名是sys.dba_tables 。而之前的表名里缺少了s。

  但是如果你知道這個表確實存在而你仍然收到了這個錯誤信息呢?有的時候當你收到了這個錯誤時,這個表事實上是存在的,但是可能有個安全問題——那就是,這個表存在,但是你沒有權限訪問它。這個錯誤還可能是數據庫服務器對“你沒有權限訪問這個表!”的一種委婉的說法。

  提示: 在你驚慌之前,如果有可用的DBA帳戶,立即使用一個DBA帳戶驗證這個表是否存在,或者使用schema 帳戶。你會經常發現表確實存在,而是這個用戶缺乏適當的權限來訪問它。

無效的用戶名和密碼

輸入:

  SQL*Plus: Release 3.2.3.0.0 - on Sat May 10 11:15:35 1997   Copyright (c) Oracle Corporation 1979, 1994. All rights reserved.   Enter user-name: rplew   Enter password:

?

輸出:

  ERROR: ORA-01017: invalid username/password; logon denied   Enter user-name:

?

  這個錯誤的原因是輸入了不正確的用戶名或不正確的密碼。再試一次。如果還不成功,重置你的密碼。如果你確定你輸入了正確的用戶名和密碼,并且你對不只一個的數據庫具有權限,那么確保你正在試圖連接的是正確的數據庫。

沒有指定FROM關鍵字

輸入:

  SQL> @tblspc.sql

輸出:

SQL> spool tblspc.lst
            
              
                SQL> set echo on
              
            
          
            
              
                SQL> set feedback on
              
            
          
            
              
                SQL> set pagesize 1000
              
            
          
            
              
                SQL> select substr(tablespace_name,1,15) a,
              
            
          
            
              
                 2 substrfile_name, 1,45) c, bytes
              
            
          
            
              
                 3 from sys.dba_data_files
              
            
          
            
              
                 4 order by tablespace_name;
              
            
          
            
              
                 substrfile_name, 1,45) c, bytes
              
            
          
            
              
                 *
              
            
          
            
              
                ERROR at line 2:
              
            
          
            
              
                ORA-00923: FROM keyword not found where expected
              
            
          
            
              
                SQL> spool off
              
            
          
SQL>

?

分析:

  這個錯誤可能令人誤解。有關鍵字FROM,但是你在第二行上在substr和file_name之間丟失了一個左括號。這個錯誤還可能是由于在SELECT語句中的字段名稱之間丟失了逗號而引起的。如果在SELECT語句中一個字段后沒有跟著一個逗號,這個查詢處理器會自動查找FROM關鍵字。上面的語句修改如下:  

SQL> select substr(tablespace_name,1,15) a,
            
              
                 2 
                
                   substr(file_name,1,45) c, bytes
                
              
            
          
            
              
                 3 
                
                   from sys.dba_data_files
                
              
            
          
? 4? order by tablespace_name;

?

這里不允許使用Group功能

輸入:

SQL> select count(last_name), first_name, phone_number
            
              
                 2 
                
                  from employee_tbl
                
              
            
          
            
              
                 3 
                
                  group by count(last_name), first_name, phone_number
                
              
            
          
            
              
                 4 
                
                   /
                
              
            
          

?

輸出:

???? group by count(last_name), first_name, phone_number
            
              
                 *
              
            
          
            
              
                ERROR at line 3:
              
            
          
            
              
                ORA-00934: group function is not allowed here
              
            
          
            
              
                SQL>
              
            
          

?

分析:

  對于任何group功能, COUNT不能用在GROUP BY條件中。你只可以列出字段和非group功能,例如在GROUP BY 中使用SUBSTR條件。

  提示: COUNT是一個作用于查詢中的group上的功能。

  上一個語句使用適當的語法修改如下:

SQL> select count(last_name), first_name, phone_number
            
              
                 2 
                
                  from employee_tbl
                
              
            
          
? 3? group by last_name, first_name, phone_number;

?

無效的字段名稱

輸入:

  SQL> @tables.sql

輸出:

SQL> spool tables.lst
            
              
                SQL> set echo on
              
            
          
            
              
                SQL> set feedback on
              
            
          
            
              
                SQL> set pagesize 1000
              
            
          
            
              
                SQL> select owner|| '.' || tablename
              
            
          
            
              
                 2 from sys.dba_tables
              
            
          
            
              
                 3 where owner = 'SYSTEM'
              
            
          
            
              
                 4 order by table_name
              
            
          
            
              
                 5 /
              
            
          
            
              
                 select owner|| '.' || tablename
              
            
          
            
              
                 *
              
            
          
            
              
                ERROR at line 1:
              
            
          
            
              
                ORA-00904: invalid column name
              
            
          
            
              
                SQL> spool off
              
            
          
            
              
                SQL>
              
            
          

?

分析:

  在第一行中,字段tablename 不正確。正確的字段名稱是table_name。下劃線被忽略了。要查看正確的字段名稱,使用DESCRIBE命令。這個錯誤還可能發生在當你在SELECT語句中試圖使用錯誤的表名來限定一個字段。

 缺少關鍵字

輸入:

SQL> create view emp_view
            
              
                 2 select * from employee_tbl
              
            
          
? 3? /

?

輸出:

??? select * from employee_tbl
            
              
                 *
              
            
          
            
              
                ERROR at line 2:
              
            
          
            
              
                ORA-00905: missing keyword
              
            
          
            
              
                SQL>
              
            
          

?

分析:

  這里是語法不正確。這個錯誤發生在當你在任何特定的命令語法中丟失了強制性的詞的時候。如果你使用一個命令的可選部分,這個選項可能要求一個特定的關鍵詞。在這個示例中缺少的關鍵詞是as。這個正確的語句如下所示:

SQL> create view emp_view as
            
              
                 2 
                
                  select * from employee_tbl
                
              
            
          
            
              
                 3 
                
                  /
                
              
            
          

?

缺少左括號

輸入:

  SQL> @insert.sql

輸出:

SQL> insert into people_tbl values
            
              
                 2 '303785523', 'SMITH', 'JOHN', 'JAY', 'MALE', '10-JAN-50')
              
            
          
            
              
                 3 /
              
            
          
            
              
                 '303785523', 'SMITH', 'JOHN', 'JAY', 'MALE', '10-JAN-50')
              
            
          
            
              
                 *
              
            
          
            
              
                 ERROR at line 2:
              
            
          
            
              
                 ORA-00906: missing left parenthesis
              
            
          
            
              
                SQL>
              
            
          

?

分析:

 在第二行在社會保險號碼之前缺少一個括號。正確的語法應該如下所示:

SQL> insert into people_tbl values
            
              
                 2 
                
                  ('303785523', 'SMITH', 'JOHN', 'JAY', 'MALE', '10-JAN-50')
                
              
            
          
            
              
                 3 
                
                  /
                
              
            
          

?

缺少右括號

輸入:

  SQL> @tblspc.sql

輸出:

SQL> spool tblspc.lst
            
              
                SQL> set echo on
              
            
          
            
              
                SQL> set feedback on
              
            
          
            
              
                SQL> set pagesize 1000
              
            
          
            
              
                SQL> select substr(tablespace_name,1,15 a,
              
            
          
            
              
                 2 substr(file_name, 1,45) c, bytes
              
            
          
            
              
                 3 from sys.dba_data_files
              
            
          
            
              
                 4 order by tablespace_name;
              
            
          
            
              
                 select substr(tablespace_name,1,15 a,
              
            
          
            
              
                 *
              
            
          
            
              
                ERROR at line 1:
              
            
          
            
              
                ORA-00907: missing right parenthesis
              
            
          
            
              
                SQL> spool off
              
            
          
            
              
                SQL>
              
            
          

?

分析:

  在第一行的substr那里缺少右括號。正確的語法如下所示:

SQL> select substr(tablespace_name,1,15) a,
            
              
                 2 
                
                   substr(file_name,1,45) c, bytes
                
              
            
          
            
              
                 3 
                
                   from sys.dba_data_files
                
              
            
          
            
              
                 4 
                
                  order by tablespace_name;
                
              
            
          

?

缺少逗號

輸入:

SQL> @ezinsert.sql

輸出:

SQL> spool ezinsert.lst
            
              
                SQL> set echo on
              
            
          
            
              
                SQL> set feedback on
              
            
          
            
              
                SQL> insert into office_tbl values
              
            
          
            
              
                 2 ('303785523' 'SMITH', 'OFFICE OF THE STATE OF INDIANA, ADJUTANT GENERAL')
              
            
          
            
              
                 3 /
              
            
          
            
              
                 ('303785523' 'SMITH', 'OFFICE OF THE STATE OF INDIANA, ADJUTANT GENERAL')
              
            
          
            
              
                 *
              
            
          
            
              
                ERROR at line 2:
              
            
          
            
              
                ORA-00917: missing comma
              
            
          
            
              
                SQL> spool off
              
            
          
            
              
                SQL>
              
            
          

?

分析:

  在第二行在社會保險號碼和SMITH 之間缺少一個逗號。

字段定義模糊

輸入:

  SQL> @employee_tbl

輸出:

SQL> spool employee.lst
            
              
                SQL> set echo on
              
            
          
            
              
                SQL> set feedback on
              
            
          
            
              
                SQL> select p.ssn, name, e.address, e.phone
              
            
          
            
              
                 2 from employee_tbl e,
              
            
          
            
              
                 3 payroll_tbl p
              
            
          
            
              
                 4 where e.ssn =p.ssn;
              
            
          
            
              
                 select p.ssn, name, e.address, e.phone
              
            
          
            
              
                 *
              
            
          
            
              
                ERROR at line 1:
              
            
          
            
              
                ORA-00918: column ambigously defined
              
            
          
            
              
                SQL> spool off
              
            
          
            
              
                SQL>
              
            
          

?

分析:

  在第一行的字段name沒有明確定義。給定了兩個表別名為e和p。你要決定使用哪個表的name字段并用表的別名定義它。

SQL命令沒有恰當的結束

輸入:

SQL> create view emp_tbl as
            
              
                 2 
                
                  select * from employee_tbl
                
              
            
          
            
              
                 3 
                
                  order by name
                
              
            
          
            
              
                 4 
                
                   /
                
              
            
          

?

輸出:

???? order by name
            
              
                 *
              
            
          
            
              
                ERROR at line 3:
              
            
          
            
              
                ORA-00933: SQL command not properly ended
              
            
          
            
              
                SQL>
              
            
          

?

分析:

  為什么命令沒有恰當的結束?你知道你可以使用一個/來結束一個SQL語句。另一個笨蛋。ORDER BY條件不能使用在CREATE VIEW語句中。而是使用GROUP BY來代替。在這里查詢處理器在ORDER BY條件之前尋找一個結束符(分號或斜線),因為處理器假定ORDER BY不是CREATE VIEW語句的一部分。因為在ORDER BY之前沒有找到結束符,所以返回了這個錯誤而不是指向ORDER BY的錯誤

缺少表達式

輸入:

  SQL> @tables.sql

輸出:

SQL> spool tables.lst
            
              
                SQL> set echo on
              
            
          
            
              
                SQL> set feedback on
              
            
          
            
              
                SQL> set pagesize 1000
              
            
          
            
              
                SQL> select owner|| '.' || table,
              
            
          
            
              
                 2 from sys.dba_tables
              
            
          
            
              
                 3 where owner = 'SYSTEM'
              
            
          
            
              
                 4 order by table_name
              
            
          
            
              
                 5 /
              
            
          
            
              
                 from sys.dba_tables
              
            
          
            
              
                 *
              
            
          
            
              
                ERROR at line 2:
              
            
          
            
              
                ORA-00936: missing expression
              
            
          
            
              
                SQL> spool off
              
            
          
            
              
                SQL>
              
            
          

?

分析:

  注意在第一行的table 后面有個逗號:因此,查詢處理器在SELECT條件中尋找另一個字段。在這里,處理器不希望遇到FROM 條件。

對于函數來說論據不充分

輸入:

  SQL> @tblspc.sql

輸出:

SQL> spool tblspc.lst
            
              
                SQL> set echo on
              
            
          
            
              
                SQL> set feedback on
              
            
          
            
              
                SQL> set pagesize 1000
              
            
          
            
              
                SQL> select substr(tablespace_name,1,15) a,
              
            
          
            
              
                 2 decode(substr(file_name,1,45)) c, bytes
              
            
          
            
              
                 3 from sys.dba_data_files
              
            
          
            
              
                 4 order by tablespace_name;
              
            
          
            
              
                 decode(substr(file_name,1,45)) c, bytes
              
            
          
            
              
                 *
              
            
          
            
              
                ERROR at line 2:
              
            
          
            
              
                ORA-00938: not enough arguments for function
              
            
          
            
              
                SQL> spool off
              
            
          
            
              
                SQL>
              
            
          

?

分析:

  對于DECODE函數來說論據不充分。檢查你的執行是否采用了恰當的語法。

值不夠

輸入:

  SQL> @ezinsert.sql

輸出:

SQL> spool ezinsert.lst
            
              
                SQL> set echo on
              
            
          
            
              
                SQL> set feedback on
              
            
          
            
              
                SQL> insert into employee_tbl values
              
            
          
            
              
                 2 ('303785523', 'SMITH', 'JOHN', 'JAY', 'MALE')
              
            
          
            
              
                 3 /
              
            
          
            
              
                 insert into employee_tbl values
              
            
          
            
              
                 *
              
            
          
            
              
                ERROR at line 1:
              
            
          
            
              
                ORA-00947: not enough values
              
            
          
            
              
                SQL> spool off
              
            
          
            
              
                SQL>
              
            
          

?

分析:

  缺少一個字段的值。在表上執行DESCRIBE命令來找出缺少的字段。只有列出了將被插入的字段,你才可以插入指定的數據,如下面的示例中所示:

輸入:

SQL> spool ezinsert.lst
            
              
                SQL> 
                
                  set echo on
                
              
            
          
            
              
                SQL> 
                
                  set feedback on
                
              
            
          
            
              
                SQL> 
                
                  insert into employee_tbl (ssn, last_name, first_name, mid_name, sex)
                
              
            
          
            
              
                 2 
                
                  values ('303785523', 'SMITH', 'JOHN', 'JAY', 'MALE')
                
              
            
          
            
              
                 3 
                
                  /
                
              
            
          

?

完整性約束沖突——沒有找到父鍵

輸入:

SQL> insert into payroll_tbl values
            
              
                 2 
                
                  ('111111111', 'SMITH', 'JOHN')
                
              
            
          
            
              
                 3 
                
                   /
                
              
            
          

?

輸出:

???? insert into payroll_tbl values
            
              
                 *
              
            
          
            
              
                ERROR at line 1:
              
            
          
            
              
                ORA-02291: integrity constraint (employee_cons) violated - parent
              
            
          
            
              
                key not found
              
            
          
            
              
                SQL>
              
            
          

?

分析:

  這個錯誤是由試圖將不存在于父表中的數據插入表中而引起的。檢查父表以確定正確的數據。如果缺少這個數據,那么你必須在試圖將數據插入子表之前將數據插入父表中。

Oracle不可用

輸入:

  (sun_su3)/home> sqlplus   SQL*Plus: Release 3.2.3.0.0 - Production on Sat May 10 11:19:50 1997   Copyright (c) Oracle Corporation 1979, 1994. All rights reserved.   Enter user-name: rplew   Enter password:

?

輸出:

?

  ERROR: ORA-01034: ORACLE not available   ORA-07318: smsget: open error when opening sgadef.dbf file.

?

分析:

  你在試著在SQL*PLUS? 上顯示。數據庫可能停止了。檢查數據庫的狀態。還有,如果你有多個數據庫的訪問權限,確保你正在試著連接的是正確的數據庫。

插入的值對于該字段來說過大

輸入:

  SQL> @ezinsert.sql

輸出:

SQL> spool ezinsert.lst
            
              
                SQL> set echo on
              
            
          
            
              
                SQL> set feedback on
              
            
          
            
              
                SQL> insert into office_tbl values
              
            
          
            
              
                 2 ('303785523', 'SMITH', 'OFFICE OF THE STATE OF INDIANA, ADJUTANT GENERAL')
              
            
          
            
              
                 3 /
              
            
          
            
              
                 insert into office_tbl values
              
            
          
            
              
                 *
              
            
          
            
              
                ERROR at line 1:
              
            
          
            
              
                ORA-01401: inserted value too large for column
              
            
          
            
              
                SQL> spool off
              
            
          
            
              
                SQL>
              
            
          

?

分析:

  一個插入的值對于該字段來說過大。在表上執行DESCRIBE命令來確定正確的數據長度。如果有必要的話,你可以在表上執行ALTER TABLE命令來擴大字段的寬度。

TNS:監聽器不能解析連接描述符中所給出的SID

輸入:

  SQLDBA> connect rplew/xxxx@database1

輸出:

  ORA-12505: TNS:listener could not resolve SID given in connect descriptor   SQLDBA> disconnect?   Disconnected.   SQLDBA>

?

分析:

  這個錯誤在Oracle? 數據庫中是非常常見的。前面所述的錯誤涉及的監聽器所做的過程是允許從一個客戶端發來的請求與遠程服務器上的數據庫通信。在這里你試圖連接到數據庫。或者是數據庫名稱輸入錯誤,或者是監聽器停止了。檢查數據庫名稱,重試一遍。如果還是失敗,將這個錯誤通知數據庫管理員。

在授權過程中權限不足

 輸入:

  SQL> grant select on people_tbl to? ron;

輸出:

  grant select on people_tbl to ron?   *?   ERROR at line 1:   ORA-01749: you may not GRANT/REVOKE privileges to/from yourself   SQL>

?

輸入:

  SQL> grant select on demo.employee to? ron;

?

  輸 出:

  grant select on demo.employee to ron?   *?   ERROR at line 1:   ORA-01031: insufficient privileges   SQL>

?

  這個錯誤發生在你試圖授權給另一個用戶對表的操作,而你沒有適當的權限來這么做。你必須擁有這個表才能將這個表授權給其他的用戶。在Oracle里可以使用Admin選項給你授權,這意味著你可以將這個對另一個用戶的表的指定的權限授予其他用戶。檢查你對你授予一個權限所需的特定權限的執行。

在你的語句中換碼符——無效的字符

  在試圖調試一個有問題的SQL語句時,換碼符是非常麻煩的。當你在緩沖器中或文件中輸入你的SQL語句時,如果你使用回退鍵,那么這種情況就可能發生。有時回退鍵會放置一個無效的字符在這個語句中,這取決于你的鍵是怎樣匹配的,盡管你可能不能看到這個字符。

不能創建操作系統文件

  這個錯誤有幾個原因。最常見的原因是關聯的磁盤滿了或者是對文件系統設置了不正確的權限。如果是磁盤滿了,你必須刪除不需要的文件。如果權限不正確,改變它們為正確的設置。這個錯誤更偏向于操作系統錯誤,所以你可能需要從你的系統管理員那里獲得些建議。

常見的邏輯錯誤

  今天到目前為止我們介紹了在SQL語句中產生實際錯誤信息的錯誤。它們中的大多數是顯而易見的,并且它們的解決方法也很循規蹈矩。接下來的幾個錯誤邏輯性更強(或更少),并且它們可能在之后會引起問題——如果不是立即引起問題的話。

在你的SQL語句中使用保留字

輸入:

  SQL> select sysdate DATE

 2 from dual;

輸出:

  select sysdate DATE?   *?   ERROR at line 1:   ORA-00923: FROM keyword not found where expected

?

分析:

  在這個示例中查詢處理器不希望看到單詞DATE? ,因為它是保留字。在偽列SYSDATE后面沒有逗號:因此,它預期下一個元素應該是FROM條件。

輸入:

  SQL> select sysdate "DATE"

  2 from dual;

輸出:

  DATE

  --------

  15-MAY-97

分析:

  注意怎樣通過使用雙引號封裝DATE來減低保留字問題。雙引號允許你顯示文字字符串DATE作為一個字段的別名。

  注:? 確保要檢查你的特定數據庫文檔來獲得保留字列表,因為這些保留字因數據庫不同而不同。

  你在命名一個字段的別名時可能需要、也可能不需要使用雙引號。在下面的示例中你不需要使用雙引號,因為TODAY不是保留字。為了確保,請檢查你的特定的數據庫文檔。

輸入:

  SQL> select sysdate TODAY   2 from dual;

?

輸出:

  TODAY?   --------?   15-MAY-97   SQL>

?

選擇多個字段時的DISTINCT的使用

輸入:

  SQL> select distinct(city), distinct(zip)   2 from address_tbl;

?

輸出:

  select distinct(city), distinct(zip)?   *?   ERROR at line 1:   ORA-00936: missing expression   SQL>

?

分析:

  一個城市可能有不止一個的郵遞編碼。作為一項規則,你應該在某一字段上使用DISTINCT? 命令。

刪除一個無限定的表

  無論什么時候刪除一個表,總是要使用owner或schema? 。你可以在數據庫中有重復的表名。如果你不使用owner/schema 名稱,那么會刪錯表。

  下面是具有風險的刪除一個表的語法:

語法:

  SQL> drop table people_tbl;

  下面的語句比上面的安全的多,因為它指定了你想刪掉的表的owner。

語法:

  SQL> drop table ron.people_tbl;

警告: ? 在刪除表的時候限制這個表通常是一個安全的做法,盡管有時這一步可能不必要。在你通過驗證用來連接到數據庫所使用的用戶id之前不要執行DROP TABLE? 命令。

  在Multischema數據庫中使用公共同義詞

  同義詞使得用戶的工作更簡單:然而,公共同義詞打開了你可能不想所有用戶都看到的表。在授權公共同義詞,特別是在一個multischema環境中時,使用警告。

可怕的笛卡兒積

輸入:

  SQL> select a.ssn, p.last_n?   2 from address_tbl a,   3 people_tbl p;

?

輸出:

SSN??????? LAST_NAME
            
              
                --------- ---------------
              
            
          
            
              
                303785523 SMITH
              
            
          
            
              
                313507927 SMITH
              
            
          
            
              
                490552223 SMITH
              
            
          
            
              
                312667771 SMITH
              
            
          
            
              
                420001690 SMITH
              
            
          
            
              
                303785523 JONES
              
            
          
            
              
                313507927 JONES
              
            
          
            
              
                490552223 JONES
              
            
          
            
              
                312667771 JONES
              
            
          
            
              
                420001690 JONES
              
            
          
            
              
                303785523 OSBORN
              
            
          
            
              
                313507927 OSBORN
              
            
          
            
              
                490552223 OSBORN
              
            
          
            
              
                312667771 OSBORN
              
            
          
            
              
                420001690 OSBORN
              
            
          
            
              
                303785523 JONES
              
            
          
            
              
                313507927 JONES
              
            
          
            
              
                490552223 JONES
              
            
          
            
              
                312667771 JONES
              
            
          
            
              
                420001690 JONES
              
            
          
          
            
              
                16 rows selected.
              
            
          

?

  這個錯誤是由于你在WHERE條件中沒有將表連接起來。注意選擇了多少行。前面所述的表都有4行;因此,我們希望返回4行而不是我們收到的16行。在WHERE條件中沒有使用連接,在第一個表的每一行與第二個表的每一行相匹配。要計算返回的總行數,你要將4行乘以4行,得到16。不幸的是,你的大多數表將包含4行以上的數據,有可能達到上千行或幾百萬行。在這種情況下就不用麻煩的計算這個乘積了,因為你的查詢肯定是個很耗時的查詢。

執行輸入標準失敗

  假設采用的輸入標準就是普遍知道的質量保證(QA)。沒有數據輸入職員對輸入的數據進行定期檢查,那么就很可能在你的數據庫中存有很多垃圾。一個保持對質量保證的處理的好的方法是使用SQL創建幾個QA報告,然后定時運行,并將它們的輸出顯示給數據輸入管理員以采取適當的動作來修正錯誤或數據不一致。

執行文件系統結構規定失敗

  你使用不標準的文件系統時它可能會浪費大量的時間。檢查你的結構以采用推薦的文件系統結構。

允許大表采取默認的存儲參數

  默認的存儲參數將隨著執行而變化,但是它們一般都相當的小。當創建了一個大型的或動態的表并讓其使用默認存儲,就會產生嚴重的表破碎情況,這會嚴重干擾數據庫性能。在創建表之前進行良好的計劃將幫助避免這種情況。下面的示例使用了Oracle的存儲參數選項。

輸入:

SQL> create table test_tbl
            
              
                 2 
                
                  (ssn number(9) not null,
                
              
            
          
            
              
                 3 
                
                  name varchar2(30) not null)
                
              
            
          
            
              
                 4 
                
                   storage
                
              
            
          
            
              
                 5
                
                   (initial extent 100M
                
              
            
          
            
              
                 6 
                
                   next extent 20M
                
              
            
          
            
              
                 7 
                
                   minextents 1
                
              
            
          
            
              
                 8 
                
                   maxextents 121
                
              
            
          
            
              
                 9 
                
                   pctincrease 0};
                
              
            
          

?

 在系統表空間中放置對象

  下面的語句顯示了在系統表空間中創建一個表。盡管這個語句不會返回錯誤,但是它很可能在以后引起問題。

輸入:

SQL> create table test_tbl
            
              
                 2 
                
                  (ssn number(9) not null,
                
              
            
          
            
              
                 3 
                
                  name varchar2(30) not null)
                
              
            
          
            
              
                 4 
                
                  tablespace SYSTEM
                
              
            
          
            
              
                 5 
                
                  storage
                
              
            
          
            
              
                 6 
                
                   (initial extent 100M
                
              
            
          
            
              
                 7 
                
                  next extent 20M
                
              
            
          
            
              
                 8 
                
                  minextents 1
                
              
            
          
            
              
                 9 
                
                  maxextents 121
                
              
            
          
            
              
                 10 
                
                  pctincrease 0};
                
              
            
          

?

下一個示例糾正了這個所謂的問題:

輸出:

SQL> create table test_tbl
            
              
                 2 
                
                  (ssn number(9) not null,
                
              
            
          
            
              
                 3 
                
                  name varchar2(30) not null)
                
              
            
          
            
              
                 4 
                
                   tablespace linda_ts
                
              
            
          
            
              
                 5 
                
                   (initial extent 100M
                
              
            
          
            
              
                 6 
                
                  next extent 20M
                
              
            
          
            
              
                 7 
                
                   minextents 1
                
              
            
          
            
              
                 8 
                
                  maxextents 121
                
              
            
          
            
              
                 9 
                
                  pctincrease 0};
                
              
            
          

?

分析:

  在Oracle中, SYSTEM表空間是用來存儲SYSTEM擁有的對象,例如那些組成了數據字典的對象。如果你偶然放置了動態表到這個表空間中,并且它們繼續發展,那么你就有崩潰或至少填滿空余空間的風險,這會反回來引起數據庫崩潰。在這種情況下,數據庫可能會強制進入不可恢復的狀態。所以要將應用和用戶表存儲在單獨指定的表空間中

壓縮大型備份文件失敗

  如果你做大型的導出,并且沒有壓縮這些文件,你很可能會沒有磁盤空間來存儲這些文件。所以要壓縮這些導出文件。如果你將存檔日志文件存儲在硬盤上而不是磁帶上,那這些文件可以或很可能應該壓縮保存。

對系統資源的預算失敗

  你應該在創建你的數據庫之前總是對你的系統資源進行預算。不對系統資源進行預算的結果可能導致數據庫性能很差。你應該總是了解數據庫是將用于交易、數據倉庫或僅僅是查詢。數據庫的功能將影響回滾部分的數目和規模。數據庫用戶的數目將不可避免的影響USERS和TEMP表空間的規模。你是否有足夠的空間來放置你更大的表?表和索引應該存儲在單獨的設備上來減少磁盤內容。你應該在單獨的設備上保存重做日志和數據表空間以減少磁盤內容。在考慮系統資源的時候只有這幾個問題要解決。

防止產生數據問題

  你的數據處理中心應該建立一個備份系統。如果你的系統是小型至中型的,你可以使用EXPORT進行額外的防范以確保你的數據進行了備份。你應該對輸出文件進行備份并將其存儲在另一個地方以達到更進一步的安全性。記住這些文件可能會很大,會要求很大的空間。

  搜索你的數據庫中的重復的記錄

  如果你的數據庫進行了很好的計劃,那么你應該沒有重復記錄的問題。你可以使用約束、外鍵和唯一索引來避免重復記錄。

總結

  許多不同類型的錯誤——上百個——會干擾你和你的數據。幸運的是,大多數錯誤都不是災難性的,并很好解決。然而,有一些錯誤如果發生了就非常嚴重。無論你什么時候試著糾正錯誤,你都要非常謹慎,因為如果你沒有找到問題的根源那這個問題很可能會加倍。當你確實產生了錯誤,當然這是肯定會的,將它們當作你的學習經歷。

  提示:我們希望將所有與數據庫錯誤相關的內容都記錄下來,特別是我們偶然發現的不常見的錯誤。一個包含各種錯誤的文件是一個寶貴的故障排除參考。

  注:第21天提供給你一些最常見的Oracle7個人版的錯誤示例。要查看完整的錯誤列表和建議的解決方法,請查看你的數據庫文檔。

問題和解答

你使得它聽起來好像每一個錯誤都有一個解決方法,那么為什么還要擔心呢?

是的,大多數錯誤都很容易解決;但是假設你在一個生產環境中刪除了一個表。你可能需要幾小時或幾天來做這個數據庫恢復工作。數據庫將在這段時間里完成這個工作,而你的公司將給幾個人支付加班費來完成這個修復。老板不會高興的。

你有任何關于怎樣避免錯誤的建議嗎?

作為一個人類,你不會永遠避免犯錯;然而,你可以通過練習、集中注意力、自信、良好的態度和一個沒有壓力的工作環境來避免大多數的錯誤。

說了這么多,該考考你的閱讀的成果了:

習題

  習題提供了測試問題來幫助你鞏固對本文描述的內容的理解,還提供了練習以供你使用你所學到的東西。在查看附錄F中的答案——“測試和練習的答案”——之前試著回答這個測試和練習問題。

 測試

  1.一個用戶打電話說,“我不能登錄到數據庫上。但是昨天一切還都運行良好。這個錯誤說無效的用戶/密碼。你可以幫我嗎?”你應該采取什么樣的步驟?

  2.為什么表應該有存儲條件和一個表空間目的地?

練習:

  1. 假設你以SYSTEM登錄到數據庫上,并且你希望刪除在你的schema中的一個叫做HISTORY 的表。你的普通的用戶id是JSMITH 。那么刪除這個表的正確的語法是什么?

  2. 糾正下面的錯誤:

輸入:

  SQL> select sysdate DATE   2 from dual;

?

輸出:

  select sysdate DATE?   *?   ERROR at line 1:   ORA-00923: FROM keyword not found where expected

?

?

?

常見的SQL錯誤和解決方法


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 青青青在线视频播放免费 | 亚洲高清毛片 | 四虎国产成人永久精品免费 | 久久99国产亚洲高清观看首页 | 91精品全国免费观看 | 97免费在线观看视频 | 在线国产一区二区三区 | 久久久这里只有精品免费 | 国产精品自线在线播放 | 欧美亚洲日本国产 | 精品一区二区三区视频在线观看 | 精品视频国产 | 久草视频福利在线观看 | 成人国产精品 | 中文字幕一二三区乱码老 | 久久精品国产视频在热 | 成人午夜久久 | 亚洲国产一区在线 | 奇米影视555 | 久久精品国产99久久72 | 国产精品你懂得 | 福利99| 免费黄色小视频在线观看 | 亚洲欧美国产日产综合不卡 | 老妇毛片久久久久久久久 | 亚洲综合色婷婷 | 欧美一级视频精品观看 | 成人aaaa| 久久综合久久美利坚合众国 | 亚洲伦理网站 | 久久久免费 | 日韩亚洲一区中文字幕在线 | 日韩黄色大片 | 精品视频在线观看一区二区 | 国产做人爱三级视频在线 | 国产精品综合网 | 日本爱情动作片网址 | 亚洲视频免费看 | 亚洲欧洲国产精品久久 | 99热久久这里只精品国产 | 九九啪 |