程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> 案例學習Oracle錯誤:ORA-00922

案例學習Oracle錯誤:ORA-00922

編輯:Oracle數據庫基礎

ORA-00922 missing or invalid option

0RA-00922: 丟失或者無效的選項

Cause An invalid option was specifIEd in defining a column or storage clause. The valid option in specifying a column is NOT NULL to specify that the column cannot contain any NULL values. Only constraints may follow the datatype. Specifying a maximum length on a DATE or LONG datatype also causes this error.

Action Correct the syntax. Remove the erroneous option or length specification from the column or storage specification.

案例一:Oracle明文密碼漏洞

受影響系統:

Oracle Oracle10g Application Server 9.0.4.0

Oracle Oracle10g Application Server 10.1.0.2

描述:

Oracle Database是一款商業性質大型數據庫系統。

Oracle 10g存在包含明文密碼的全局可讀文件,本地攻擊者可以利用這個漏洞獲得對數據庫的訪問。

SYSMAN帳戶的密碼可在'$Oracle_HOME/hostname_sid/sysman/config/emoms.propertIEs'文件中獲得,此文件全局可讀。

另外如果安裝Oracle 10g時提供SYS, SYSTEM, DBSNMP和SYSMAN 帳戶密碼相同,並且密碼有驚歎號(如f00bar!!),那麼當設置SYSMAN和DBSNMP密碼時DB安裝會出現錯誤,錯誤信息"postDBCreation.log"會記錄密碼:

alter user SYSMAN identified by f00bar!! account unlock
ERROR at line 1:
ORA-00922: missing or invalid option
alter user DBSNMP identifIEd by f00bar!! account unlock
ERROR at line 1:
ORA-00922: missing or invalid option

<*來源:David LitchfIEld ([email protected]

鏈接:http://marc.theaimsgroup.com/?l=bugtraq&m=110382247308064&w=2

*>

建議:

廠商補丁:

Oracle

ORACLE已經發布patch (#68)來修正此漏洞:http://metalink.Oracle.com/

案例二:置換變量

我才剛開始使用Oracle的產品,我在執行下面兩條命令的時候遇到了問題:ACCEPT 和PROMPT。我已經更改了行的順序,有時候放在CHAR中,有時候刪除,有時候放在PROMPT中,有時候刪除。無論我怎麼做還是收到錯誤信息。我甚至試過把ACCEPT 和PROMPT放在BEGIN的前後。

我想做的事情是這樣的。在腳本的開始,我從鍵盤讀取開始和結束日期,然後在程序的主要部分,我從一個表中使用SELECT讀取,並測試看日期是否在鍵盤輸入的兩個日期之間。現在當我在SQL*Plus中執行/編譯腳本的時候,我得到的錯誤信息是ORA-00922。

PROMPT
ACCEPT in_beg_date  PROMPT 'Enter beginning extract date mm/dd/yy '
PROMPT
ACCEPT in_end_date  PROMPT 'Enter ending extract date mm/dd/yy '

DECLARE
   beg_date VARCHAR2(8) := &in_beg_date;
   end_date VARCHAR2(8) := &in_end_date;
   beg_dte  DATE;
   end_dte  DATE;
...
BEGIN
   beg_dte := TO_DATE (beg_date, 'MM/DD/YY');
   end_dte := TO_DATE (end_date, 'MM/DD/YY');
...
   IF (outrec_abs_date >= beg_dte and <= end_dte) THEN
...

說實話,看起來你對PROMPT 和 ACCEPT 有一個很好的理解。PROMPT 告訴SQL*Plus 在屏幕上書寫一行文字。你在這裡使用了兩個PROMPT命令;每個命令都在屏幕上打印一個空行,這對於垂直間距很有好處。ACCEPT命令是等待用戶輸入一個置換變量的值。ACCEPT命令中可選的PROMPT 子句在用戶輸入數值的同一行中顯示了一條信息。你在PL/SQL 塊的外面放置PROMPT 和 ACCEPT 是正確的:他們是SQL*Plus 命令,不是PL/SQL 。

你可能注意到當你運行這個腳本的時候,每一個擁有置換變量的行都引起了屏幕上的兩行輸出,例如:

old   3:    beg_date VARCHAR2(8) := &in_beg_date;
new   3:    beg_date VARCHAR2(8) := 09/01/03;

這就顯示了SQL*Plus 在看到一行包括了置換變量的代碼的時候所作的工作:他用變量的數值(以&開頭)置換了變量的名字。這就像你在文本編輯器,例如記事本中,用查找和置換一樣,將一個字符串的每個出現(這裡是&in_beg_date)都替換成了另一個字符串(09/09/03)。“原來”的行就是在代碼中的樣子。“新”的行是將要執行的樣子。如果你執行了"beg_date VARCHAR2(8) := 09/01/03;"語句,會發生什麼?SQL*Plus 會創建一個字符串變量並且用":="右側的數值來進行初始化。在這個案例中,它是一個數字表達式,那麼SQL*Plus 就會檢測"(9/1) / 3"這個表達式,並將答案寫為'3'。你實際的意思是:

beg_date VARCHAR2(8) := '&in_beg_date';
   end_date VARCHAR2(8) := '&in_end_date';

單引號是至關重要的。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved