Dan*_*ffe 3 sql oracle plsql function package
我正在尝试创建一个包含四个函数的包.每个函数将添加一组数字并从总数中减去一个.我在使语法正确方面遇到了很多麻烦.下面的函数自己工作,我尝试在最后调用第一个函数.
当我尝试创建包时,我得到一个错误,在第7行,"遇到符号"END"时期望以下之一:开始函数编译指示程序子类型类型当前游标删除存在于0.05秒之前"
在包体中,它表示"名称已被现有对象使用".我不明白,因为它必须在包的规范中声明,并且如果错误是已经存在名为functionbyfour的包,则创建或替换应解决此问题.
最后,当我尝试在包中使用一个函数时,它会说"遇到符号"BEGIN"时需要以下其中一个:: =.(@%; not null range default character符号";"代替"BEGIN"继续.ORA-06550:第5行,第43栏:PLS-00103:遇到以下其中一项时遇到符号"FROM":.(*%&= - +; </> at in是mod余数不是rem <>或!=或〜=> = <= <>和/或喜欢喜欢2喜欢...之间的|| multiset me".
我使用的是ORACLE EXPRESS 11g版,是PL/SQL的新手(4周).
任何输入都非常感谢.
CREATE OR REPLACE FUNCTION functionbyfour AS
FUNCTION functone( first number, second number) RETURN NUMBER ;
FUNCTION functtwo( first number, second number, third number) RETURN NUMBER ;
FUNCTION functthree(first number, second number, third number, fourth number) RETURN NUMBER ;
FUNCTION functfour( first number, second number, third number, fourth number,fifth number) RETURN NUMBER ;
END functionbyfour;
/
CREATE OR REPLACE PACKAGE functionbyfour AS
FUNCTION functone (first number, second number ) RETURN number AS total number;
BEGIN
total:=first + second – 1;
RETURN total;
DBMS_OUTPUT.PUT_LINE(total);
END functone;
FUNCTION functtwo (first number, second number, third number ) RETURN number AS total number;
BEGIN
total:=first + second + third – 1;
RETURN total;
DBMS_OUTPUT.PUT_LINE(total);
END functtwo;
FUNCTION functthree (first number, second number,third number, fourth number ) RETURN number AS total number;
BEGIN
total:=first + second + third + fourth – 1;
RETURN total;
DBMS_OUTPUT.PUT_LINE(total);
END functthree;
FUNCTION functfour (first number, second number, third number, fourth number, fifth number ) RETURN number AS total number;
BEGIN
total:=first + second + third + fourth + fifth – 1;
RETURN total;
DBMS_OUTPUT.PUT_LINE(total);
END functfour;
Run Code Online (Sandbox Code Playgroud)
/
BEGIN
SELECT functionbyfour.functone(1,2) FROM DUAL;
END;
Run Code Online (Sandbox Code Playgroud)
/
您需要创建一个名为FunctionByFour(CREATE OR REPLACE PACKAGE)的包
SQL> ed
Wrote file afiedt.buf
1 CREATE OR REPLACE PACKAGE functionbyfour AS
2 FUNCTION functone( first number, second number) RETURN NUMBER ;
3 FUNCTION functtwo( first number, second number, third number) RETURN NUMBER ;
4 FUNCTION functthree(first number, second number, third number, fourth number) RETURN NUMBER ;
5 FUNCTION functfour( first number, second number, third number, fourth number,fifth number) RETURN NUMBER ;
6* END functionbyfour;
7 /
Package created.
Run Code Online (Sandbox Code Playgroud)
然后是一个相应的包体(CREATE OR REPLACE PACKAGE BODY).你还需要一个END包体(现在,你的代码在第四个函数的末尾结束)
SQL> ed
Wrote file afiedt.buf
1 CREATE OR REPLACE PACKAGE BODY functionbyfour AS
2 FUNCTION functone (first number, second number ) RETURN number AS total number;
3 BEGIN
4 total:=first + second - 1;
5 RETURN total;
6 DBMS_OUTPUT.PUT_LINE(total);
7 END functone;
8 FUNCTION functtwo (first number, second number, third number ) RETURN number AS total number;
9 BEGIN
10 total:=first + second + third - 1;
11 RETURN total;
12 DBMS_OUTPUT.PUT_LINE(total);
13 END functtwo;
14 FUNCTION functthree (first number, second number,third number, fourth number ) RETURN number AS total number;
15 BEGIN
16 total:=first + second + third + fourth - 1;
17 RETURN total;
18 DBMS_OUTPUT.PUT_LINE(total);
19 END functthree;
20 FUNCTION functfour (first number, second number, third number, fourth number, fifth number ) RETURN number AS total number;
21 BEGIN
22 total:=first + second + third + fourth + fifth - 1;
23 RETURN total;
24 DBMS_OUTPUT.PUT_LINE(total);
25 END functfour;
26* END functionbyfour;
SQL> /
Package body created.
Run Code Online (Sandbox Code Playgroud)
完成后,您可以使用该功能
SQL> SELECT functionbyfour.functone(1,2) FROM DUAL;
FUNCTIONBYFOUR.FUNCTONE(1,2)
----------------------------
2
Run Code Online (Sandbox Code Playgroud)
如果你想把SELECT语句放在一个PL/SQL块中,你需要声明一个局部变量并做一个SELECT INTO用函数的结果填充局部变量(你也可以只分配局部变量的结果)函数调用,无需使用a SELECT).
SQL> ed
Wrote file afiedt.buf
1 DECLARE
2 l_result NUMBER;
3 BEGIN
4 -- First approach
5 l_result := functionByFour.functOne(1,2);
6 dbms_output.put_line( l_result );
7 -- Second approach
8 SELECT functionByFour.functOne(1,2)
9 INTO l_result
10 FROM dual;
11 dbms_output.put_line( l_result );
12* END;
13 /
2
2
PL/SQL procedure successfully completed.
Run Code Online (Sandbox Code Playgroud)
此外,请注意,DBMS_OUTPUT.PUT_LINE在您的RETURN陈述后添加一个是毫无意义的.永远无法达到该代码.如果要将结果打印到DBMS_OUTPUT缓冲区,则需要先将结果打印到缓冲区RETURN.
| 归档时间: |
|
| 查看次数: |
29025 次 |
| 最近记录: |