2017-03-09 10 views
0

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

到目前为止,我有:

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。

回答

2

试试这个。

我添加了一个返回变量。然后我选择了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; 
+0

完美,谢谢。为了简单和不相关,我没有添加异常(NO_DATA_FOUND和TOO_MANY_ROWS),但我会抓住它们。标记为正确。 – snl330

+0

+1用于锚定返回变量的数据类型。 (虽然这可能会导致问题,因为返回数据类型被声明为'varchar2',但变量是锚定的数据类型?在这种情况下,因为锚定类型**是**'varchar2',所以无关紧要。 )+1也用于讨论潜在的例外情况。干得不错! – mathguy

+0

@mathguy由于在cv_terms表中的定义,锚定类型将始终为varchar2。我还会为你+1,杜克,但我还不能。 :) 再次感谢。 – snl330

相关问题