如何在Oracle Developer中执行程序?

时间:2018-11-05 05:11:00

标签: sql oracle stored-procedures oracle-sqldeveloper

我试图执行我创建的过程,但是无论何时执行EXEC ProductLineSale;它告诉我错误(456,1):PLS-00103:遇到符号“ EXEC”

ALTER TABLE Product

ADD SalePrice DECIMAL(6,2); 

CREATE OR REPLACE PROCEDURE ProductLineSale 

AS 

BEGIN 

UPDATE Product
SET SalePrice = 0.90 * ProductStandardPrice
WHERE ProductStandardPrice >= 400;

 UPDATE Product
SET SalePrice = 0.85 * ProductStandardPrice
WHERE ProductStandardPrice < 400;

END;

EXEC ProductLineSale;

select *
FROM Product;

4 个答案:

答案 0 :(得分:1)

您缺少一个'/'-这告诉SQL Developer您的存储过程声明已完成,您可以对其进行编译了。

在END之后添加'/';并在执行之前。

--create table product (id integer,
--                      productstandardprice number(7,2));
--                      
--insert into product values (1, 19.95, 0);
--insert into product values (2, 7995.99);
alter table PRODUCT add SALEPRICE decimal(6, 2);

create or replace procedure PRODUCTLINESALE as
begin
  update PRODUCT
     set
    SALEPRICE = 0.90 * PRODUCTSTANDARDPRICE
   where PRODUCTSTANDARDPRICE >= 400;

  update PRODUCT
     set
    SALEPRICE = 0.85 * PRODUCTSTANDARDPRICE
   where PRODUCTSTANDARDPRICE < 400;

end;
/

exec PRODUCTLINESALE;

select *
  from PRODUCT;

我用光标选择了创建内容和所有内容,然后按F5

enter image description here

答案 1 :(得分:0)

/之前,您缺少EXEC来关闭PROCEDURE

请参见why we need forward slash

  

对于其他PL / SQL块,包括过程,函数,程序包和触发器,由于它们是多行程序,因此Oracle需要一种方法来知道何时运行该块,因此我们必须在末尾写一个正斜杠。每个块让Oracle运行它。

答案 2 :(得分:0)

您需要用BeginEnd

围起来
ALTER TABLE Product

ADD SalePrice DECIMAL(6,2); 

CREATE OR REPLACE PROCEDURE ProductLineSale 

AS 

BEGIN 

UPDATE Product
SET SalePrice = 0.90 * ProductStandardPrice
WHERE ProductStandardPrice >= 400;

 UPDATE Product
SET SalePrice = 0.85 * ProductStandardPrice
WHERE ProductStandardPrice < 400;

END;

BEGIN
EXECUTE ProductLineSale;
END;

select *
FROM Product

答案 3 :(得分:0)

换句话说,您可能只有一条update语句,它比两条语句更有效。

UPDATE product
SET saleprice =
          CASE
               WHEN productstandardprice >= 400 THEN 0.90 * productstandardprice
               WHEN productstandardprice < 400  THEN 0.85 * productstandardprice
          END;

此外,如果可以轻松地从现有列中生成表,则建议在表中不要包含另一列。您应该选择VIRTUAL COLUMNS

因此,您可以重新定义saleprice

ALTER TABLE product ADD (
      SalePrice    DECIMAL(6,2)  GENERATED ALWAYS AS (
               CASE
                    WHEN productstandardprice >= 400 THEN 0.90 * productstandardprice
                    WHEN productstandardprice < 400  THEN 0.85 * productstandardprice
               END
          )
);

现在,当您从表中运行选择时,该列将自动显示计算值