我写了这个函数fexemplo
,如下所示:
select fexemplo(id) from texemplo;
id 是表texemplo的主键。
texemplo如下:
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NOT NULL NUMBER(10)
TVALUE NUMBER(10)
该函数将tvalue
属性中的值加10。
所以如果我们有:
select * from texemplo;
ID TVALUE
---------- ----------
1 20
3 59
然后:
select fexemplo(id) from texemplo;
将要回归:
FEXEMPLO(ID)
------------
30
69
我正在使用的功能代码是:
create or replace function fexemplo (pid IN NUMBER)
RETURN NUMBER
IS
vteste NUMBER(10);
BEGIN
SELECT tvalue
INTO vteste
FROM texemplo
WHERE id=pid;
vteste := vteste+10;
RETURN vteste;
END fexemplo;
/
它工作正常 - 它按预期返回每行的一个结果。但是我希望这个函数是通用的。所以,我希望它可以与其他表一起工作:
Name Null? Type
----------------------------------------- -------- ----------------------------
USERID VARCHAR2(50)
AGE NUMBER(10)
PHOTO BLOB
NOFFRIENDS NUMBER(10)
我想在NOFFRIENDS列中添加10。 我应该能够在另一个表上执行相同的功能。 因此我不能使用id作为参数。功能代码必须完全不同。
我想要使用的参数是NUMBER,所以我可以在两个表上执行它:
select fexemplo(tvalue) from texemplo;
OR
select fexemplo(noffriends) from utable;
返回仍然是1行到1行。
tvalue
和noffriends
列可能包含重复值。
功能代码可能完全不同。
我怎么能做到?
另一个例子是:我如何自己制作ABS功能?
如何在PL / SQL上创建ABS功能?
这里解释了这个功能:
提前致谢!
答案 0 :(得分:3)
你正在调用你的函数......
select fexemplo(id) from texemplo;
...因此您可以避免查询表本身。正如您的问题实际上所说,您需要做的就是将作为输入参数传递的值更改为要修改的列:
select fexemplo(tvalue) from texemplo;
这个版本不仅更简单更明显,而且完全通用;
create or replace function fexemplo (pid IN NUMBER)
RETURN NUMBER
is
begin
return pid + 10;
end;