当前位置: 首页 > 知识库问答 >
问题:

如何在PL/SQL过程中插入?

姜宏放
2023-03-14

我是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,请检查从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',我在表1中插入。如果P_FLG2='Y',我也在表3等中插入

我正在试着做下面的程序,但我无法完成

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;

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

谢谢

共有1个答案

宰父衡
2023-03-14

CFL1.COL4不起作用,因为需要引用resultset变量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个记录值。但随后在循环中使用相同的光标。删除获取并从REC获取col4值?无论如何,过程中的直接选择都不起作用。

 类似资料:
  • 我在论坛上看了一下,但目前还没有这个问题的答案。基本上,我试图在我的过程中创建一个视图,因为它比复杂的select语句更容易,因为它返回的'ORA-01422EXACTE fetch返回的行数超过了请求的行数',所以它似乎不起作用。我把该语句放在底部以供参考

  • 主要内容:PL/SQL子程序的部分,创建存储过程,执行独立程序,删除独立存储过程,PL/SQL子程序中的参数模式,传递参数的方法在本章中,我们将讨论PL/SQL中的存储过程。 子程序是执行特定任务的程序单元/模块。 这些子程序组合起来形成更大的程序。这种做法被称为“模块化设计”。 子程序可以被称为调用程序的另一个子程序或程序调用。 可以在以下几个地方中创建一个子程序 - 在模式(schema)级别中 一个程序包中 在PL/SQL块中 在模式(schema)级别中,子程序是一个独立的子程序。它是使

  • 问题内容: 如何指定参数为表名? 问题答案: 你不能 相反,您需要将其作为VARCHAR2字符串传递,然后使用动态SQL: 阅读有关Dynamic SQL的信息, 并注意如果不正确地使用它会带来的问题,例如性能,可伸缩性和安全性较差。

  • 主要内容:PL/SQL的特点,PL/SQL的优点PL/SQL是是由甲骨文公司在90年代初开发,以提高SQL的功能。 PL/SQL是嵌入在Oracle数据库中的三个关键的编程语言之一(随着SQL本身和Java)。 PL/SQL是Oracle数据库对SQL语句的扩展。在普通SQL语句的使用上增加了编程语言的特点,所以PL/SQL就是把数据操作和查询语句组织在PL/SQL代码的过程性单元中,通过逻辑判断、循环等操作实现复杂的功能或者计算的程序语言。

  • 我在一个存储过程(在一个包中)中声明了两个游标。 两个游标之间的唯一区别是where子句。 我想做的是根据上面传递的p_nz_标志打开其中一个游标。即: 我最初的想法是声明一个变量并为其分配适当的游标,然而,我无法用它编译过程。例如,我试过: 但我在分配“PLS-00382:表达式的类型错误”的v\u load\u trx\u游标时出现编译错误。如果我将声明更改为: 我在声明点得到编译错误,声明“