oracle存储过程通过select插入

时间:2014-03-31 13:49:29

标签: sql oracle stored-procedures

我正在编写一个存储过程,其中我有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 个答案:

答案 0 :(得分:0)

在您的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