Sql Oracle在DML数据获取中使用变量?
我正在尝试以下方法:Sql Oracle在DML数据获取中使用变量?,sql,oracle,plsql,Sql,Oracle,Plsql,我正在尝试以下方法: 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 FR
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>
我想你知道为了修复它你必须做什么了
另外,在生成搜索变量时,您正在选择未声明的V_LIGLPT
此外,我建议您使用表别名,并用这些别名限定所有查询中的所有列,以便清楚哪个列属于哪个表
最后,在插入时,命名所有目标列-不要依赖于您知道目标表的描述这一事实,因为它可能会发生变化,并且有一天它会发生变化。这是错误的:
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>
我想你知道为了修复它你必须做什么了
另外,在生成搜索变量时,您正在选择未声明的V_LIGLPT
此外,我建议您使用表别名,并用这些别名限定所有查询中的所有列,以便清楚哪个列属于哪个表
最后,当插入到时,命名所有目标列-不要依赖于您知道目标表的描述这一事实,因为它可能会发生变化,并且有朝一日会发生变化。使用IN运算符,您可以检查另一个表达式列表中是否存在表达式列表。因此,如果在运算符的左侧使用多个表达式,则也必须在右侧使用多个表达式
在您的示例中,您将尝试将4个值LIITM、LIMCU、LILOCN、LILOTN与值V_LIITM、V_LIMCU、V_LILOCN、V_LILOTN进行比较
为了让它工作,你必须把一组元素放在括号里。V_LIITM,V_LIMCU,V_LILOCN,V_LILOTN
如果没有括号,Oracle将四个值V_LIITM、V_LIMCU、V_LILOCN、V_LILOTN解释为元素列表,它们与表达式不匹配。使用IN运算符,您可以检查另一个表达式列表中是否存在表达式列表。因此,如果在运算符的左侧使用多个表达式,则也必须在右侧使用多个表达式
在您的示例中,您将尝试将4个值LIITM、LIMCU、LILOCN、LILOTN与值V_LIITM、V_LIMCU、V_LILOCN、V_LILOTN进行比较
为了让它工作,你必须把一组元素放在括号里。V_LIITM,V_LIMCU,V_LILOCN,V_LILOTN
如果没有括号,Oracle将四个值V_LIITM、V_LIMCU、V_LILOCN、V_LILOTN解释为元素列表,它们与表达式不匹配。他的尝试并非完全错误。他所做的已经是可能的了。他只是忘记了图普周围的大括号。我试过了&很成功,但是为什么我不能使用它们“IN”操作符呢?显然,你可以-但是使用提供的语法修补程序。他的尝试并不是完全错误的。他所做的已经是可能的了。他只是忘记了图普周围的大括号。我试过了&很成功,但是为什么我不能使用它们“IN”操作符呢?显然,你可以,但是使用提供的语法修补程序。