【问题标题】:create oracle package encountered PLS-00103: Encountered the symbol "CREATE"创建oracle包遇到PLS-00103:遇到符号“CREATE”
【发布时间】:2012-03-03 03:48:47
【问题描述】:

我正在使用 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 行添加/,则错误变为:

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

我厌倦了这样的空实现:

create or replace 
package package1 as 
END PACKAGE1;

CREATE OR REPLACE 
package body package1 as 
end package1;

我也犯了同样的错误。

【问题讨论】:

  • 使用 IDE,这里有几个错误应该在 Toad 或类似编辑器中跳出,例如:BEGIN afterPopulate 应该是 FUNCTION afterPopulate,select * from TEST 应该是 select blah into v_blah from TEST.. .其他问题以及
  • 并将其加入书签以供以后参考:docs.oracle.com/cd/E11882_01/appdev.112/e25519/toc.htm
  • 谢谢你,tbone。我什至尝试过这样的空实现:create or replace package package1 as END PACKAGE1;创建或替换包体包 1 作为结束包 1;我也犯了同样的错误。
  • 将其作为脚本运行(将每个 / 放在自己的行):创建或替换包 test1 为 end test1;/ 创建或替换包体 test1 为 end test1;/
  • 如果你可以...作为脚本运行...哦,很高兴你让它工作了 :)

标签: oracle plsql pls-00103


【解决方案1】:

当我将 sqldeveloper 中的所有 db 包代码(过程头和实现)复制到 user/packages/MY_PACKAGE_NAME/ 时,我遇到了这个问题(错误(6,1):PLS-00103:遇到符号“/”) MY_PACKAGE_BODY,而不是将标头(末尾没有“/”)复制到 user/packages/MY_PACKAGE_NAME 中,并将实现(顶部没有标头,末尾没有“/”)复制到 user/packages/MY_PACKAGE_NAME/MY_PACKAGE_BODY。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      当你有 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;
      /
      

      【讨论】:

      • 感谢 Andrew,您的提示帮助我弄清楚了为什么我的包没有编译。
      • 请让我们结束这个问题。请指定正确答案@MissPiplup
      • 这就像一个魅力。你应该在这个答案中给出一个简单的例子。
      【解决方案4】:

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

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

      【讨论】:

      • 我创建的包显然是 RDI_API。我的结构和你完全一样。这应该可以解决您的问题。
      【解决方案5】:

      按F5分别执行包和包体

      【讨论】:

        【解决方案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;
        /   
        

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

        【讨论】:

        • 我将您的代码复制到我的 sqldeveloper 中,我得到: Error(7,1): PLS-00103: Encountered the symbol "/" 。我正在使用 oracle 开发者版本 3.0.04。
        • 尝试创建它使用的表CREATE TABLE "TESTE" ("teste2" VARCHAR2(5 BYTE), "teste3" VARCHAR2(5 BYTE), "TESTE" VARCHAR2(5 BYTE) ) ) ;
        • 另外,请确保将其作为脚本运行,我认为它应该是 F5。
        猜你喜欢
        • 2020-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-23
        • 2016-11-05
        • 1970-01-01
        相关资源
        最近更新 更多