Sql 错误(1,30):PLS-00103:遇到符号“)&引用;
我正在尝试使用oracle创建一个过程,它应该可以正常工作,但我一直遇到以下错误: 错误(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
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;
注:
- 删除括号
- 将
移动到动态SQLalter
- 将两个更新合并到一个语句中
- 在
开始之前添加
作为
更新
是可以的,但它可能还需要是动态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”列。