如何在Oracle中仅将列用作1行到1行返回pl / sql函数中的参数

Posted

技术标签:

【中文标题】如何在Oracle中仅将列用作1行到1行返回pl / sql函数中的参数【英文标题】:How to use only the column as the parameter in a 1 row to 1 row return pl/sql function in Oracle 【发布时间】:2017-03-11 14:31:27 【问题描述】:

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

select fexemplo(noffriends) from utable;

返回还是 1 到 1 行。

tvaluenoffriends 列可能具有重复值。

功能代码可能完全不同。

我怎样才能做到?

另一个例子是:我怎么能自己做一个ABS函数?

如何在 PL/SQL 上实现 ABS 函数?

这里解释了功能:

ABS function

提前致谢!

【问题讨论】:

为什么要编写自己的 ABS() 函数?如果是为了智力挑战要求我们为你写它,那就是被宠坏的东西。 这是一个例子......只是一个例子......我想做另一件事......那是为了说明我的问题......只是它...... 【参考方案1】:

你正在这样调用你的函数......

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;

【讨论】:

这真的是被问到的问题吗?我完全误解了它! 就是这样...很简单...感谢您的关注。

以上是关于如何在Oracle中仅将列用作1行到1行返回pl / sql函数中的参数的主要内容,如果未能解决你的问题,请参考以下文章

oracle pl sql中如何将列数据转置为行

在 C# 中仅将类型作为参数传递

如何在颤动的 5 个元素的列中仅将一个元素居中

如何在 Latex 中仅将一位作者与其他三位作者居中对齐

如何仅将列值插入前一千行

在 ListView 中仅将标题设为粗体