【问题标题】:oracle cursor is not updating dataoracle 游标不更新数据
【发布时间】:2016-05-25 16:21:34
【问题描述】:

我做了一个例子来更好地说明情况:

我有两张桌子

CREATE TABLE AA
(
    ID NUMBER NOT NULL PRIMARY KEY,
    REFERENCE NVARCHAR2(100) NULL
)

CREATE TABLE BB
(
    ID NUMBER NOT NULL PRIMARY KEY,
    IDA NUMBER NOT NULL,
    REFERENCE NVARCHAR2(100) NULL,

    FOREIGN KEY (IDA) REFERENCES AA(ID)
)

还有一些记录

INSERT INTO AA VALUES(1, NULL)
INSERT INTO AA VALUES(2, NULL)
INSERT INTO AA VALUES(3, NULL)
INSERT INTO AA VALUES(4, NULL)
INSERT INTO AA VALUES(5, NULL)

INSERT INTO BB VALUES(6, 1, 'AAA')
INSERT INTO BB VALUES(7, 2, 'BBB')
INSERT INTO BB VALUES(8, 3, 'CCC')

我必须将AAREFERENCE 字段设置为BB 中的值IDA

所以我决定使用光标

DECLARE 
    idA NUMBER;
    reference NVARCHAR2(100);

    CURSOR ref_cursor
    IS
        SELECT IDA, REFERENCE FROM BB;
BEGIN

    OPEN ref_cursor;

    LOOP
        FETCH ref_cursor into idA, reference;
        EXIT WHEN ref_cursor%NOTFOUND;

        UPDATE AA 
        SET REFERENCE = reference 
        WHERE ID = idA;

        DBMS_OUTPUT.put_line('reference of movement ' || idA || ' updated with ' || reference);

    END LOOP;

    CLOSE ref_cursor;
END;

通过执行它,我得到一个输出

reference of movement 1 updated with AAA
reference of movement 2 updated with BBB
reference of movement 3 updated with CCC

这正是我想要的,但是当我通过星号选择表格来检查数据时,我发现REFERENCE 列仍然是NULL

所以我找到了另一个光标

DECLARE 
    CURSOR ref_cursor
    IS 
       SELECT IDA, REFERENCE FROM BB;

BEGIN
    FOR ref_c IN ref_cursor
    LOOP
         UPDATE AA SET REFERENCE = ref_c.REFERENCE WHERE ID = ref_c.IDA;            
    END LOOP;
END;

这个实际上是在做更新。为什么这两个光标不同?

【问题讨论】:

  • 您能否将局部变量引用更改为不同的名称(在您的第一个游标示例中)并重试?
  • Related question,不确定它是否足够接近以至于可以重复,但这是同名解析问题。 As is this one.
  • 没有提交。

标签: oracle cursor


【解决方案1】:

在 PL/SQL 块中处理 SQL 语句时,SQL 名称解析优先,因此表字段优先于同名变量。要解决此问题,您有两种方法:

  • 更改变量名。

  • 为变量名称添加前缀,就像您在第二个查询中所做的那样。

【讨论】:

    【解决方案2】:

    在你写的第一个光标中

    UPDATE AA 
            SET REFERENCE = reference 
            WHERE ID = idA;
    

    我认为您应该将变量重命名为不同的名称

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多