需要将数据全部插入到临时表中

Posted

技术标签:

【中文标题】需要将数据全部插入到临时表中【英文标题】:need to insert data all together into temp table 【发布时间】:2014-06-27 07:19:35 【问题描述】:

您好,这是我的示例代码。

我需要将两个程序中的数据全部插入,而不是一个接一个地插入。此代码从第一个程序插入数据,然后从第二个程序插入第一个程序已结束插入的行号。请建议一个我可以通过这种方式将数据全部插入而不是按顺序插入。

create or replace package body help
as
procedure main_proc(param1 number,param2 number,v1 out number,v2 out number)
is 
v_resultset help.cursortype-->this is defined in the package spec
v_name varchar2(10);
v_code varchar2(40);

begin

v1:=param1;
v2:=param2;

proc1(v1,v_resultset);
LOOP
FETCH v_resultSet INTO v_name;
EXIT WHEN v_Resultset%NOTFOUND;
Dbms_Output.Put_Line('Error in Proc1');
INSERT INTO temp_table(name) values(v_name) ;
END LOOP;

proc2(v1,v2,v_resultset);
LOOP
FETCH v_resultSet INTO v_code;
EXIT WHEN v_Resultset%NOTFOUND;
Dbms_Output.Put_Line('Error in Proc2');
INSERT INTO temp_table(code) values(v_code) ;
END LOOP;

end main_proc;

proc1(v_name VARCHAR2,r_resultset out help.cursortype)
is
begin
open r_resultset for 
select name from emp where dept_id=2;
end;

proc2(v_name VARCHAR2,v_code VARCHAR2,r_resultset out help.cursortype)
is
begin
open r_resultset for
select code from code_table where dept_id=3;
end;

end help;

我需要将数据全部插入而不是按顺序插入到我的全局临时表中。

此过程插入如下数据: 名称代码

克拉克(空) 琼斯(空) 史密斯(空) 亚当(空) (空) 001 (空) 002 (空) 003 (空)004

而我希望将其插入为

名称代码 克拉克 001 琼斯 002 史密斯 003 亚当004


procedure packagecategory_info(p_item_cat number,p_item_sub_cat number,p_pack_cat_id number,package_sub_cat number,pc_Resultset out Master_Product_Report.cursortype)
is
begin
if p_item_sub_cat is null and p_pack_cat_id is null and package_sub_cat is null then
open pc_Resultset for
    Select Name From Packagecategory Where Itemcategory_Id in (select id from itemcategory start with id=p_item_cat connect by prior id=parent_id);
elsif p_pack_cat_id is null and package_sub_cat is null then 
open pc_Resultset for
Select Name From Packagecategory Where Itemcategory_Id In (Select Id From Itemcategory Where Parent_Id Is Not Null Start With Id=P_Item_Sub_Cat Connect By Prior Id=Parent_Id);
Elsif Package_sub_Cat Is Null Then
open pc_Resultset for
select name from packagecategory start with id=p_pack_cat_id connect by prior id=parent_id and level_id !=3;
Else 
open pc_Resultset for
select name from packagecategory where id=package_sub_cat;
end if;
End packagecategory_info;

----- Main procedure in which above proc would be called
create or replace 
package body Master_Product_Report as 
procedure Product_Report (p_item_cat number,p_sub_cat number,p_pack_cat_id number,p_pack_sub_cat_id number,p_pack_id number,v1 out number,v2 out number,v3 out number,v4 out number,v5 out number)
is 
----------
--some code--
packagecategory_info(v1,v2,v3,v4,v_resultSet);
Loop
Fetch V_Resultset Into V_Pack_cat_Name;
EXIT WHEN v_Resultset%NOTFOUND;
Dbms_Output.Put_Line('Error in Proc2');
INSERT INTO MASTER_PRODUCT_TABLE(PACKAGE_SUB_CAT_NAME) values(v_pack_cat_name) ;
END LOOP;

【问题讨论】:

“将数据全部插入而不是按顺序插入”是什么意思?数据如何存储在表中并不重要,唯一重要的是您在选择期间如何排序。 看到我的数据来自不同的表,并且它也被不同的程序获取......所以而不是像......一样显示在表中的数据........姓名->琼斯亚历克斯克拉克,然后从第 4 行插入代码,而不是显示在姓名前面。这就是我的意思。 您可以通过 UNION ALL 组合两个查询。此外,您不需要为此使用任何游标和存储过程。只需一条语句即可完成。 好吧,这只是我制作的一个小代码,目的是明确我想要做什么,而这是业务需求,代码就像 1500 LOC,无法在此处复制.存储在表中的数据必须显示在前端。要求不能仅通过简单的联合和连接来完成,因此必须以适当的方式存储。希望你能得到我正在寻找的东西。 'DISPLAYED IN THE TABLE' 不正确。检索数据时会显示数据。如果您在谈论记录的顺序,那么影响它的唯一方法就是 ORDER BY。 【参考方案1】:

如果我最终做对了:

proc1(v1, v_names);
proc2(v1, v2, v_codes);
LOOP
FETCH v_names INTO v_name;
FETCH v_codes INTO v_code;
EXIT WHEN v_names%NOTFOUND;
EXIT WHEN v_codes%NOTFOUND;
INSERT INTO temp_table(name, code) values(v_name, v_code);
END LOOP;

close v_names;
close v_codes;

请注意,procs 返回的行数是否相等取决于您。如果行数大于代码数,则某些员工将不会插入 temp_table。

【讨论】:

现在我面临你提到的问题-'请注意,procs 返回的行数是否相等取决于你。如果行数大于代码数,则某些员工将不会插入 temp_table。 :( 解决方案可能是什么 这取决于您生成代码所需的逻辑。您必须修复 proc2() 中的查询才能提供足够的代码。 我无法修复查询,因为数据非常庞大,而且它是一个实时应用程序,将永远运行,因此无法修复数据。请建议是否可以做一些替代方案,或者是否可以使用任何其他结构在临时表中插入数据,其中每一列的记录数与前一列或下一列不同。我需要紧急回复:( 创建序列 my_codes;插入 temp_table (name, code) select name, to_char(my_codes.nextval, '00000000') from emp where dept_id=2; ? 但我需要通过光标结果集插入我上面使用过的 refcursor

以上是关于需要将数据全部插入到临时表中的主要内容,如果未能解决你的问题,请参考以下文章

将数据插入临时表

将数据从表插入临时表,然后从临时表中选择特定行

SQL 中将游标循环查询的结果插入到临时表中

创建临时表并使用存储过程将数据加载到其中

如何从存储过程返回的游标将数据插入临时表

如何将 Excel 中的数据插入 Spark SQL 中的临时表中