【问题标题】:How can i make this INSERT in PL/SQL Procedure?如何在 PL/SQL 过程中进行此 INSERT?
【发布时间】:2015-10-26 11:53:11
【问题描述】:

我是 pl/sql 编程的新手,我需要你的帮助。

我想做一个程序。

更具体地说,我有如下表 1 之类的表

================================================
|COL1 | COL2 | COL3 | COL4 | COL5 | COL6 |COL7|
===============================================
|600 | 140 | 2 | 10 | 1300 | 500 | 1 |
|600 | 140 | 2 | 20 | 1400 | 340 | 4 |
|600 | 140 | 2 | 15 | 1400 | 230 | 3 |
|600 | 140 | 2 | 35 | 1700 | 120 | 2 |
|600 | 150 | 3 | 10 | 1300 | 166 | 6 |
|600 | 150 | 3 | 15 | 1400 | 435 | 5 |
----------------------------------------------

对于相同的 COL1 和 COL2/COL3 ,检查 select different values from COL4 例如对于 COL1=600 , COL2=140/COL3=2 和 COL2=150/COL3=3 返回 20 和 35

并在此表 TABLE1 中插入行

600 , 150 , 3, 20 , 1400 , 340, 7 (seq number)
600 , 150 , 3, 35 , 1700 , 120, 8 (seq number)

如果 P_FLG1 = 'Y',我在 Table1 中进行插入。 IF P_FLG2 = 'Y' 我也在 TABLE3 等中进行插入

我正在尝试进行如下过程,但我无法完成它

PROCEDURE COPY_COLUMNS  ( P_COL1        IN  A.COL1%TYPE,
                          P_FROM_COL2   IN  B.COL2%TYPE,
                          P_FROM_COL3   IN  B.COL3%TYPE,
                          P_TO_COL2     IN  B.COL2%TYPE,
                          P_TO_COL3     IN  B.COL3%TYPE,
                          P_FLG1        IN  VARCHAR2,
                          P_FLG2        IN  VARCHAR2,
                          P_FLG3        IN  VARCHAR2                                      
                                     ) IS


CURSOR CFL1 IS select COL4
    FROM TABLE1
    WHERE COL1 = P_COL1 AND COL2 = P_FROM_COL2 AND COL3 = P_FROM_COL3
    MINUS
    select COL4
    FROM TABLE1
    WHERE COL1 = P_COL1 AND COL2 = P_TO_COL2 AND COL3 = P_TO_COL3;

CURSOR CFL2 IS select COL4
    FROM TABLE2
    WHERE COL1 = P_COL1 AND COL2 = P_FROM_COL2 AND COL3 = P_FROM_COL3
    MINUS
    select COL4
    FROM TABLE2
    WHERE COL1 = P_COL1 AND COL2 = P_TO_COL2 AND COL3 = P_TO_COL3;

CURSOR CFL3 IS select COL4
    FROM TABLE3
    WHERE COL1 = P_COL1 AND COL2 = P_FROM_COL2 AND COL3 = P_FROM_COL3
    MINUS
    select COL4
    FROM TABLE3
    WHERE COL1 = P_COL1 AND COL2 = P_TO_COL2 AND COL3 = P_TO_COL3;  


V_REC        CFL1%ROWTYPE;

BEGIN

IF P_FLG1='N' OR P_FLG2='N' OR P_FLG3='N' OR  P_FLG4 ='N' OR P_FLG5 = 'N' THEN
    GOTO label; --do nothing
END IF;


IF P_FLG1 = 'Y' THEN

    OPEN CFL1;
    FETCH CFL1 INTO V_REC;
    CLOSE C1;

    SELECT COL5, COL6
    FROM TABLE1
    WHERE COL1 = P_COL1 AND COL2 = P_FROM_COL2 AND COL3 = P_FROM_COL3 AND COL4 = V_REC.COL4;


    FOR REC IN CFL1 LOOP
        INSERT INTO TABLE1 
            SELECT P_COL1, P_TO_COL2, P_TO_COL3, CFL1.COL4, -- COL5 , COL6 ?? -- , SEQ.NEXTVAL) 

    END LOOP;

END IF;

-- ..........

<<label>>
END;

如果你能帮助我,我将不胜感激。

非常感谢

【问题讨论】:

    标签: oracle stored-procedures plsql sql-insert


    【解决方案1】:

    CFL1.COL4 不起作用,因为您需要引用结果集变量:REC.COL4。

    指定插入的表的列也没有什么坏处。 例如:

    INSERT INTO TABLE1 (col1, col2) values (rec.col1, rec.col2);
    

    INSERT INTO TABLE1 (col1, col2) select rec.col1, rec.col2 from dual;
    

    此外,您首先获取 CFL1,只需要 1 个记录值。 但是然后在循环中使用相同的光标。删除 fetch 并从 REC 中获取 col4 值?过程中的直接选择无论如何都不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-04
      • 1970-01-01
      • 1970-01-01
      • 2013-09-03
      • 2011-09-06
      • 2019-03-26
      相关资源
      最近更新 更多