2016-11-27 124 views
-1

我試圖創建使用Oracle的過程,應該工作正常,但我不斷收到以下錯誤:錯誤(1,30):PLS-00103:出現符號「)」

Error(1,30): PLS-00103: Encountered the symbol ")" when expecting one of the following: current delete exists prior

這裏是我的方法:

CREATE PROCEDURE ProductLineSale() 
BEGIN 
ALTER TABLE Product_T ADD COLUMN SalePrice decimal(6,2); 

UPDATE Product 
SET SalePrice = .90 * ProductStandardPrice 
WHERE ProductStandardPrice >= 400; 

UPDATE Product 
SET SalePrice = .85 * ProductStandardPrice 
WHERE ProductStandardPrice < 400; 

END 
+0

我認爲只有在有實際參數時纔可以使用括號。刪除'()'。 –

+0

我試着刪除了這些錯誤,並且拋出了這個錯誤:錯誤(2,1):PLS-00103:當期待以下某個時遇到符號「BEGIN」:(;以authid作爲集羣壓縮順序,使用編譯後的包裝外部確定性parallel_enable pipelined result_cache accessible' –

+1

你真的想完成什麼?在一個過程中添加一個列很奇怪,這意味着該過程只能被成功調用一次 - 之後,它會失敗,因爲DDL不是或者你正在嘗試安裝/更新一個應用程序,在這種情況下,這不應該是一個過程,或者你有一些你想要重複運行的東西,在這種情況下你不會包含DDL –

回答

3

我認爲這將工作:

CREATE PROCEDURE ProductLineSale 
AS BEGIN 

    EXECUTE IMMEDIATE 'ALTER TABLE Product_T ADD COLUMN SalePrice decimal(6,2)'; 

    UPDATE Product 
     SET SalePrice = (CASE WHEN ProductStandardPrice >= 400 THEN 0.90 ELSE 0.85 END) * ProductStandardPrice 
END; 

注:

  • 刪除括號。
  • alter移至動態SQL。
  • 將兩個更新組合成一個語句。
  • BEGIN之前加入AS

我認爲update是好的,但它可能還需要是動態SQL。

編輯:

我在想,甲骨文延遲查詢的解釋,直到存儲過程運行。但你應該在整個過程中使用動態SQL:

CREATE PROCEDURE ProductLineSale 
AS BEGIN 

    EXECUTE IMMEDIATE 'ALTER TABLE Product_T ADD COLUMN SalePrice decimal(6,2)'; 

    EXECUTE IMMEDIATE ' 
UPDATE Product 
    SET SalePrice = (CASE WHEN ProductStandardPrice >= 400 THEN 0.90 ELSE 0.85 END) * ProductStandardPrice 
'; 
END; 
+0

我嘗試了上面的內容,但仍然給我錯誤。 e'開始'並將其改爲動態SQL。我猜它不認識到我修改了Table產品,因爲它拋出:'錯誤(6,5):PL/SQL:ORA-00904:「SALEPRICE」:無效標識符' –

+0

真棒,這使得它編譯。我怎麼去調用那個程序呢?當我「調用產品線」時,它說這不是一個有效的過程。 –

+0

@AliElsaadi。 。 。 'call'在PL/SQL塊中不是必需的。 –

相關問題