【问题标题】:copy data after comparing a specific value比较特定值后复制数据
【发布时间】:2015-10-08 01:29:08
【问题描述】:

我想用 in 参数做一个过程。更加具体, 我有如下表1

|COL1 | COL2 | COL3 | COL4 |  COL5 | COL6|
 ----------------------------------------
|600  |  140 |   2  |  10  |  1600 |  1  |
 ----------------------------------------
|600  |  140 |   2  |  20  |  1200 |  4  |
 ----------------------------------------
|600  |  140 |   2  |  15  |  1100 |  3  |
 ----------------------------------------
|600  |  140 |   2  |  35  |  1700 |  2  |
 ----------------------------------------
|600  |  140 |   3  |  10  |  1300 |  6  |
 ----------------------------------------
|600  |  140 |   3  |  15  |  1100 |  5  |
 ---------------------------------------- 

对于相同的 COL1 和 col2/col3 ,检查 select different values from col4 例如 col1=600 、 col2=140/col3=2 和 col2=140/col3=3 返回 20 和 35

并在此表 TABLE1 中插入行 600 , 140 , 3, 20 , 1200 , 7 (seq number) 600 , 140 , 3, 35 , 1700 , 8 (seq number)

但我不知道如何执行插入语句:(

    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,                                      
                                     P_FLG4         IN      VARCHAR2,
                                     P_FLG5         IN      VARCHAR2
                                ) IS


    CURSOR C1 IS SELECT *
                   FROM A
                  WHERE COL1 = P_COL1;

    CURSOR C2 IS SELECT *
                   FROM B
                  WHERE COL1  = P_COL1
                    AND COL2  = P_COL2
                    AND COL3  = P_COL3 ;

    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
        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
-- how to do insert ?

    END IF;

    IF P_FLG2 = 'Y' THEN
        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
    END IF;
    -- ..........
    <<label>>
    END;

你能帮我做吗? 谢谢

【问题讨论】:

    标签: plsql procedure


    【解决方案1】:

    如果我没记错的话,您是在尝试从一个表中获取值并尝试将它们插入到另一个表中。那么,你可以这样。

    Insert into YourTable(col1,col2,coln) 
                  SELECT col1,col2,coln from anotherTable;
    

    更新

    阅读您最近的评论后,您似乎应该使用MERGE。在这种情况下,即使您不需要使用光标。

    MERGE INTO destination D
       USING (SELECT col1, col2 FROM source
       WHERE [condition check]) S
       ON (D.id = S.id)
       WHEN NOT MATCHED THEN INSERT (D.col3, D.col4)
         VALUES (S.col3, S.col4);
    

    【讨论】:

    • 不完全是我认为使用游标我可以使用这样的游标
        CURSOR CFL1 IS select COL4 FROM TABLE1 WHERE COL1 = P_COL1 AND COL2 = P_FROM_COL2 AND COL3 = P_FROM_COL3 MINUS select COL4从表 1 中,COL1 = P_COL1 AND COL2 = P_TO_COL2 AND COL3 = P_TO_COL3) V_REC CFL1%ROWTYPE;打开 CFL1; FETCH CFL1 INTO V_REC;关闭 C1; IF P_FLG1 = 'Y' THEN FOR REC IN CFL1 LOOP INSERT INTO TABLE1 VALUES (P_COL1, P_TO_COL2, P_TO_COL3, V_REC.COL4, --??? -- , SEQNAME.NEXTVAL);结束循环;万一; 
    • 你想达到什么目的?您能否指出,您到底在尝试什么?
    • 用户给出源 col2=140, col3=2 和目标 col2=140 col3=3.0 我想检查源上存在但目标上不存在的 col4 的值。然后为目标上的每个不常见的 col4 插入 col4、col5 的值..
    • 非常感谢您的帖子。我不知道合并语句存在。
    • @prokopis 总是考虑接受答案,如果他们有帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多