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新手。