При получении данных из ref_curor выдается ошибка, подобная следующей ошибке (51,59): PLS-00302: должен быть объявлен компонент 'NOOFRECORDS' - PullRequest
0 голосов
/ 10 октября 2019

при извлечении значений из курсора через ошибку здесь.

CREATE OR REPLACE PROCEDURE proc_groupby_param (
out_chr_err_code    OUT                 VARCHAR2,
out_chr_err_msg     OUT                 VARCHAR2,
out_groupby_tab     OUT                 return_groupby_param_arr,
in_from_date        IN                  DATE,
in_to_date          IN                  DATE,
in_groupby_column   IN                  VARCHAR2,
in_location         IN                  VARCHAR2

) IS

l_chr_srcstage       VARCHAR2(200);
l_chr_biqtab         VARCHAR2(200);
l_chr_srctab         VARCHAR2(200);
l_chr_bistagtab      VARCHAR2(200);
l_chr_err_code       VARCHAR2(255);
l_chr_err_msg        VARCHAR2(255);
l_out_chr_errbuf     VARCHAR2(2000);
lrec                 return_groupby_report;
l_num_counter        NUMBER := 0;
l_start_date         DATE := in_from_date;
l_end_date           DATE := in_to_date + 1;
l_groupby_column     VARCHAR2(30) := upper(in_groupby_column);
l_location_id        VARCHAR2(256) := in_location;
l_cur_query          VARCHAR2(5000) := 'SELECT count(*) as noofrecords,'
                              || l_groupby_column
                              || ' as groupbycolumn  from bi_request where '
                              || l_groupby_column
                              || ' IS NOT NULL';
cur_groupby_data     SYS_REFCURSOR;
TYPE rec_groupby_data IS
    TABLE OF bi_request%rowtype;
l_cur_groupby_data   rec_groupby_data;
BEGIN
out_groupby_tab := return_groupby_param_arr();
OPEN cur_groupby_data FOR l_cur_query
    USING l_groupby_column;

LOOP
    FETCH cur_groupby_data BULK COLLECT INTO l_cur_groupby_data;
    EXIT WHEN l_cur_groupby_data.count = 0;
    dbms_output.put_line('here in first insert');
    lrec := return_groupby_report();
    out_groupby_tab := return_groupby_param_arr(return_groupby_report());
    out_groupby_tab.DELETE;
    FOR i IN 1..l_cur_groupby_data.count LOOP

        BEGIN
            l_num_counter := l_num_counter + 1;
            lrec := return_groupby_report();
            lrec.noofrecords := l_cur_groupby_data(i).noofrecords;
            lrec.groupbycolumn := l_cur_groupby_data(i).groupbycolumn;
            IF l_num_counter > 1 THEN
                out_groupby_tab.extend();
                out_groupby_tab(l_num_counter) := return_groupby_report();
            ELSE
                out_groupby_tab := return_groupby_param_arr(return_groupby_report());
            END IF;

            out_groupby_tab(l_num_counter) := lrec;
        EXCEPTION
            WHEN OTHERS THEN
                dbms_output.put_line('Error occurred : ' || sqlerrm);
        END;
    END LOOP;

END LOOP;

EXCEPTION
    WHEN OTHERS THEN
        dbms_output.put_line('HERE INSIIDE OTHERS' || sqlerrm);
END;

1 Ответ

0 голосов
/ 10 октября 2019

В вашем коде есть несколько недостатков:

l_cur_query VARCHAR2(5000) := 'SELECT count(*) as noofrecords,'
          || l_groupby_column
          || ' as groupbycolumn  from bi_request where '
          || l_groupby_column
          || ' IS NOT NULL';

Вы пропустили предложение 'GROUP BY '||l_groupby_column.

TYPE rec_groupby_data IS TABLE OF bi_request%rowtype;

Это будет работать только при запуске SELECT * FROM bi_request.... Однако выбранные столбцы и типы данных известны только во время выполнения.

OPEN cur_groupby_data FOR l_cur_query USING l_groupby_column;

Невозможно связать имена столбцов (т. Е. USING l_groupby_column). Кроме того, вы не определили никакой заполнитель (например, :b1) в строке запроса.

out_groupby_tab := return_groupby_param_arr(return_groupby_report());
out_groupby_tab.DELETE;

Совершенно бесполезно инициализировать переменную и немедленно удалить ее впоследствии.

LOOP
    FETCH cur_groupby_data BULK COLLECT INTO l_cur_groupby_data

END LOOP;

Когда вы используете FETCH ... BULK COLLECT INTO ..., тогда вам нечего зацикливать. BULK COLLECT извлекает все данные сразу в вашу переменную. Либо используйте BULK COLLECT INTO или FETCH ... INTO ... вместе с циклом.

В общем, если вам нравится запускать такой динамический SQL, вам нужно использовать пакет DBMS_SQL .

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