我怎样才能在 PL/SQL 程序中插入这个 INSERT?
How can i make this INSERT in PL/SQL Procedure?
我是 pl/sql 编程新手,我需要你的帮助。
我想做一个程序。
更具体地说,我有 table 个像下面的 TABLE1
================================================
|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 来自 COL4 的不同值
例如对于 COL1=600 , COL2=140/COL3=2 和 COL2=150/COL3=3
Return 20 和 35
并在此 table TABLE1 中插入行
600 , 150 , 3, 20 , 1400 , 340, 7 (seq number)
600 , 150 , 3, 35 , 1700 , 120, 8 (seq number)
如果 P_FLG1 = 'Y',我会在表 1 中进行插入。 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;
如果你能帮助我,我将不胜感激。
非常感谢
CFL1.COL4 将不起作用,因为您需要引用结果集变量:REC.COL4。
并且指定您插入的 table 的列也没有坏处。
例如:
INSERT INTO TABLE1 (col1, col2) values (rec.col1, rec.col2);
或
INSERT INTO TABLE1 (col1, col2) select rec.col1, rec.col2 from dual;
此外,您首先获取 CFL1,期望只有 1 个记录值。
但是然后在循环中使用相同的游标。删除提取并从 REC 获取 col4 值?程序中的直接 select 无论如何都行不通。
我是 pl/sql 编程新手,我需要你的帮助。
我想做一个程序。
更具体地说,我有 table 个像下面的 TABLE1
================================================
|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 来自 COL4 的不同值 例如对于 COL1=600 , COL2=140/COL3=2 和 COL2=150/COL3=3 Return 20 和 35
并在此 table TABLE1 中插入行
600 , 150 , 3, 20 , 1400 , 340, 7 (seq number)
600 , 150 , 3, 35 , 1700 , 120, 8 (seq number)
如果 P_FLG1 = 'Y',我会在表 1 中进行插入。 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;
如果你能帮助我,我将不胜感激。
非常感谢
CFL1.COL4 将不起作用,因为您需要引用结果集变量:REC.COL4。
并且指定您插入的 table 的列也没有坏处。 例如:
INSERT INTO TABLE1 (col1, col2) values (rec.col1, rec.col2);
或
INSERT INTO TABLE1 (col1, col2) select rec.col1, rec.col2 from dual;
此外,您首先获取 CFL1,期望只有 1 个记录值。 但是然后在循环中使用相同的游标。删除提取并从 REC 获取 col4 值?程序中的直接 select 无论如何都行不通。