通过选择插入的 oracle 存储过程

Posted

技术标签:

【中文标题】通过选择插入的 oracle 存储过程【英文标题】:oracle stored procedure to insert via select 【发布时间】:2014-03-31 13:49:29 【问题描述】:

我正在编写一个存储过程,其中我有 2 个复杂的连接选择查询,它又是外部连接的。结果需要通过存储过程插入到另一个表中。

您是否发现以下存储过程的语法有任何问题: 任何有关语法的帮助将不胜感激。

create or replace
PROCEDURE STATS_PROCEDURE(
column1 varchar2, 
column2 varchar2,
column3 varchar2,
column4 varchar2,

) IS
BEGIN
    insert into STATS_PRODUCT
      column1 , column2 , column3 , column4)

      select table1.column1, table1.column2 from 
        (SELECT column1, column2 from table_name) table1 
      FULL OUTER JOIN
    (select column3, column4 from table_name) table2 
      on
      table1.column1 = table2.column1 and table1.column2 = table1.column2
END; 

提前致谢!

【问题讨论】:

编译这段代码会报什么错误?请编辑您的问题并包含此信息。谢谢。 【参考方案1】:

在您的 INSERT 子句中您指定了 4 列,但在您的 SELECT 语句中您只完成了 2 列,您需要修改查询以包括 SELECT 中的所有 4 列,如下所示

BEGIN
    INSERT INTO STATS_PRODUCT
            ( column1
            ,column2
            ,column3
            ,column4
            )
            SELECT table1.column1
                    ,table1.column2
                    ,table2.column3 --Added
                    ,table2.column4 --Added
                FROM (
                        SELECT column1
                            ,column2
                        FROM table_name
                        ) table1
                FULL OUTER JOIN (
                                    SELECT column3
                                        ,column4
                                    FROM table_name
                                ) table2
                    ON table1.column1 = table2.column1
                        AND table1.column2 = table1.column2
END; 

作为替代方案,您可以使用WITH 子句进行重写,使其更易于阅读

WITH    table1
          AS (
               SELECT column1
                   ,column2
                FROM table_name
             ),
        table2
          AS (
               SELECT column1
                   ,column2
                   ,column3
                   ,column4
                FROM table_name
             )
    INSERT INTO STATS_PRODUCT
            ( column1
            ,column2
            ,column3
            ,column4                
            )
            SELECT t1.column1
                   ,t1.column2
                   ,t2.column3
                   ,t2.column4
                FROM table1 AS t1
                FULL OUTER JOIN table2 AS t2
                    ON t1.column1 = t2.column1
                       AND t1.column2 = t2.column2

【讨论】:

以上是关于通过选择插入的 oracle 存储过程的主要内容,如果未能解决你的问题,请参考以下文章

mysql存储过程怎样批量插入数据

mysql存储过程实现数据查询与插入

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

oracle存储过程怎样批量插入新数据

oracle存储过程效率问题,处理1500w的数据插入

Oracle怎么导出存储过程