【问题标题】:Oracle PL/SQL: How to return a string value based on an ID field for the same record?Oracle PL/SQL:如何根据同一记录的 ID 字段返回字符串值?
【发布时间】: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。

【问题讨论】:

    标签: oracle plsql stored-functions


    【解决方案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 你,杜克,但我还不能。 :) 再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    • 2012-06-12
    相关资源
    最近更新 更多