首页 > 解决方案 > Oracle 在 DML 数据获取中使用变量?

问题描述

我正在尝试以下操作:

SET SERVEROUTPUT ON;

DECLARE
    V_COUNT NUMBER := 1;
    V_LIITM NUMBER := 1;
    V_LIMCU CHAR(12) := NULL;
    V_LILOCN CHAR(20) := NULL;
    V_LILOTN CHAR(30) := NULL;

BEGIN

    -- INITIAL COUNT --
    SELECT COUNT(*) INTO V_COUNT FROM QADTA.F41021
        where exists (select IBGLPT FROM QADTA.F4102
            where ibitm = liitm and ibmcu = LIMCU
            and ibglpt <> liglpt AND (LIPBIN = 'P' OR LIPQOH != 0));

    DBMS_OUTPUT.PUT_LINE('There are initially '||V_COUNT||' missing registries.');

    -- GENERATING SEARCH VARIABLES --  
    SELECT LIITM, LIMCU, LILOCN, LILOTN, LIGLPT
        INTO V_LIITM, V_LIMCU, V_LILOCN, V_LILOTN, V_LIGLPT
        FROM QADTA.F41021 where exists (select IBGLPT FROM QADTA.F4102
            where ibitm = liitm and ibmcu = LIMCU and ibglpt <> liglpt
            AND (LIPBIN = 'P' OR LIPQOH != 0)) AND ROWNUM <= 1;

-- FIRST EXERCISE -- INSERT --
    INSERT INTO QADTA.F41021_BACKOUT
        SELECT LIITM, LIMCU, LILOCN, LILOTN, LIGLPT FROM QADTA.F41021
            WHERE (LIITM, LIMCU, LILOCN, LILOTN)
                IN (V_LIITM, V_LIMCU, V_LILOCN, V_LILOTN);

-- SECOND EXERCISE -- UPDATE --
    UPDATE QADTA.F41021 
        SET F41021.LIGLPT = (SELECT IBGLPT FROM QADTA.F4102
            WHERE IBITM = LIITM and IBMCU = LIMCU)
            WHERE (LIITM, LIMCU, LILOCN, LILOTN)
                IN (V_LIITM, V_LIMCU, V_LILOCN, V_LILOTN);

    END;

但是,执行时出现错误“00920 - 无效的关系运算符”。我取消了 DML 语句并且它有效,但我需要进行数据修改。

标签: sqloracleplsql

解决方案


这是错误的:

WHERE (LIITM, LIMCU, LILOCN, LILOTN)
   IN (V_LIITM, V_LIMCU, V_LILOCN, V_LILOTN);

看一个例子:

SQL> create table x as select * From dept where 1 = 2;

Table created.

SQL> insert into x
  2  select * from dept
  3  where (deptno, dname) in (10, 'ACCOUNTING');
where (deptno, dname) in (10, 'ACCOUNTING')
                         *
ERROR at line 3:
ORA-00920: invalid relational operator


SQL> insert into x
  2  select * from dept
  3  where deptno = 10
  4    and dname = 'ACCOUNTING';

1 row created.

SQL>

我想你知道你必须做什么才能修复它。

此外,在生成搜索变量时,您正在选择into V_LIGLPT未声明的变量。

此外,我建议您使用表别名并使用这些别名限定所有查询中的所有列,以便清楚哪个列属于哪个表。

最后, when INSERTING INTO,命名所有目标列 - 不要依赖于您“知道”目标表的描述这一事实,因为它可能(并且有一天会)改变。


推荐阅读