我应该解决以下问题:
创建一个名为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"期待以下之一:
开始函数编译指示程序
我以为我放了一个功能。不确定是什么错误。
答案 0 :(得分:1)
您不需要该过程的任何参数,并且您没有使用局部变量,因此可以删除它们。你只有一个包体和没有规格 - 你需要一个。 END
语句后的过程名称与签名中的名称不匹配。您需要更正DBMS_OUTPUT.PUT_LINE
语句中的语法错误。
您还需要从proc_2
拨打proc_1
,从proc_3
拨打proc_2
...但是您的作业可以完成。
请记住,当您提交时,您需要添加归因于您使用的答案的归因(根据许可cc by-sa 3.0与attribution 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');
修复所有这三个,你应该在路上。
祝你好运。