Как запустить курсор в процедуре, если у нас уже определено множество запросов? - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть процедура, которая определена в Oracle с некоторым набором запросов.Теперь мне нужно добавить курсор между ними.Я уже определил курсор в процедуре, и он успешно скомпилирован.Но всякий раз, когда я собираюсь запустить процедуру, она только выполняет часть запроса, пока не появится курсор.Пожалуйста, помогите мне.

Вот Prcedure:

create or replace PROCEDURE REPORT_GENERATE_PROC_REG 
(  
    reportyyyymm number,  
    report_region VARCHAR2,--NR/WR/ETC  
    meetingdate date,--date  
    meetingdesc  VARCHAR2,--desc  
    generateby VARCHAR2,--userid  
    companycode VARCHAR2,--userid  
    ret_int OUT INT,    --- 0 if error report number if success  
    ret_msg OUT VARCHAR2 -- error message if error blank if success  
) 
AS 

final_report_id INTEGER :=0; 
total_column_no INTEGER :=0;

 V_NO INTEGER;
BEGIN
    select max(rid) into final_report_id from hindi_report_gen_new; --max rid is stored in final_report_id
    final_report_id := final_report_id + 1;

    insert into hindi_report_gen_new 
    values(final_report_id,  
    'Report generated for '|| companycode ||'for Quarter ending in '|| 
    reportyyyymm ||'\n Meeting Held on '|| meetingdate||'\n Desc is '|| 
    meetingdesc, reportyyyymm,meetingdate,meetingdesc,  generateby,sysdate,
    companycode); 
    commit;


    -- inserting the data for reports
DECLARE
    CURSOR ADI_CURR IS 
    SELECT DISTINCT ROW_NO FROM HINDI_TEST WHERE REPORT_NO=final_report_id and row_no not in(0,37,38);   
    BEGIN       
    OPEN ADI_CURR;
    LOOP
    FETCH ADI_CURR INTO V_NO;
    insert into hindi_region_report
    select a.report_no,a.row_no,c.STATE_CORD,a.value from hindi_test a join hindi_trn_report_header b on a.column_no=b.REPORT_NO join hindi_mst_cost_centre c on c.cost_centre_code=b.COST_CENTRE_CODE where row_no=v_no and a.report_no=final_report_id;
    EXIT WHEN ADI_CURR%NOTFOUND;
    END LOOP;
    CLOSE ADI_CURR;
    END;


    -- inserting sum of all rows
    insert into test_test  
    select final_report_id,row_no,column_no,sum(value) from hindi_region_report where report_no=final_report_id and row_no not in(0,22,25,28,37,38)  
    group by final_report_id,row_no,column_no; 
    commit;

END REPORT_GENERATE_PROC_REG;

1 Ответ

0 голосов
/ 20 сентября 2018

Вы не указали сообщение об ошибке или какие-либо подробности, которые могли бы помочь определить вашу проблему.Я не уверен, почему у вас есть встроенный DECLARE ... BEGIN ... END, зачем вам нужен COMMIT в середине кода или почему у вас вообще есть COMMIT - он должен быть зафиксирован вызывающей процедурой.

Я думаю, что следующее «кажется» более правильным для меня:

CREATE OR REPLACE PROCEDURE report_generate_proc_reg(
   reportyyyymm        NUMBER
 , report_region       VARCHAR2
 ,                                                                 --NR/WR/ETC
  meetingdate          DATE
 ,                                                                      --date
  meetingdesc          VARCHAR2
 ,                                                                      --desc
  generateby           VARCHAR2
 ,                                                                    --userid
  companycode          VARCHAR2
 ,                                                                    --userid
  ret_int          OUT INT
 ,                                     --- 0 if error report number if success
  ret_msg          OUT VARCHAR2     -- error message if error blank if success
                               )
AS
   final_report_id   INTEGER := 0;
   total_column_no   INTEGER := 0;

   CURSOR adi_curr
   IS
      SELECT DISTINCT row_no
      FROM   hindi_test
      WHERE  report_no = final_report_id
      AND    row_no NOT IN (0, 37, 38);

   v_no              INTEGER;
BEGIN
   SELECT MAX(rid) INTO final_report_id FROM hindi_report_gen_new; --max rid is stored in final_report_id

   final_report_id   := final_report_id + 1;

   INSERT INTO hindi_report_gen_new
      VALUES      (  final_report_id
                   ,    'Report generated for '
                     || companycode
                     || 'for Quarter ending in '
                     || reportyyyymm
                     || '\n Meeting Held on '
                     || meetingdate
                     || '\n Desc is '
                     || meetingdesc
                   , reportyyyymm
                   , meetingdate
                   , meetingdesc
                   , generateby
                   , SYSDATE
                   , companycode);

   -- inserting the data for reports
   FOR rec_adi_curr IN adi_curr
   LOOP
      INSERT INTO hindi_region_report
         SELECT a.report_no
              , a.row_no
              , c.state_cord
              , a.VALUE
         FROM   hindi_test a
                JOIN hindi_trn_report_header b ON a.column_no = b.report_no
                JOIN hindi_mst_cost_centre c
                   ON c.cost_centre_code = b.cost_centre_code
         WHERE  row_no = v_no
         AND    a.report_no = final_report_id;
   END LOOP;

   -- inserting sum of all rows
   INSERT INTO test_test
      SELECT   final_report_id
             , row_no
             , column_no
             , SUM(VALUE)
      FROM     hindi_region_report
      WHERE    report_no = final_report_id
      AND      row_no NOT IN (0 , 22 , 25 , 28 , 37 , 38)
      GROUP BY final_report_id, row_no, column_no;

   COMMIT;
END report_generate_proc_reg;

Цикл курсора может, вероятно, использовать BULK COLLECT, но без указания объемов данных я не могу сказать, стоит ли это того.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...