关于oracle 的一些问题?
发布网友
发布时间:2022-04-28 19:47
我来回答
共3个回答
热心网友
时间:2022-04-08 05:48
看下函数的定义说明:
3.3.13 CREATE FUNCTION
名称
CREATE FUNCTION -- 定义一个新的函数
概要
CREATE [ OR REPLACE ] FUNCTION name
[ (argname [ IN | IN OUT | OUT ] argtype [ DEFAULT value ]
[, ...]) ]
RETURN rettype -- 这里是必须的,不是可选
[ AUTHID { DEFINER | CURRENT_USER } ]
{ IS | AS }
[ declaration; ] [, ...]
BEGIN
statement; [...]
[ EXCEPTION
{ WHEN exception [ OR exception ] [...] THEN
statement; [, ...] } [, ...]
]
END [ name ]
描述
CREATE FUNCTION 命令用于定义了一个新的函数。而CREATE OR REPLACE FUNCTION命令既
可以创建一个新的函数,也可以用新创建的函数定义替代已存在的函数定义。
如果在命令中包含了模式的名称,那么函数是在指定模式下创建。否则就在当前模式下创建。新创
建函数的名称不能和同一模式下任何带有相同参数类型函数的名称相同。然而,带有不同参数类型
的函数可以使用相同的函数名称(我们把这种方式称为重载)。(函数的重载是一个Postgres
Plus Advanced Server 的特性,与Oracle不兼容)。
通过使用CREATE OR REPLACE FUNCTION命令,我们可以更新已存在函数的定义。但是不能用
这种方法改变函数的名称或者参数类型(如果你进行这样的尝试话,实际上是另外创建一个新的函
数)。而且 CREATE OR REPLACE FUNCTION命令不会改变已存在函数的返回值,除非删除函数
后重新创建。
创建函数的用户是新创建函数的所有者。
参数
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不应该指定长度。
DEFINER | CURRENT_USER
用来指定是否能使用函数所有者(DEFINER)或者当前执行函数用户(CURRENT_USER)
的权限来确定是否允许访问在函数中引用的数据库对象。在函数所有者(DEFINER)这种情
况下,使用函数所有者的搜索路径来解析对非限定的数据库对象的引用。同时,在当前执
行函数用户(CURRENT_USER)这种情况下下,是使用当前执行函数用户的搜索路径来解析
对非限定的数据库对象的引用。DEFINER是缺省选项。
declaration
变量,类型或者是REF CURSOR的声明。
statement
SPL程序语句。需要注意的是对于一个DECLARE - BEGIN - END的代码块来说,它本身就被
认为一条SPL语句。因此,函数体内部可以包含嵌套代码块。
exception
异常条件的名称,例如NO_DATA_FOUND, OTHERS等等。
热心网友
时间:2022-04-08 07:06
create table t_test(name varchar2(20),len number(10));
create or replace function f_test
(input1 in number,
input2 in number
) return number
as
begin
return input1+input2;
end f_test;
create or replace procere p_test
(
v_str in varchar2
)
as
begin
insert into t_test(name,len) values(v_str,length(v_str));
commit;
end p_test;
热心网友
时间:2022-04-08 08:41
table
create table T_TEST(a(varchar2(20)),b(number(111)))
function
create or replace function F_TEST(A number,B number)
return number
is
v_c number
begin
v_c:=A+B
return(v_c);
end f_test;
procre
CREATE or replace procre P_TEST(v_str ivarchar2
)
as
begin
insert into t_test(A,B) values(v_str,length(v_str));
end ;