Sql 错误(1,30):PLS-00103:遇到符号“)&引用;

Sql 错误(1,30):PLS-00103:遇到符号“)&引用;,sql,oracle,stored-procedures,plsql,Sql,Oracle,Stored Procedures,Plsql,我正在尝试使用oracle创建一个过程,它应该可以正常工作,但我一直遇到以下错误: 错误(1,30):PLS-00103:在预期以下情况之一时遇到符号“)”:当前删除之前存在 以下是我的程序: CREATE PROCEDURE ProductLineSale () BEGIN ALTER TABLE Product_T ADD COLUMN SalePrice decimal(6,2); UPDATE Product SET SalePrice = .90 * ProductStand

我正在尝试使用oracle创建一个过程,它应该可以正常工作,但我一直遇到以下错误:

错误(1,30):PLS-00103:在预期以下情况之一时遇到符号“)”:当前删除之前存在

以下是我的程序:

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
创建过程ProductLineSale()
开始
更改表Product\T添加列SalePrice decimal(6,2);
更新产品
设置售价=.90*ProductStandardPrice
其中ProductStandardPrice>=400;
更新产品
设置售价=.85*ProductStandardPrice
其中产品标准价格<400;
终止

我认为这会奏效:

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
  • 将两个更新合并到一个语句中
  • 开始之前添加
    作为
我认为
更新
是可以的,但它可能还需要是动态SQL

编辑:

我认为Oracle将查询的解释延迟到存储过程运行之后。但您应始终使用动态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;

我认为只有在实际有参数的情况下才能使用括号。删除
()
。我尝试删除偏执,但它抛出了此错误
错误(2,1):PLS-00103:在预期以下情况之一时遇到符号“BEGIN”:(;是否将authid作为集群压缩顺序,使用已编译的包装外部确定性并行_启用流水线结果_缓存可访问
您真正想做的是什么?在过程中添加一列非常奇怪。这意味着该过程只能成功调用一次--之后,它将失败,因为DDL不再有效。您正在尝试安装/更新应用程序,在这种情况下,该应用程序不应该是过程,或者您有一些要重复运行的应用程序,在这种情况下,您不会包含DDL。此外,PL/SQL没有“ALTER”语句,“ALTER TABLE…ADD”没有“COLUMN”关键字。我尝试了您所做的上面的e仍然给了我错误。我在
Begin
之前添加了
As
,并将alter移动到动态sql。我猜它不知道我在抛出时更改了表产品:
Error(6,5):PL/sql:ORA-00904:“SALEPRICE”:无效标识符
Awesome,这使它无法编译。但我如何调用该过程?当我调用productlinesale;
时,它会说它不是有效的过程。@AliElsaadi…
调用
在PL/SQL块中不是必需的。请添加有关如何调用它的更多详细信息。如果您刚刚创建了一个过程而且它是有效的,调用它时不应该得到“not a valid procedure”,因此要么是您没有创建它,要么是它无效,要么是您调用它时出错。您应该从动态“alter”语句中得到语法错误(先尝试它自己)。然后,在成功运行一次后,您将收到另一个错误,因为一个表只能有一个“saleprice”列。