oracle存储过程查找表数据插入另一个表中。。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle存储过程查找表数据插入另一个表中。。相关的知识,希望对你有一定的参考价值。

首先有四个表,A表有xm,mz,jg等几个字段,B表有mz,mzmc字段,C表有jg,jgmc字段,现在要查找出A的mz在B的mz中没有,jg在C的jg中也没有的记录,然后插入到D表中,请问这样子应该怎么做???最好有详细的代码,谢谢~~~

参考技术A 不用存储过程,直接INSERT就行
insert into D
(select * from A where
mz not in(select mz from B) and
jg not in(select jg from C));

你要存储过程的话再加个壳
create or replace procedure XXX
IS
begin
insert into D
(select * from A where
mz not in(select mz from B) and
jg not in(select jg from C));
end;
/本回答被提问者采纳

Oracle:创建存储过程以将另一个存储过程的结果插入表中

【中文标题】Oracle:创建存储过程以将另一个存储过程的结果插入表中【英文标题】:Oracle: create stored procedure to insert results from another stored procedure into a table 【发布时间】:2021-08-13 15:40:25 【问题描述】:

我有一个在 s-s-rS 报告中使用的 Oracle 存储过程 spFinTest

我希望创建另一个存储过程spFinTestInsert,它获取spFinTest 的输出并将其插入到表sbceybudget_financial_year 中。

我可以创建一个多合一的存储过程,将数据插入到目标表中,但我希望实现的是只拥有一个可以为数据提取进行代码更新而不必更新的存储过程具有相同代码的第二个单独的插入存储过程。

因此,只在一处更新并重复使用相同的存储过程。

以下是主存储过程的简化版:

create or replace procedure spFINTEST
    (s1 OUT SYS_REFCURSOR)
AS
BEGIN

OPEN s1 FOR

SELECT
  FIN_YR + 1 AS FIN_YR,
  SCHOOL_YEAR_WEEKS
FROM
  sbceybudget_financial_year
WHERE
  fin_yr = 2021
;
END spFINTEST;

这个存储过程只有一个“out”变量。

最终目的是一旦我能做到这一点,然后我将从 SSIS 包中的“执行 SQL 任务”调用 spFinTestInsert

对于如何创建调用第一个并将结果插入到命名表中的第二个存储过程,我感到有些困惑,因此,如果有人能提供帮助,我将不胜感激。

【问题讨论】:

已更正。为我的滔天罪行道歉。 【参考方案1】:

我会在一个包中这样做:它允许您轻松声明游标类型以使其更清晰。

测试表:

create table sbceybudget_financial_year(
  fin_yr            int,
  SCHOOL_YEAR_WEEKS int
)
/

包装规格:

create or replace package pkg_spFIN as

   type spFIN_RowType is record(
      FIN_YR            sbceybudget_financial_year.FIN_YR%type,
      SCHOOL_YEAR_WEEKS sbceybudget_financial_year.SCHOOL_YEAR_WEEKS%type
   );
   
   type spFIN_CurType IS REF CURSOR RETURN spFIN_RowType;
   type spFIN_tab is table of spFIN_RowType;

   procedure spFINTEST (s1 OUT SYS_REFCURSOR);
   procedure spFinTestInsert;
end pkg_spFIN;
/

包体:

create or replace package body pkg_spFIN as

   function get_cursor(n int) return spFIN_CurType is
     c spFIN_CurType;
   begin
     open c for
      SELECT
        t.FIN_YR + 1 AS FIN_YR,
        t.SCHOOL_YEAR_WEEKS
      FROM
        sbceybudget_financial_year t
      WHERE
        t.fin_yr = n;
     return c;
   end;
   
   procedure spFINTEST (s1 OUT SYS_REFCURSOR)
   is
   begin
     s1:=get_cursor(2021);
   end spFINTEST;

   procedure spFinTestInsert
   is
     cur spFIN_CurType;
     tab spFIN_tab;
   begin
     pkg_spFIN.spFINTEST(cur);
     loop
       fetch cur bulk collect into tab limit 100;
       exit when tab.count()=0;
       for i in 1..tab.count loop
         dbms_output.put_line(tab(i).FIN_YR);
         dbms_output.put_line(tab(i).SCHOOL_YEAR_WEEKS);
         -- or insert:
         -- insert into sbceybudget_financial_year(fin_yr, SCHOOL_YEAR_WEEKS)
         --  values(tab(i).FIN_YR, SCHOOL_YEAR_WEEKS)
         -- you can change it to FORALL insert
       end loop;
     end loop;
   end spFinTestInsert;
end pkg_spFIN;
/

测试数据:

begin
insert into sbceybudget_financial_year(fin_yr, SCHOOL_YEAR_WEEKS) values(2019,19);
insert into sbceybudget_financial_year(fin_yr, SCHOOL_YEAR_WEEKS) values(2020,20);
insert into sbceybudget_financial_year(fin_yr, SCHOOL_YEAR_WEEKS) values(2021,21);
commit;
end;
/

最后是测试调用:

call pkg_spFIN.spFinTestInsert();

关于 DBFiddle 的完整示例:https://dbfiddle.uk/?rdbms=oracle_18&fiddle=c31a5714e5db74eaa3a83fae03964349

【讨论】:

嗨,Sayan,很抱歉没有早点回来。当我有更多时间时,我会尝试你的解决方案。 Littlefoot 的解决方案对我有用,但我很想试试你的解决方案。非常感谢。【参考方案2】:

我没有你的桌子,所以我将使用 Scott 的 DEPT 来说明。

这是“目标”表;引用游标获取的值将插入其中:

SQL> create table test_dept as select deptno, dname from dept where 1 = 2;

Table created.

这是我期望的数据:

SQL> select deptno, dname from dept where deptno <= 20;

    DEPTNO DNAME
---------- --------------
        10 ACCOUNTING
        20 RESEARCH

这是您当前的程序:

SQL> create or replace procedure spfintest (s1 out sys_refcursor)
  2  as
  3  begin
  4    open s1 for select deptno, dname from dept where deptno <= 20;
  5  end spfintest;
  6  /

Procedure created.

这是一个调用spfintest并将值插入test_dept的过程:

SQL> create or replace procedure spfitestinsert as
  2    rc sys_refcursor;
  3    --
  4    l_deptno dept.deptno%type;
  5    l_dname  dept.dname%type;
  6  begin
  7    spfintest(rc);
  8    loop
  9      fetch rc into l_deptno, l_dname;
 10      exit when rc%notfound;
 11
 12      insert into test_dept (deptno, dname)
 13        values (l_deptno, l_dname);
 14    end loop;
 15  end;
 16  /

Procedure created.

测试:

SQL> exec spfitestinsert;

PL/SQL procedure successfully completed.

SQL> select * from test_dept;

    DEPTNO DNAME
---------- --------------
        10 ACCOUNTING
        20 RESEARCH

SQL>

一切都在这里,所以我想它可以工作。

【讨论】:

嗨,Littlefoot,很抱歉没有早点回来。您的解决方案对我来说非常有效。当我有更多时间时,我会尝试Sayan's。非常感谢!

以上是关于oracle存储过程查找表数据插入另一个表中。。的主要内容,如果未能解决你的问题,请参考以下文章

SQL临时表使用

在oracle中怎么将查询到的数据插入到另一个表中

Oracle存储过程创建临时表,插入数据后,怎么返回临时表数据,并在asp.net中接收到datatable中

用oracle存储过程将一张表的数据查出插入另一张表

oracle 怎么在存储过程中创建一个临时表,在里面插入数据,再查找这个临时表的所有数据,最后drop这个表。

oracle 怎么在存储过程中创建一个临时表,在里面插入数据,再查找这个临时表的所有数据,最后drop这个表。