在 PL/SQL 中编译包时出错。错误(7,1):PLS-00103:遇到符号“CREATE”

Posted

技术标签:

【中文标题】在 PL/SQL 中编译包时出错。错误(7,1):PLS-00103:遇到符号“CREATE”【英文标题】:Error while compiling the package in PL/SQL. Error(7,1): PLS-00103: Encountered the symbol "CREATE" 【发布时间】:2018-07-03 09:27:34 【问题描述】:

错误(7,1):PLS-00103:遇到符号“CREATE”。我试着把 / 在创建之前但随后出现错误 Error(6,1): PLS-00103: Encountered 符号“/”。

我是 PL/SQL 编程的新手,请您帮忙。

CREATE OR REPLACE PACKAGE EMP_BULK_INSERT AS 

     PROCEDURE Bulk_Insert;

    END EMP_BULK_INSERT;
    /* package body */
    CREATE OR REPLACE PACKAGE BODY EMP_BULK_INSERT AS

      PROCEDURE Bulk_Insert
      AS
         /* select all records from source table */
          CURSOR kt_test_cur IS
            SELECT empid
            ,      empband
            ,      empname
            ,      workexp
            ,      salary
            from   kt_test;

            /* create nested table type and variable that will hold BIG_TABLE's records */
            TYPE kt_test_ntt IS TABLE OF kt_test_cur%ROWTYPE;
            l_kt_test kt_test_ntt;
       BEGIN
            /* open pointer to SELECT statement */
            OPEN kt_test_cur;
            /* collect data in the collection */
            FETCH kt_test_cur BULK COLLECT INTO l_kt_test;
            /* close the pointer */
            CLOSE kt_test_cur;

           /* print size of the collection */
           DBMS_OUTPUT.PUT_LINE('Nested table holds: ' || TO_CHAR(l_kt_test.COUNT) || ' records.');

            /* write data down to target table */
            FORALL indx IN l_kt_test.FIRST..l_kt_test.LAST
                INSERT INTO kt1_test(empid,empband,empname,workexp,salary)
                VALUES (l_kt_test(indx).empid,l_kt_test(indx).empband,l_kt_test(indx).empname,l_kt_test(indx).workexp,l_kt_test(indx).salary);

             DBMS_OUTPUT.PUT_LINE('Number of rows inserted ' || SQL%ROWCOUNT || ' rows');

             COMMIT;

        END Bulk_Insert;

    END EMP_BULK_INSERT;

【问题讨论】:

你是怎么运行这个的? SQLPLUS, SQLDeveloper, .. ? 我正在通过 SQL Developer 运行。 【参考方案1】:

“/”需要单独在一个空行上。 像这样:

CREATE OR REPLACE PACKAGE abc AS
...
END;
/
CREATE OR REPLACE PACKAGE BODY abc AS
...
END;
/

“/”的意思是执行命令缓冲区。在这种情况下,它会执行前一个 PL/SQL 块。

有关此主题的更深入讨论,请参阅此处 stack overflow

【讨论】:

我在规范和正文中都添加了 / 。但现在错误是“Error(6,1): PLS-00103: Encountered the symbol "/" " 当我在 SQL developer 中将此代码作为 s 脚本运行时,它工作并成功编译,但作为包代码它有相同的错误。但它也应该在这里工作。有什么解决办法吗? 当我试图编译整个包时,我得到了上述错误。但是当我将这个包的所有内容复制并粘贴到一个单独的工作表中时,它被编译了。 你如何尝试编译包?请注意:“/”不是包代码的一部分。它只是告诉前端,如 SQLPlus 或 SQL开发人员工作表,PL/SQL 块在哪里结束。 如果你通过实际的问题,我试图编译一个没有'/'的包,然后我得到错误为'Error(7,1):PLS-00103:遇到符号“CREATE “。'。然后根据建议我输入'/',在创建之前我得​​到错误'错误(6,1):PLS-00103:遇到符号“/”'。因此,我使用“/”将代码粘贴到单独的工作表中。然后它工作了。但我想编译没有 '/' 的包。【参考方案2】:

如果你想通过 SQL Developer 的专用对象视图来操作包,你必须将包 def 和 body 分开,并在两者中都使用“/”:

首先编译包规范(不带“/”)。然后在带有小包图标(编译图标左侧)的单独标签页中打开正文。编辑你的正文代码并在那里编译(同样,没有“/”)。

【讨论】:

谢谢,这有帮助。 不客气!请。用绿色复选标记将答案标记为已回答,这样人们就可以专注于未解决的问题。谢谢。

以上是关于在 PL/SQL 中编译包时出错。错误(7,1):PLS-00103:遇到符号“CREATE”的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL:调用包时找不到被调用的程序单元

ORACLE PL/SQL编程总结

在哪里保存 PL/SQL 常量?

在重新编译oracle包时,哪些缓存会更新?

插入 CLOB 列时出错:ORA-06502:PL/SQL:数字或值错误

window 7 系统下 ,PL/SQL 连接Oracle11g 失败。