Oracle PL/SQL:如何根据同一记录的 ID 字段返回字符串值?

Posted

技术标签:

【中文标题】Oracle PL/SQL:如何根据同一记录的 ID 字段返回字符串值?【英文标题】:Oracle PL/SQL: How to return a string value based on an ID field for the same record? 【发布时间】:2017-03-09 21:51:05 【问题描述】:

作为 PL/SQL 的新手,我想编写一个简单的函数,当我输入其关联 ID 值时返回一个字符串值(即,输入一个字段并返回与同一记录关联的另一个字段)。例如,在包含地址和关联 ID 的表中,如果我将“100”(不带引号)传递给函数,则返回“350 Pearl St”。

到目前为止我有:

CREATE OR REPLACE FUNCTION get_term
    (MAJOR_ID_IN IN NUMBER)
    RETURN VARCHAR2
IS
BEGIN
    SELECT t.TERM_NAME
    FROM CV_RELATION r, CV_TERMS t
    WHERE t.TERM_ID = r.MAJOR_ID_IN; --Primary Key linked to Foreign Key
END get_term;

这会返回一个列表;但是,我想要字符串名称,这样我就可以在其他函数中使用它来返回成功消息,而不是返回有点神秘的 ID(例如,“您已成功更新地址 350 Pearl St”与“您已成功更新地址 100')。请注意,我是从另一个表中的外键调用 ID。

【问题讨论】:

【参考方案1】:

试试这个。

我添加了一个返回变量。然后我选择了 INTO 变量。然后我在最后返回了变量。我还删除了无关的表。您没有加入该表,因此会遇到笛卡尔连接,但无论如何都不需要它,因为输入变量是您需要的键。

现在,这实际上是不够的。当只有一行返回时,使用 SELECT .. INTO 效果很好。如果没有返回行,则异常。您可以通过捕获此异常并默认返回值来解决此问题。如果返回 >1 行,则异常。您可以通过确保查询被限制为返回不超过一行来解决此问题,例如 FETCH FIRST ROW ONLY(适用于 12c)。

CREATE OR REPLACE FUNCTION get_term
    (MAJOR_ID_IN IN NUMBER)
    RETURN VARCHAR2
IS
    ret_val cv_terms.term_name%type;
BEGIN
    SELECT t.TERM_NAME
    into ret_val
    FROM CV_TERMS t
    WHERE t.TERM_ID = MAJOR_ID_IN; --Primary Key linked to Foreign Key

    return ret_val;
END get_term;   

【讨论】:

完美,谢谢。为了简单和当时的无关性,我没有添加异常(NO_DATA_FOUND 和 TOO_MANY_ROWS),但我会抓住它们。标记为正确。 +1 用于锚定返回变量的数据类型。 (这是否可能会导致问题,因为返回数据类型声明为varchar2,但变量是锚定数据类型?在这种情况下,这无关紧要,因为锚定类型 is @ 987654323@。)+1 也用于讨论潜在的例外情况。干得好! @mathguy 由于在 cv_terms 表中的定义,锚定类型将始终为 varchar2。我也会 +1 你,杜克,但我还不能。 :) 再次感谢。

以上是关于Oracle PL/SQL:如何根据同一记录的 ID 字段返回字符串值?的主要内容,如果未能解决你的问题,请参考以下文章

选择一个Id每天的最新记录 - Oracle pl sql

Oracle PL/SQL 在循环中捕获锁定异常并继续

PL/SQL Oracle 11g 记录组

如何从 Oracle PL/SQL 函数中返回现有表中的记录?

PL/SQL - 如何从连接表中返回单行

有没有更快的方法在 oracle pl/sql 中每周对 120k 条记录执行合并?