【IT168 Oracle】Oracle 11g中PL/SQL新增了很多特性,在性能和易用性方面做了不少的提升,还有一些功能性的增强。
首先提一下函数的指定参数的调用。
在11g以前,如果一个函数在SQL中被调用的话,那么不能通过指定参数的方式。如果一个函数有10个输入参数,前面9个都可以使用默认值,只有最后一个需要指定,在11g以前,如果函数在SQL中使用,那么必须把前面9个参数补齐。没有办法通过指定参数的方法调用。
SQL> CREATE OR REPLACE FUNCTION F_TEST 2 ( 3 P1 IN NUMBER DEFAULT 0, 4 P2 IN NUMBER DEFAULT 0, 5 P3 IN NUMBER DEFAULT 0 6 ) RETURN NUMBER AS 7 BEGIN 8 RETURN 0; 9 END; 10 / 函数已创建。 SQL> SELECT F_TEST, F_TEST(1), F_TEST(1, 1), F_TEST(1, 1, 1) FROM DUAL; F_TEST F_TEST(1) F_TEST(1,1) F_TEST(1,1,1) ---------- ---------- ----------- ------------- 0 0 0 0 SQL> SELECT F_TEST(P3 => 1) FROM DUAL; SELECT F_TEST(P3 => 1) FROM DUAL *第 1 行出现错误: ORA-00907: 缺失右括号 SQL> SELECT * FROM V$VERSION; BANNER ---------------------------------------------------------------- Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod PL/SQL Release 10.2.0.1.0 - Production CORE 10.2.0.1.0 Production TNS for 32-bit Windows: Version 10.2.0.1.0 - Production NLSRTL Version 10.2.0.1.0 - Production
不过在11g中,这个限制不再存在,调用函数变得更加方便:
SQL> CONN YANGTK/yangtk@ORA11G已连接。 SQL> CREATE OR REPLACE FUNCTION F_TEST 2 ( 3 P1 IN NUMBER DEFAULT 0, 4 P2 IN NUMBER DEFAULT 0, 5 P3 IN NUMBER DEFAULT 0 6 ) RETURN NUMBER AS 7 BEGIN 8 RETURN 0; 9 END; 10 / 函数已创建。 SQL> SELECT F_TEST(P3 => 1) FROM DUAL; F_TEST(P3=>1) ------------- 0 SQL> SELECT F_TEST(P1 => 1, P2 => 2, P3 => 3) FROM DUAL; F_TEST(P1=>1,P2=>2,P3=>3) ------------------------- 0 SQL> SELECT F_TEST(1, P3 => 3) FROM DUAL; F_TEST(1,P3=>3) --------------- 0 SQL> SELECT * FROM V$VERSION; BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production PL/SQL Release 11.1.0.6.0 - Production CORE 11.1.0.6.0 Production TNS for Linux: Version 11.1.0.6.0 - Production NLSRTL Version 11.1.0.6.0 - Production
Oracle另外增加的一个新功能是添加了CONINUE语句:
SQL> CREATE OR REPLACE FUNCTION F_MULTI (P_IN1 IN NUMBER, P_IN2 IN NUMBER) RETURN NUMBER AS 2 V_RETURN NUMBER DEFAULT 1; 3 BEGIN 4 FOR I IN P_IN1..P_IN2 LOOP 5 IF I = 0 THEN 6 CONTINUE; 7 END IF; 8 V_RETURN := V_RETURN * I; 9 END LOOP; 10 RETURN V_RETURN; 11 END; 12 / 函数已创建。 SQL> SELECT F_MULTI(-4, 2) FROM DUAL; F_MULTI(-4,2) ------------- 48
这里不用CONTINUE语句也很容易实现,不过用CONTINUE更加自然一些。这里除了可以使用CONTINUE语句,还可以利用CONTINUE WHEN语句:
SQL> CREATE OR REPLACE FUNCTION F_MULTI (P_IN1 IN NUMBER, P_IN2 IN NUMBER) RETURN NUMBER AS 2 V_RETURN NUMBER DEFAULT 1; 3 BEGIN 4 FOR I IN P_IN1..P_IN2 LOOP 5 CONTINUE WHEN I = 0; 6 V_RETURN := V_RETURN * I; 7 END LOOP; 8 RETURN V_RETURN; 9 END; 10 / 函数已创建。 SQL> SELECT F_MULTI(-4, 2) FROM DUAL; F_MULTI(-4,2) ------------- 48