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;