COMMIT
名称
COMMIT —— 提交当前的事务。
概要
COMMIT [ WORK ]
描述
COMMIT 命令用于提交当前事务。当这个命令完成后,由事务产生的所有更新操作对于其他事务均可见。如果系统产生崩溃,所提交的更新操作依然永久有效。
参数
WORK
可选的关键字-没有任何作用。
注意
使用 ROLLBACK 命令可以终止一个事务。不在事务的里面执行 COMMIT 命令不会产生任何副作用。
示例
提交当前的事务并且使所有的更改操作永久有效:
COMMIT;
CREATE FUNCTION
名称
CREATE FUNCTION —— 定义一个新的函数,执行此操作之前,要先设置将 PLSQL_MODE 打开,方法如下:
\set PLSQL_MODE ON
概要
CREATE [ OR REPLACE ] FUNCTION name
[ (argname [ IN | IN OUT | OUT ] argtype [ DEFAULT value ]
[, ...]) ]
RETURN rettype
{ IS | AS }
[ declaration; ] [, ...]
BEGIN
statement; [...]
[ EXCEPTION
{ WHEN exception [ OR excepti`on ] [...] THEN
statement; [, ...] } [, ...]
]
END [ name ]
描述
CREATE FUNCTION 命令用于定义了一个新的函数。而 CREATE OR REPLACE FUNCTION 命令既可以创建一个新的函数,也可以用新创建的函数定义替代已存在的函数定义。
如果在命令中包含了模式的名称,那么函数是在指定模式下创建。否则就在当前模式下创建。新创建函数的名称不能和同一模式下任何带有相同参数类型函数的名称相同。然而,带有不同参数类型的函数可以使用相同的函数名称(这种方式称为重载)。(函数的重载是一个 AntDB 的特性,与 Oracle 不兼容)
通过使用 CREATE OR REPLACE FUNCTION 命令,可以更新已存在函数的定义。但是不能用这种方法改变函数的名称或者参数类型(如果进行这样的尝试话,实际上是另外创建一个新的函数)。而且 CREATE OR REPLACE FUNCTION 命令不会改变已存在函数的返回值,除非删除函数后重新创建。
创建函数的用户是新创建函数的所有者。
关于函数的更多信息,参见章节 2.5。
参数
name
要创建函数的名称(可以采用模式限定的方式引用)。
argname
一个参数的名称。参数是通过在函数体内使用这个名称来引用的。
IN | IN OUT | OUT
参数模式。IN 将参数声明为输入参数。这是缺省的情况。 IN OUT 允许参数既可以接收值,也可以返回值。 而 OUT 则指定参数只用于输出。
argtype
函数参数的数据类型。参数类型可以是基本数据类型,带有 %TYPE 的列的类型拷贝,或者是一个用户定义类型,比如嵌套表或者是一个对象类型。对于任何基础数据类型来说,不应该指定长度。例如,应该使用 VARCHAR2 这种形式,而不是 VARCHAR2(10)。
通过使用 tablename.columnname%TYPE 这种形式,可以引用一个列类型。这样当表定义发生改变的时候,可以不用对函数的具体实现进行修改。
DEFAULT value
当调用函数时没有为参数提供值,使用这个参数为输入参数提供一个缺省值。而对于模式为 IN OUT 或者 OUT 的参数来说,可以不指定参数 DEFAULT 的值。
rettype
返回值的数据类型,可以是已列出参数类型中的任何一种。和参数 argtype 一样,对参数 rettype 不应该指定长度。
declaration
变量,类型或者是 REF CURSOR 的声明。
statement
SPL 程序语句。需要注意的是对于一个 DECLARE - BEGIN - END 的代码块来说,它本身就被认为一条 SPL 语句。因此,函数体内部可以包含嵌套代码块。
exception
异常条件的名称,例如 NO_DATA_FOUND,OTHERS 等等。
注意
AntDB 允许进行函数重载;这就是说不同函数只要参数类型不同,就可以使用相同的名称。
如果您是使用 AntDB 命令创建函数、存储过程和触发器,或者执行匿名块语句,您需要将 SQL 语句的最后一个分号“;”替换为反斜杠“/”。
示例
函数 emp_comp 函数把2个数值作为输入参数,然后返回一个计算后的值。使用 SELECT 命令来演示这个函数的使用方法( emp 表格定义见【示例参考表格】)。
\set PLSQL_MODE ON
CREATE OR REPLACE FUNCTION emp_comp (
p_sal NUMBER,
p_comm NUMBER
) RETURN NUMBER
IS
BEGIN
RETURN (p_sal + NVL(p_comm, 0)) * 24;
END;
/
\set PLSQL_MODE OFF
SELECT ename "Name", sal "Salary", comm "Commission", emp_comp(sal, comm)
"Total Compensation" FROM emp;
Name | Salary | Commission | Total Compensation
--------------+--------+-------------------+---------------------------------
SMITH | 800 | | 19200
ALLEN | 1600 | 300 | 45600
WARD | 1250 | 500 | 42000
JONES | 2975 | | 71400
MARTIN | 1250 | 1400 | 63600
BLAKE | 2850 | | 68400
CLARK | 2450 | | 58800
SCOTT | 3000 | | 72000
KING | 5000 | | 120000
TURNER | 1500 | 0 | 36000
ADAMS | 1100 | | 26400
JAMES | 950 | | 22800
FORD | 3000 | | 72000
MILLER | 1300 | | 31200
(14 rows)
函数 sal_range 返回在指定薪水范围内雇员的总数。下面的匿名代码块调用几次函数,其中在前两次调用中使用了参数的缺省值( emp 表格定义见【示例参考表格】)。
\set PLSQL_MODE ON
CREATE OR REPLACE FUNCTION sal_range (
p_sal_min NUMBER DEFAULT 0,
p_sal_max NUMBER DEFAULT 10000
) RETURN INTEGER
IS
v_count INTEGER;
BEGIN
SELECT COUNT(*) INTO v_count FROM emp
WHERE sal BETWEEN p_sal_min AND p_sal_max;
RETURN v_count;
END;
/
\set PLSQL_MODE OFF
SELECT sal_range();
SAL_RANGE
--------------------
14
(1 row)




