创建一个包含三个名为proc 1等的公共过程的包

时间:2017-10-29 18:47:08

标签: oracle plsql

我应该解决以下问题:

  

创建一个名为hellofrom的包,其中包含三个名为proc_1,proc_2和proc_3的公共过程。这些过程中的每一个都应使用DBMS_OUTPUT.PUT_LINE()来显示消息“Hello from Proc x”,其中“x”为1或2或3,视情况而定。

     

此外,proc_1应调用proc_2,proc_2应调用proc_3,因此您需要在proc_1中包含对proc_2的引用,并在proc_2中包含对proc_3的引用。

我写了以下代码:

CREATE OR REPLACE PACKAGE BODY hellofrom IS
   PROCEDURE proc_1  ---public procedure
     (p_hello_1  IN VARCHAR2)
   IS   v_sec_hello   VARCHAR2;   --LOCAL VARIABLE
   BEGIN
       DBMS_OUTPUT.PUT_LINE(proc_1: 'Hello from Proc 1');
   END hello_1;

   PROCEDURE proc_2  ---public procedure
       (p_hello_2   IN VARCHAR2)
   IS    v_thd_hello   VARCHAR2;   --LOCAL VARIABLE 
   BEGIN
        DBMS_OUTPUT.PUT_LINE(proc_2: 'Hello from Proc 2');
   END hello_2;

   PROCEDURE proc_3    ---public procedure
        (p_hello_3    IN  VARCHAR2)
   IS      v_sec_hello        --LOCAL VARIABLE
   BEGIN
         DBMS_OUTPUT.PUT_LINE(proc_3: 'Hello from Proc_3');
   END hello_3;

但是当我执行它时,我收到一个错误:

Error at line 23: PLS-00103: Encountered the symbol "end-of-file" 
    when expecting one of the following:

    begin function pragma procedure

为什么我会收到此错误,如何解决? 对于 现在我为这部分问题编写了一个代码:此外,proc_1应该调用proc_2,proc_2应该调用proc_3,因此你需要在proc_1中包含对proc_2的引用,并从proc_2引用proc_3。这就是我所拥有的:

创建或替换包裹身体hellofrom IS   功能call_proc - 私有函数    (p_proc_1 VARCHAR2,     p_proc_2 VARCHAR2,     p_proc_3 VARCHAR2)   RETURN VARCHAR2 IS    开始     如果p_proc_1那么         DBMS_OUTPUT.PUT_LINE('来自Proc_2'的Hello);     ELSEIF p_proc_2然后         DBMS_OUTPUT.PUT_LINE('来自Proc_3'的Hello);     ELSE
        DBMS_OUTPUT.PUT_LINE('你好');  万一; END call_proc;    程序proc_1    IS    开始      DBMS_OUTPUT.PUT_LINE('你好,来自Proc 1');    END proc_1;

PROCEDURE proc_2
IS
BEGIN
   DBMS_OUTPUT.PUT_LINE('Hello from Proc 2');
END proc_2;

PROCEDURE  proc_3
IS
BEGIN
    DBMS_OUTPUT.PUT_LINE('Hello from Proc 3');
END proc_3;

结束hellofrom;

这就是回归。 第33行出错:PLS-00103:遇到符号" END"期待以下之一:

开始函数编译指示程序

  1. 创建或替换包裹身体hellofrom IS
  2. 功能call_proc - 私人功能
  3. (p_proc_1 VARCHAR2,
  4. p_proc_2 VARCHAR2,
  5. p_proc_3 VARCHAR2)
  6. 我以为我放了一个功能。不确定是什么错误。

2 个答案:

答案 0 :(得分:1)

您不需要该过程的任何参数,并且您没有使用局部变量,因此可以删除它们。你只有一个包体和没有规格 - 你需要一个。 END语句后的过程名称与签名中的名称不匹配。您需要更正DBMS_OUTPUT.PUT_LINE语句中的语法错误。

您还需要从proc_2拨打proc_1,从proc_3拨打proc_2 ...但是您的作业可以完成。

请记住,当您提交时,您需要添加归因于您使用的答案的归因(根据许可cc by-sa 3.0attribution required的要求)。

Oracle 11g R2架构设置

CREATE OR REPLACE PACKAGE hellofrom IS
   PROCEDURE proc_1;
   PROCEDURE proc_2;
   PROCEDURE proc_3;
END;
/
CREATE OR REPLACE PACKAGE BODY hellofrom IS
   PROCEDURE proc_1
   IS
   BEGIN
       DBMS_OUTPUT.PUT_LINE('Hello from Proc 1');
   END proc_1;

   PROCEDURE proc_2
   IS
   BEGIN
     DBMS_OUTPUT.PUT_LINE('Hello from Proc 2');
   END proc_2;

   PROCEDURE proc_3
   IS
   BEGIN
     DBMS_OUTPUT.PUT_LINE('Hello from Proc_3');
   END proc_3;
END;
/

查询1

SELECT object_name, status FROM USER_OBJECTS

<强> Results

| OBJECT_NAME | STATUS |
|-------------|--------|
|   HELLOFROM |  VALID |
|   HELLOFROM |  VALID |

答案 1 :(得分:0)

您的代码缺少包体的END行:

END hellofrom;

但它仍然无法编译,因为您对DBMS_OUTPUT.PUT_LINE的每次调用都不正确。而不是

DBMS_OUTPUT.PUT_LINE(proc_1: 'Hello from Proc 1');

他们应该阅读

DBMS_OUTPUT.PUT_LINE('Hello from Proc 1');

修复所有这三个,你应该在路上。

祝你好运。