sql - 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 语句并且它有效,但我需要进行数据修改。
解决方案
这是错误的:
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
,命名所有目标列 - 不要依赖于您“知道”目标表的描述这一事实,因为它可能(并且有一天会)改变。
推荐阅读
- python - 在 Python 中每月逐步计算 MAPE
- java - Java 8 - 从给定项目开始截断列表中所有项目的最佳方法
- html - 是否有禁用地址字段自动填充的标准方法?
- powershell - 如何在 PowerShell 中使用输入文本框实现 Windows 10 Toast 通知
- c# - c#字符串格式0,0个位数有前导零
- javascript - 在同一个库中创建模块的优步模块?
- java - Kafka如何在加入多个流时防止使用旧记录
- orange - 篮子文件加载为数字。如何使其加载为分类?
- javascript - 如何在 webworker 请求时将信息传递给它
- python - Django Crontab 不写入 csv 文件