21

我正在使用 Oracle sql developer 编写一个 oracle 包,我得到了这个编译错误:

错误(7,1):PLS-00103:遇到符号“CREATE”。

create or replace
PACKAGE TestPackage AS 
 FUNCTION beforePopulate RETURN BOOLEAN;
 FUNCTION afterPopulate RETURN BOOLEAN;
END TestPackage;

CREATE OR REPLACE PACKAGE BODY TestPackage AS
   FUNCTION beforePopulate RETURN BOOLEAN AS
   BEGIN
      DELETE FROM TEST_1;
      INSERT INTO TEST_1
      SELECT * FROM TEST WHERE VALUE=300;
      COMMIT;
      RETURN TRUE;
     EXCEPTION
       WHEN OTHERS THEN
        RETURN FALSE;
   END;
   FUNCTION afterPopulate RETURN BOOLEAN AS
     BEGIN
         UPDATE TEST SET RESULT="completed" WHERE VALUE=300;
            COMMIT;
         RETURN TRUE;
         EXCEPTION
           WHEN OTHERS RETURN FALSE;
        END;
  END;
END TestPackage;

如果我/在第 6 行添加 a,则错误变为:

错误(6,1):PLS-00103:遇到符号“/”

我厌倦了这样的空实现:

create or replace 
package package1 as 
END PACKAGE1;

CREATE OR REPLACE 
package body package1 as 
end package1;

我也犯了同样的错误。

4

6 回答 6

28

当你有 BEGIN、END 等时,你是在 PL/SQL,而不是 SQL。

PL/SQL 块需要在行首用一个(“正向”)斜杠终止。这告诉 Oracle 您已完成 PL/SQL 块,因此它会编译该文本块。

SQL 查询 - 以分号结尾:

update orders set status = 'COMPLETE' where order_id = 55255;

PL/SQL 块 - 以分号分隔的命令块由正斜杠终止:

create or replace procedure mark_order_complete (completed_order_id in number)
is
begin
     update orders set status = 'COMPLETE' where order_id = :completed_order_id;
end mark_order_complete;
/
于 2012-02-11T03:42:26.260 回答
6

这对我使用 Oracle SQL Developer 有用:

create or replace PACKAGE TestPackage AS
FUNCTION beforePopulate 
 RETURN BOOLEAN;  
FUNCTION afterPopulate 
 RETURN BOOLEAN;
END TestPackage;
/
CREATE OR REPLACE PACKAGE BODY TestPackage AS    
 FUNCTION beforePopulate 
  RETURN BOOLEAN  AS    
 BEGIN       
  DELETE FROM TESTE;      
  INSERT INTO TESTE       
  SELECT 1,1,1 FROM DUAL; 
  COMMIT;     
  RETURN TRUE;  
 EXCEPTION    
  WHEN OTHERS THEN   
   RETURN FALSE;   
 END;
 FUNCTION afterPopulate 
  RETURN BOOLEAN  AS  
 BEGIN
  UPDATE TESTE SET TESTE='OK' WHERE TESTE='';
  COMMIT;       
  RETURN TRUE;  
 EXCEPTION       
  WHEN OTHERS THEN RETURN FALSE;    
 END; 
END TestPackage;
/   

在我实际创建它要使用的表和列之前,我无法让它运行。

于 2012-02-10T17:41:32.193 回答
5

经过几个小时的挫折后,我设法让这些东西发挥作用。我和你一样遇到了确切的问题。

我的解决方案是将它作为脚本运行 - 而不是在包代码中。正斜杠在 SQL 工作表中正常工作。我附上区别,希望对您有所帮助!

在此处输入图像描述

于 2013-05-09T15:09:46.667 回答
2

我有同样的问题。我使用左侧的主菜单创建包,并将包声明和正文放在同一个 .sql 文件中。当我复制所有代码并将其粘贴到新工作表中并将“/”放在 end package_name 之后(在包声明和正文之后)然后将工作表作为脚本执行时,问题得到解决。

于 2014-08-07T07:57:12.257 回答
1

F5分别执行包和包体

于 2013-02-21T13:33:43.020 回答
0

当我将 sqldeveloper 中的所有 db 包代码(过程头和实现)复制到 user/packages/MY_PACKAGE_NAME/MY_PACKAGE_BODY 而不是将标题(末尾不带“/”)复制到用户/包/MY_PACKAGE_NAME 中,并将实现(顶部没有标题,末尾不带“/”)复制到用户/包/MY_PACKAGE_NAME/MY_PACKAGE_BODY。

于 2017-01-25T11:21:09.943 回答