Пакет не выполняется при использовании ввода курсора - PullRequest
3 голосов
/ 07 июня 2019

Я создал пакет из существующей процедуры, процедура только дает точный вывод, но при создании пакета нет ошибок, но он не показывает выходной файл, который я передал для ввода в курсор


------------------ УПАКОВКА КАК СЛЕДУЮЩАЯ -------------------------

SET SERVEROUTPUT ON;
CREATE OR REPLACE PACKAGE user.report AS
    PROCEDURE distribution (
        code_in   IN             user.test.schm_code%TYPE,
        fromdate       IN             DATE,
        todate         IN             DATE
    );

END report;
/
-------------------------------------------------
----------------Package Body---------------------
-------------------------------------------------

CREATE OR REPLACE PACKAGE BODY user.report as
----------------------------------------------
----------VARIABLE DECLARATION----------------
----------------------------------------------

    code_in             user.test.code%TYPE;
    fromdate                 DATE;
    todate                   DATE;
    v_code              user.test.code%TYPE;    
    v_count                 number;
    v_code          user.test.acct_crncy_code%TYPE;
    v_amount        number(17,4);
-----------------------------------------------
---------------CURSOR DECLARATION--------------
-----------------------------------------------


CURSOR td_data IS
    ( SELECT
        test.code,
        COUNT(test.code) AS count,
        test.crncy
    FROM
        user.table1
        JOIN user.test ON test.id = table1.id
    WHERE
        user.test.opendate BETWEEN TO_DATE(fromdate, 'dd-mm-yyyy') AND TO_DATE(todate, 'dd-mm-yyyy')
        and
        user.test.code = code_in
    GROUP BY
        test.code,test.crncy
    );

------------------------PROCEDURE CREATION-----------------------    
PROCEDURE distribution 
(
    code_in   IN             user.test.code%TYPE,
    fromdate       IN          DATE,
    todate         IN          DATE
)
AS
BEGIN
    dbms_output.put_line('code'||'    '||'COUNT'||'       '||'TOTAL');
    OPEN td_data;
    LOOP
        FETCH td_data INTO v_code,v_count,v_code,v_amount;
        EXIT WHEN td_data%notfound;
        dbms_output.put_line(v_code
                             || '             '
                             ||v_count
                             || '                '
                             ||v_code
                             ||' '
                             ||v_amount
                             );

    END LOOP;

    CLOSE td_data;
EXCEPTION
    WHEN OTHERS THEN
        dbms_output.put_line(SQLERRM);
END distribution;
END report;
/
BEGIN
user.report.distribution('x1fsr','01-02-2016','01-07-2020');
END;
/

alter session set nls_date_format='dd-mm-yyyy'; 

Я попытался создать пакет без хорошо работающего курсора Я попытался создать курсор без работы с пользователем, но с пользовательским вводом он не работает должным образом

1 Ответ

2 голосов
/ 07 июня 2019

Переменные, которые вы использовали, не были инициализированы, поэтому курсор ничего не выбирал.Это потому, что вы объявили это (а также набор переменных) глобально (для всего тела пакета), а не локально (для процедуры, пока вы передаете параметры в процедуру и никогда не передавали ни одну из них).на курсор. Если вы настаиваете, создайте параметризованный курсор).

Кроме того, вы объявили V_CODE дважды;почему?

В любом случае: я бы посоветовал вам сделать это следующим образом:

  • используйте курсорный цикл FOR, так как его легче поддерживать (вам не нужноopen, fetch, exit, close - Oracle сделает это за вас)
  • не объявляйте каких-либо дополнительных переменных - используйте неявные переменные курсора
  • удалите такой обработчик исключений, это не поможеттак как ты ничего не делаешь.Если бы вы вызвали процедуру из какого-либо интерфейсного приложения (такого как Apex или Forms) и что-то («другие», а?) Произошло, вы бы ничего не увидели, так как DBMS_OUTPUT.PUT_LINE там не работает
  • поскольку fromdate и todate являются DATE с, нет необходимости TO_DATE их

ОК, вот и все:

CREATE OR REPLACE PACKAGE BODY USER.report
AS
   PROCEDURE distribution (code_in   IN USER.test.code%TYPE,
                           fromdate  IN DATE,
                           todate    IN DATE)
   AS
   BEGIN
      DBMS_OUTPUT.put_line (
         'code' || '    ' || 'COUNT' || '       ' || 'TOTAL');

      FOR cur_r
         IN (  SELECT test.code, COUNT (test.code) AS COUNT, test.crncy
                 FROM USER.table1 JOIN USER.test ON test.id = table1.id
                WHERE     USER.test.opendate BETWEEN fromdate AND todate
                      AND USER.test.code = code_in
             GROUP BY test.code, test.crncy)
      LOOP
         DBMS_OUTPUT.put_line (
               v_code
            || '             '
            || cur_r.code
            || '                '
            || cur_r.COUNT
            || ' '
            || cur_r.crncy);
      END LOOP;
   END distribution;
END report;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...