2012-12-14 6 views
0

select 문을 사용하여 테이블을 만들려고합니다. VIEW에서 집계 된 값으로이 새 테이블을 채우고 싶습니다. 다음은 내가 VIEW합니다 (없는 하나에서 테이블을 만들려고 할 때 다른 table.And에서 시퀀스 인 VIEW를 만드는 데 사용되는 코드,문자열 버퍼가 너무 작음 오류

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; 

나는 웹 링크가있는 테이블을 만들려면 및 SESSION_ID입니다 SESSION_ID는) 다음과 같은 에러가 발생,

SQL 오류 : ORA-06502 : PL/SQL : 숫자 또는 값 오류 : 너무 작은 문자열 버퍼

이 현장과 관련이있다

, 웹 링크, 그것은 않습니다 값이 더 길다. 이 오류를 해결하기 위해 지금 무엇을 할 수 있습니까 ?? 집계 함수에

더 많은 정보는 GROUP BY 조항의 일부가 아니거나 집계 함수에 포함되지 않은 열을 사용할 수 없습니다 AskTom

답변

1

에서 찾을 수 있습니다. 이 경우 반환되어야하는 값을 알 수 없기 때문입니다. 당신이

MIN(SESSION_ID) SESSION_ID 

와 데이터베이스를 바보하지만 그렇게 :-) 당신은 필드를 선택할 수 없습니다

+0

내가 볼을. 그렇다면 먼저 더 나은 대안은 먼저 선택된 필드로 뷰를 생성 한 다음 WEBLINKS 및 시퀀스가있는 테이블을 만드는 것입니다. 그러나 앞서 언급 한 것처럼 "문자열 버퍼가 너무 작습니다"라는 오류가 발생합니다. 주위를 둘러 볼 방법이 있습니까? – user1874311

1

할 수있는 좋은 방법이 아니다 염두에 두어야 할 수 있습니다 - 그룹마다 고유의 보장이라면

그건 기능별로 분류되지 않았습니다. session_id가 다른 몇 개의 필드를 그룹화합니다. 어떻게 하나를 고를 수 있다고 생각하니?

+0

여러 select 문을 사용할 수 있습니까? – user1874311

1

귀하의 문은 이제 유효하지 않습니다, 하나는 열을 얻을 : 같은 부분에 의해 C_IP, CS_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

죄송합니다. 탭 트 링링 열을 깜빡입니다. 답변 됨 updated – CloudyMarble

1

GROUP BY 절에서도를 session_id을 넣습니다. GROUP BY 절에 항상 SELECT 절에 모든 비 집합 함수 열을 넣어야합니다.

+0

나는 당신이 무엇을 나타낼 지 말했는지 실험했습니다. 오류는 없지만 레코드를 집계하지는 않습니다. 총 8190 개의 레코드가 있습니다. 보통 SESSION_ID를 포함하지 않으면 약 1539 레코드로 집계됩니다. – user1874311

1

결과가> 4000Y이면 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

관련 문제