2012-12-14 265 views
0

我想用select語句創建一個表。我想用VIEW中的聚合值填充這個新表。以下是我想創建一個網站鏈接表和SESSION_ID用於創建視圖的代碼,字符串緩衝區太小錯誤

create or replace view FINAL_WEB_LOG 
as 
select SESSION_ID, 
     SESSION_DT, 
     C_IP, 
     CS_USER_AGENT, 
     tab_to_string(CAST(COLLECT(web_link) AS t_varchar2_tab)) WEBLINKS 
from web_views_tab  
group by C_IP, CS_USER_AGENT, SESSION_DT; 

從另一table.And序列,當我嘗試從視圖(一個沒有創建表SESSION_ID),我收到以下錯誤,

SQL錯誤:ORA-06502:PL/SQL:數字或值錯誤:字符串緩衝區太小

這同場做,網絡鏈接,它有更長的價值。我現在可以做些什麼來解決這個錯誤?在聚合函數

更多信息可以在AskTom

回答

1

發現不能使用的列不是GROUP BY條款的一部分,或者不屬於聚合函數。因爲在這種情況下不可能知道應該返回哪個值。

如果它保證它的每個組獨一無二的 - 你可以騙過數據庫

MIN(SESSION_ID) SESSION_ID 

但請記住,這不是一個很好的做法,這樣做:-)

+0

我明白了。然後我猜想更好的選擇是首先用選定的字段創建一個視圖,然後用WEBLINKS和一個序列創建一個表。但就像我之前提到的,我得到「字符串緩衝區太小」的錯誤。任何方式來解決這個問題? – user1874311

1

你不能選擇字段這不是按功能分組的。你用不同的session_id分組幾個字段。你覺得你可以選擇一個?

+0

在這裏可以使用多個select語句嗎? – user1874311

1

你的說法,現在是無效的,要麼你得到的列:由部分C_IPCS_USER_AGENT成團狀:

create or replace view FINAL_WEB_LOG 
as 
select SESSION_ID, 
     SESSION_DT, 
     C_IP, 
     CS_USER_AGENT, 
     tab_to_string(CAST(COLLECT(web_link) AS t_varchar2_tab)) WEBLINKS 
from web_views_tab  
group by C_IP, CS_USER_AGENT, SESSION_DT, C_IP, CS_USER_AGENT, WEBLINKS; 

或更改這些要使用的一組類似返回一個值的函數COUNT(),AVG(),MAX(),MIN()等,如:

create or replace view FINAL_WEB_LOG 
as 
select SESSION_ID, 
     SESSION_DT, 
     COUNT(C_IP), 
     COUNT(CS_USER_AGENT), 
     Count(tab_to_string(CAST(COLLECT(web_link) AS t_varchar2_tab))) WEBLINKS 
from web_views_tab  
group by C_IP, CS_USER_AGENT, SESSION_DT; 
+0

謝謝,但是你的兩個建議都會給出同樣的錯誤,「不是GROUP BY表達式」。 – user1874311

+0

對不起iv忘了tabtostring列。回答更新 – CloudyMarble

1

session_idGROUP BY子句中了。您應始終將SELECT子句中的所有非聚合函數列置於GROUP BY子句中。

+0

我只是試驗了你所說的話,看看會發生什麼。沒有錯誤,但它不彙總記錄。共有8190條記錄。如果您不包含SESSION_ID,通常會彙總到約1539條記錄。 – user1874311

1

如果結果大於4000字節,則使用CLOB。

SQL> create table web_views_tab(SESSION_ID number, SESSION_DT date, C_IP varchar2(20), CS_USER_AGENT varchar2(10), web_link varchar2(100)); 

Table created. 

SQL> insert into web_views_tab 
    2 select rownum, trunc(sysdate), '127.0.0.1', 'Mozilla', 'http://foo.bar.com/asdakjdlkajdlkajsd/asdjaldjklja' 
    3 from dual 
    4 connect by level <= 3000; 

3000 rows created. 

SQL> CREATE OR REPLACE TYPE t_varchar2_tab AS TABLE OF VARCHAR2(4000); 
    2/

Type created. 

SQL> CREATE OR REPLACE FUNCTION tab_to_string (p_varchar2_tab IN t_varchar2_tab, 
    2           p_delimiter  IN VARCHAR2 DEFAULT ',') RETURN VARCHAR2 IS 
    3 l_string  VARCHAR2(32767); 
    4 BEGIN 
    5 FOR i IN p_varchar2_tab.FIRST .. p_varchar2_tab.LAST LOOP 
    6  IF i != p_varchar2_tab.FIRST THEN 
    7  l_string := l_string || p_delimiter; 
    8  END IF; 
    9  l_string := l_string || p_varchar2_tab(i); 
10 END LOOP; 
11 RETURN l_string; 
12 END tab_to_string; 
13/

Function created. 

SQL> create or replace view FINAL_WEB_LOG 
    2 as 
    3 select SESSION_DT, 
    4   C_IP, 
    5   CS_USER_AGENT, 
    6   tab_to_string(CAST(COLLECT(web_link) AS t_varchar2_tab)) WEBLINKS 
    7 from web_views_tab 
    8 group by C_IP, CS_USER_AGENT, SESSION_DT; 

View created. 

SQL> select * from FINAL_WEB_LOG; 
select * from FINAL_WEB_LOG 
          * 
ERROR at line 1: 
ORA-06502: PL/SQL: numeric or value error: character string buffer too small 
ORA-06512: at "TEST.TAB_TO_STRING", line 9 
ORA-06512: at line 1 

,所以我們重新定義函數輸出作爲CLOB和改變功能的位:

SQL> CREATE OR REPLACE FUNCTION tab_to_string (p_varchar2_tab IN t_varchar2_tab, 
    2           p_delimiter  IN VARCHAR2 DEFAULT ',') RETURN clob IS 
    3 l_string  clob; 
    4 BEGIN 
    5 dbms_lob.createtemporary(l_string, true, dbms_lob.call); 
    6  dbms_lob.open(l_string, dbms_lob.lob_readwrite); 
    7 FOR i IN p_varchar2_tab.FIRST .. p_varchar2_tab.LAST LOOP 
    8  IF i != p_varchar2_tab.FIRST THEN 
    9  dbms_lob.writeappend(l_string, length(p_delimiter), p_delimiter); 
10  END IF; 
11  dbms_lob.writeappend(l_string, length(p_varchar2_tab(i)), p_varchar2_tab(i)); 
12 END LOOP; 
13  dbms_lob.close(l_string); 
14 RETURN l_string; 
15 END tab_to_string; 
16/

Function created. 

SQL> 
SQL> select * from FINAL_WEB_LOG; 

SESSION_D C_IP     CS_USER_AG 
--------- -------------------- ---------- 
WEBLINKS 
-------------------------------------------------------------------------------- 
14-DEC-12 127.0.0.1   Mozilla 
http://foo.bar.com/asdakjdlkajdlkajsd/asdjaldjklja,http://foo.bar.com/asdakjdlka 
+0

我以前試過使用CLOB數據類型。當我嘗試在數據挖掘過程中使用CLOB數據類型的列時,它不接受。但它接受varchar2數據類型,因此是問題。 – user1874311

相關問題