2016-11-27 77 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块中不是必需的。 –

相关问题