2015-06-01 3 views
1

Я попытался создать свою собственную процедуру для динамического стержня, но он не работает. Моя процедура создана правильно, но когда я хочу ее выполнить, она не работает. Во-первых, я пробовал процедуру bluefeet и работал. ссылка на этот вопрос Dynamically pivoting a table OracleДинамическая сводная таблица - разработчик sql

Моя процедура должна учитывать количество значений из столбца p_key.

Возможно, у кого-то есть идея, почему моя процедура не работает.

код для моей таблицы

create table aa_tabela (
C_ID number(3,0), 
gcm number(1,0), 
p_key varchar2(30), 
p_count number(6,0)); 

вставить несколько значений

INSERT ALL 
INTO aa_tabela (C_ID, gcm, p_key, p_count) 
    VALUES (1, 7, 'Data Mining', 2) 
INTO aa_tabela (C_ID, gcm, p_key, p_count) 
    VALUES (2, 5, 'Data Mining', 3) 
INTO aa_tabela (C_ID, gcm, p_key, p_count) 
    VALUES (3, 3, 'Reporting', 1) 
INTO aa_tabela (C_ID, gcm, p_key, p_count) 
    VALUES (4, 3, 'Olap', 5) 
INTO aa_tabela (C_ID, gcm, p_key, p_count) 
    VALUES (5, 1, 'Reporting', 4) 
SELECT * FROM dual; 

Моей статическая таблица PIVOT является работой:

SELECT GCM, 
    SUM(case when p_key = 'Data Mining' then p_count end) AS Data_Mining, 
    SUM(case when p_key = 'Reporting' then p_count end) AS Reporting, 
    SUM(case when p_key = 'Olap' then p_count end) AS OLAP 
from aa_tabela 
group by gcm 
order by gcm desc; 

Результат:

|GCM | DATA_MINING | REPORTING | OLAP | 

    | 7 |  2  |    |   | 
    | 5 |  3  |    |   | 
    | 3 |    |  1  | 5  | 
    | 1 |    |  4  |   | 

Моя процедура динамического поворота создает правильно:

CREATE OR REPLACE procedure test_abc(p_cursor in out sys_refcursor) 
AS 
    sql_query long := 'select gcm '; 

BEGIN 
    for x in (select distinct p_key from aa_tabela order by 1) 
    loop 
     sql_query := sql_query || 
      ' , sum(case when p_key = '''||x.p_key||''' then p_count end) as '||x.p_key; 

      dbms_output.put_line(sql_query); 
    end loop; 

    sql_query := sql_query || ' from aa_tabela group by gcm'; 

    open p_cursor for sql_query; 
END; 

/ ПРОЦЕДУРА TEST_ABC скомпилирован

Я исполняю свою процедуру следующим кодом:

variable x refcursor 
exec test_abc(:x); 
print x 

Сообщение об ошибке:

Error starting at line : 215 in command - 
exec test_abc(:x) 
Error report - 
ORA-00923: FROM keyword not found where expected 
ORA-06512: at "MAGDA.TEST_ABC", line 16 
ORA-06512: at line 1 
00923. 00000 - "FROM keyword not found where expected" 
+1

Проверьте, что находится в переменной sql_query с помощью 'dbms_output.put_line', например - вы увидите какие-либо ошибки в вашем SQL. –

ответ

0

Вы получаете ошибку потому что одним из значений является «Data Mining». В вашей процедуре он переводится в псевдоним столбца, например as Data Mining. Вам нужно изменить пространство, чтобы подчеркнуть или добавить quotaion знаков в строке 9:

 ' , sum(case when p_key = '''||x.p_key||''' then p_count end) as "'||x.p_key||'"'; 
+0

Большое вам спасибо! Работает :) – MagdaG

Смежные вопросы