2012-12-04 62 views
1

我正在使用Oracle SQL Developer進行文本挖掘:ODMiner ..我將數據「WEBLOG」導入到表中。此博客數據由用戶活動,日期,時間,url等組成。我採取的第一步是使用函數將數據表中的日期和時間轉換爲表示自01-01-1990以來40分鐘的數字。我把它除以2400(40分鐘秒)。主要目的是爲會議制定一個時間表。 我用下面的代碼,創建或替換函數錯誤

CREATE OR REPLACE FUNCTION ssnDate(
    DATE IN VARCHAR2 DEFAULT 03-01-18, 
    TIME IN VARCHAR2 
    ) RETURN NUMBER 
    AS 
    BEGIN 
     RETURN TRUNC((to_date(DATE||' '||TIME, 'DD-MM-YY HH:MM:SS')- to_date('01-JAN- 1990','DD-MON-YYYY')) * (86400/2400); 
    END ssnDate; 

這正是出現在日誌中運行該語句後,

FUNCTION ssnDate compiled 
Warning: execution completed with warning 

在此之後,我試圖創建一個視圖轉換日期和時間的之前創建的ssnDate,並將CS_URI_STEM(它是訪問的資源)和CS_URI_QUERY(客戶端正在嘗試執行的查詢(如果有的話))連接到名爲WEB_LINK的新字段中。

這是所使用的代碼,

CREATE OR REPLACE VIEW WEBLOG_VIEWS("C_IP", "WEB_LINK", "CS_USER_AGENT", "SESSION") 
    AS 
    SELECT ssnDate(LOG_DATE, LOG_TIME) AS 'SESSION', 
    C_IP, 
    CS_USER_AGENT, 
    (CS_URI_STEM||'?'||CS_URI_QUERY) AS WEB_LINK 
    FROM WEBLOG; 
從此我得到了以下錯誤

現在..

Error starting at line 1 in command: 
CREATE OR REPLACE VIEW WEBLOG_VIEWS("C_IP", "WEB_LINK", "CS_USER_AGENT", "SESSION") 
AS 
SELECT ssnDate(LOG_DATE, LOG_TIME) AS 'SESSION', 
C_IP, 
CS_USER_AGENT, 
(CS_URI_STEM||'?'||CS_URI_QUERY) AS WEB_LINK 
FROM WEBLOG 
Error at Command Line:3 Column:38 
Error report: 
SQL Error: ORA-00923: FROM keyword not found where expected 
00923. 00000 - "FROM keyword not found where expected" 
*Cause: 
*Action: 

我不明白,我要和這個去錯了。這是數據準備階段,需要我在應用建模技術或算法之前準備數據。下一步將根據會話時間,ip和每個會話的用戶代理以及訪問的web_links字段對數據進行分組該會話中的用戶。

我真的很感激任何有關輸入錯誤的地方或任何解決方案!在此行

回答

0

你必須在該小代碼段許多錯誤和低效率。

首先,

P_DATE IN VARCHAR2 DEFAULT 03-01-18 

這個默認是無稽之談。實際上你的默認值是負16(3減1分18!)。它應該是在單引號

P_DATE IN VARCHAR2 DEFAULT '03-01-18' 

其次,如果函數是簡單的,我會建議你只要把

TRUNC((to_date(DATE||' '||TIME, 'DD-MM-YY HH:MM:SS')- to_date('01-JAN-1990','DD-MON-YYYY')) * (86400/2400)) 

到視圖本身,以避免上下文(SQL-> PLSQL)切換爲每一行返回。如果你想保留它作爲一個函數,然後閱讀標量子查詢緩存。即使用確定性函數(或者在11g中去找result_cache)並將函數放入子查詢中。

第三,您的視圖定義列不與實際使用的列對齊。

CREATE OR REPLACE VIEW WEBLOG_VIEWS("C_IP", "WEB_LINK", 
    "CS_USER_AGENT", "SESSION") 
    AS 
    SELECT ssnDate(LOG_DATE, LOG_TIME) AS 'SESSION', 
    C_IP, 
    CS_USER_AGENT, 
    (CS_URI_STEM||'?'||CS_URI_QUERY) AS WEB_LINK 

所以C_IP真的是 「會話」,WEB_LINK真是C_IP等

也不要使用表/視圖SQL保留字(會話)。你要做的僅僅是棒爲自己回來,因爲你每次選擇反對這個觀點的時候,你需要輸入「會話」加上引號,而不僅僅是會話。

最後,爲什麼你存儲日期和時間爲CHAR數據,而不是原有的date?如果你能改變這種狀況,那麼從長遠來看,情況會好得多。特別是當你使用YY格式存儲日期時,這是比存儲爲YYYY更糟的罪!

因此,所有這樣說,如果你想保留的功能,改變它的東西是這樣的:

create or replace function ssndate(p_date in varchar2 default '03-01-18', 
            p_time in varchar2) 
return number 
$if dbms_db_version.ver_le_10 $then 
deterministic 
$elsif dbms_db_version.ver_le_11 $then 
result_cache 
$end 
as 
begin 
    return trunc((to_date(p_date||' '||p_time, 'dd-mm-yy hh24:mi:ss') 
      - to_date('01-jan-1990','dd-mon-yyyy')) * (86400/2400)); 
end ssndate; 
/

是$代碼將只是把RESULT_CACHE如果你是11g和確定性,否則。

,並認爲應該包含這個功能作爲一個子查詢,而不是:

create or replace view weblog_views 
as 
select (select ssndate(log_date, log_time) from dual) as "SESSION", 
     c_ip, 
     cs_user_agent, 
     (cs_uri_stem||'?'||cs_uri_query) as web_link 
    from weblog; 
1

使用雙引號:

SELECT ssnDate(LOG_DATE, LOG_TIME) AS "SESSION", 
+0

我想你的建議。我得到了下面的錯誤,錯誤在命令行:4列:7 錯誤報告: SQL錯誤:ORA-06575:包裝或功能SSNDATE處於無效狀態 06575. 00000 - 「包或函數%s是在無效狀態」 *原因:SQL語句引用一個PL/SQL函數是在 無效狀態。 Oracle試圖編譯該函數,但 檢測到錯誤。 *操作:檢查SQL語句和PL/SQL函數的語法 錯誤或錯誤分配,或丟失,特權的 引用的對象。 – user1874311

+0

oK,我以另一種方式嘗試了它併成功運行。 CREATE OR REPLACE FUNCTION ssnDate( P_DATE IN VARCHAR2 DEFAULT '03 -01-18' , P_TIME IN VARCHAR2 )RETURN NUMBER AS BEGIN RETURN TO_NUMBER(TRUNC(TO_DATE(p_date || p_time,「DD-MM-YY HH24:MI:SS ')) - TO_DATE('01 -JAN-1990', 'DD-MON-YYYY'))* 36; END;但第二個錯誤仍然顯示! – user1874311