2014-04-17 37 views
0

我想創建一個更新,它將用我聲明的變量更新表,但它給了我一個說「缺少表達式」的錯誤。我不知道可能會導致這種情況。當我嘗試在更新語句中插入一個變量時在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 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 [email protected] 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); 

回答

2

你不需要EXECUTE IMMEDIATE的DML語句。只要做到

UPDATE RANGEOFBILLS SET FREQUENCY = VCUST1 WHERE RANGE = 100; 

而且我不知道你想做什麼,但我想你可以在一個UPDATE聲明這樣做沒有循環,這將使其更有效。

+0

我大概可以。但這裏主要的是語法。我是新來的Pl/SQL。 –

2

從第二次嘗試刪除括號:

EXECUTE IMMEDIATE 'UPDATE RANGEOFBILLS SET FREQUENCY=:a WHERE RANGE=100' 
USING VCUST1; 

但沒有必要的動態SQL,這將是更好地使用UPDATE RANGEOFBILLS SET FREQUENCY=vcust1 WHERE RANGE=100;。另外,避免CURSOR/OPEN/FETCH/EXIT WHEN/CLOSE通常是一個好主意。隱式遊標for循環更簡單,更快速:

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; 
/
相關問題