如何仅使用列作为1行到1行中的参数返回Oracle

时间:2017-03-11 14:31:28

标签: sql oracle function plsql

我写了这个函数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行。

tvaluenoffriends列可能包含重复值。

功能代码可能完全不同。

我怎么能做到?

另一个例子是:我如何自己制作ABS功能?

如何在PL / SQL上创建ABS功能?

这里解释了这个功能:

ABS function

提前致谢!

1 个答案:

答案 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;