Sql 尝试在update语句中插入变量时Oracle中缺少表达式

Sql 尝试在update语句中插入变量时Oracle中缺少表达式,sql,oracle,Sql,Oracle,我试图创建一个更新,该更新将使用我声明的变量更新表,但它给了我一个错误,该错误表示正在使用表达式。我不知道这可能是什么原因造成的 这是我的密码 DECLARE VBILL BILL%ROWTYPE; CURSOR BILLAMT IS SELECT * FROM BILL; VCUST1 NUMBER(3); VCUST2 NUMBER(3); VCUST3 NUMBER(3); BEGIN SELECT FREQUENCY INTO VCUST1 FROM RANGEOFB

我试图创建一个更新,该更新将使用我声明的变量更新表,但它给了我一个错误,该错误表示正在使用表达式。我不知道这可能是什么原因造成的

这是我的密码

DECLARE
 VBILL BILL%ROWTYPE;
 CURSOR BILLAMT IS
  SELECT * FROM BILL;
 VCUST1 NUMBER(3);
 VCUST2 NUMBER(3);
 VCUST3 NUMBER(3);

BEGIN

 SELECT FREQUENCY INTO VCUST1 FROM RANGEOFBILLS WHERE RANGE=100;
 SELECT FREQUENCY INTO VCUST2 FROM RANGEOFBILLS WHERE RANGE=1000;
 SELECT FREQUENCY INTO VCUST3 FROM RANGEOFBILLS WHERE RANGE=10000;
 OPEN BILLAMT;
 LOOP
  FETCH BILLAMT INTO VBILL;
  EXIT WHEN BILLAMT%NOTFOUND;
  DBMS_OUTPUT.PUT_LINE(VBILL.AMOUNT);
  IF VBILL.AMOUNT>100 and VBILL.AMOUNT<=1000 THEN
   VCUST1:=VCUST1+1;
   EXECUTE IMMEDIATE('UPDATE RANGEOFBILLS SET FREQUENCY=@VCUST1 WHERE RANGE=100');
   DBMS_OUTPUT.PUT_LINE(VBILL.AMOUNT);
  END IF;
 END LOOP;
 CLOSE BILLAMT;
END;

从第二次尝试中删除括号:

EXECUTE IMMEDIATE 'UPDATE RANGEOFBILLS SET FREQUENCY=:a WHERE RANGE=100'
USING VCUST1;
但不需要动态SQL,最好使用updaterangeofbills SET FREQUENCY=vcust1,其中RANGE=100;。另外,通常最好在/CLOSE时避免游标/OPEN/FETCH/EXIT。循环的隐式游标更简单、更快:

DECLARE
 VCUST1 NUMBER(3);
 VCUST2 NUMBER(3);
 VCUST3 NUMBER(3);
BEGIN
 SELECT FREQUENCY INTO VCUST1 FROM RANGEOFBILLS WHERE RANGE=100;
 SELECT FREQUENCY INTO VCUST2 FROM RANGEOFBILLS WHERE RANGE=1000;
 SELECT FREQUENCY INTO VCUST3 FROM RANGEOFBILLS WHERE RANGE=10000;
 FOR VBILL IN (SELECT * FROM BILL) LOOP
  DBMS_OUTPUT.PUT_LINE(VBILL.AMOUNT);
  IF VBILL.AMOUNT>100 and VBILL.AMOUNT<=1000 THEN
   VCUST1:=VCUST1+1;
   UPDATE RANGEOFBILLS SET FREQUENCY=vcust1 WHERE RANGE=100;
   DBMS_OUTPUT.PUT_LINE(VBILL.AMOUNT);
  END IF;
 END LOOP;
END;
/

从第二次尝试中删除括号:

EXECUTE IMMEDIATE 'UPDATE RANGEOFBILLS SET FREQUENCY=:a WHERE RANGE=100'
USING VCUST1;
但不需要动态SQL,最好使用updaterangeofbills SET FREQUENCY=vcust1,其中RANGE=100;。另外,通常最好在/CLOSE时避免游标/OPEN/FETCH/EXIT。循环的隐式游标更简单、更快:

DECLARE
 VCUST1 NUMBER(3);
 VCUST2 NUMBER(3);
 VCUST3 NUMBER(3);
BEGIN
 SELECT FREQUENCY INTO VCUST1 FROM RANGEOFBILLS WHERE RANGE=100;
 SELECT FREQUENCY INTO VCUST2 FROM RANGEOFBILLS WHERE RANGE=1000;
 SELECT FREQUENCY INTO VCUST3 FROM RANGEOFBILLS WHERE RANGE=10000;
 FOR VBILL IN (SELECT * FROM BILL) LOOP
  DBMS_OUTPUT.PUT_LINE(VBILL.AMOUNT);
  IF VBILL.AMOUNT>100 and VBILL.AMOUNT<=1000 THEN
   VCUST1:=VCUST1+1;
   UPDATE RANGEOFBILLS SET FREQUENCY=vcust1 WHERE RANGE=100;
   DBMS_OUTPUT.PUT_LINE(VBILL.AMOUNT);
  END IF;
 END LOOP;
END;
/
DML语句不需要立即执行。照办

UPDATE RANGEOFBILLS SET FREQUENCY = VCUST1 WHERE RANGE = 100;
我不确定您想做什么,但我想您可以在一个UPDATE语句中完成这项工作,而不需要循环,这将使它更加高效。

对于DML语句,您不需要立即执行。照办

UPDATE RANGEOFBILLS SET FREQUENCY = VCUST1 WHERE RANGE = 100;

我不确定您想做什么,但我想您可以在一个UPDATE语句中完成这项工作,而不需要循环,这将使它更加高效。

我可能可以。但这里最主要的是语法。我是Pl/SQL新手,我可能会。但这里最主要的是语法。我是Pl/SQL新手。