【问题标题】:Error(1,30): PLS-00103: Encountered the symbol ")"错误(1,30):PLS-00103:遇到符号“)”
【发布时间】:2016-11-27 04:06:25
【问题描述】:

我正在尝试使用 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

【问题讨论】:

  • 我认为只有在实际存在参数时才能使用括号。删除()
  • 我尝试删除括号并抛出此错误Error(2,1): PLS-00103: Encountered the symbol "BEGIN" when expecting one of the following: ( ; is with authid as cluster compress order using compiled wrapped external deterministic parallel_enable pipelined result_cache accessible
  • 您真正想要完成什么?在过程中添加列是相当奇怪的。这意味着该过程只能被成功调用一次——在那之后,它会因为 DDL 不再有效而失败。您正在尝试安装/更新应用程序,在这种情况下不应该是一个过程,或者您有一些想要重复运行的东西,在这种情况下您不会包含 DDL。
  • 另外,PL/SQL 没有“ALTER”语句,“ALTER TABLE ... ADD”没有“COLUMN”关键字。

标签: sql oracle stored-procedures plsql


【解决方案1】:

我认为这会奏效:

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。

编辑:

我认为 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;

【讨论】:

  • 我试过你上面的方法,仍然给我错误。我在Begin 之前添加了As 并将alter 移动到动态sql。我猜它没有识别出我在抛出时更改了表格 Product:Error(6,5): PL/SQL: ORA-00904: "SALEPRICE": invalid identifier
  • 太棒了,让它编译。不过,我该如何调用该程序?当我做Call productlinesale; 时,它说这不是一个有效的程序。
  • @AliElsaadi 。 . . call 在 PL/SQL 块中不是必需的。
  • 请添加更多关于您如何称呼它的详细信息。如果您刚刚创建了一个过程并且它是有效的,那么您在调用它时不应该得到“不是一个有效的过程”,所以要么你没有创建它,要么它无效,或者你正在调用它错了。您应该只是从动态“alter”语句中得到语法错误(先自己尝试)。然后在它成功运行一次后,你会得到一个不同的错误,因为一个表只能有一个 'saleprice' 列。
猜你喜欢
  • 2018-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-09
  • 2018-04-21
  • 2018-04-12
  • 1970-01-01
相关资源
最近更新 更多