Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 当从ref_curor获取数据时,它会显示类似以下错误(51,59)的错误:PLS-00302:必须声明组件“NOOFRECORDS”_Oracle_Plsql - Fatal编程技术网

Oracle 当从ref_curor获取数据时,它会显示类似以下错误(51,59)的错误:PLS-00302:必须声明组件“NOOFRECORDS”

Oracle 当从ref_curor获取数据时,它会显示类似以下错误(51,59)的错误:PLS-00302:必须声明组件“NOOFRECORDS”,oracle,plsql,Oracle,Plsql,当从游标中提取值时,它会在此处出错 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

当从游标中提取值时,它会在此处出错

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;

您的代码中有几个弱点:

l_cur_query VARCHAR2(5000) := 'SELECT count(*) as noofrecords,'
          || l_groupby_column
          || ' as groupbycolumn  from bi_request where '
          || l_groupby_column
          || ' IS NOT NULL';
您错过了'groupby'| | l| groupby|列子句

这只有在运行SELECT*FROM bi_请求时才起作用。。。。但是,所选列和数据类型仅在运行时已知

OPEN cur_groupby_data FOR l_cur_query USING l_groupby_column;
您不能绑定列名I.e。使用l_groupby_列。除此之外,您没有在查询字符串中定义任何占位符,例如: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。。。大量收集到。。。那么就没有什么可循环的了。大容量收集将所有数据一次提取到变量中。使用批量收集到或获取。。。进入和一个环一起


总之,如果您想运行这样的动态SQL,那么您必须使用包

lrec.noofrecords:=l_cur_groupby_datai.noofrecords;lrec.groupbycolumn:=l_cur_groupby_datai.groupbycolumn;out_groupby_tab:=返回_groupby_参数返回_groupby_报告;然后是out_groupby_tab.DELETE;似乎没有用。无论我在哪里尝试从l_cur_groupby_数据获取数据,都会出现问题。BULK COLLECT会立即将所有数据获取到变量中。在这种情况下,这是由于错误导致的数据类型不一致:预期-获取-
LOOP
    FETCH cur_groupby_data BULK COLLECT INTO l_cur_groupby_data

END LOOP;