如何将此 pl/sql 更改为函数?

Posted

技术标签:

【中文标题】如何将此 pl/sql 更改为函数?【英文标题】:How can I change this pl/sql to a function? 【发布时间】:2020-11-21 20:14:40 【问题描述】:

我正在完成一本小册子中的练习,因为我刚刚在 Oracle 中学习 PL/SQL,它希望我把它变成一个函数,我不知道我怎么能,因为它不是一个存储过程,至少我不知道'认为它是,并且没有要进行的计算......有什么想法我应该做什么?

DECLARE
my_stdate LEASE.STDATE%TYPE;
my_enddate LEASE.ENDDATE%TYPE;
my_property_no LEASE.PROPERTY_NO%TYPE;

BEGIN
SELECT stdate, enddate, property_no
INTO my_stdate, my_enddate, my_property_no
FROM lease
WHERE lease_no = '&enter_lease_no';
DBMS_OUTPUT.PUT_LINE('Property '||my_property_no||' was leased from '||my_stdate||' and '||my_enddate);
END;
/

【问题讨论】:

【参考方案1】:

替换变量 &enter_lease_no 是输入,DBMS_OUTPUT.PUT_LINE(...) 是 PL/SQL 匿名块的输出。

要使其成为函数,请将租约号作为参数(而不是替换变量)传入,并返回要输出的字符串值。

CREATE FUNCTION test_function(
  enter_lease_no IN LEASE.LEASE_NO%TYPE
) RETURN VARCHAR2
IS
  my_stdate      LEASE.STDATE%TYPE;
  my_enddate     LEASE.ENDDATE%TYPE;
  my_property_no LEASE.PROPERTY_NO%TYPE;
BEGIN
  SELECT stdate, enddate, property_no
  INTO my_stdate, my_enddate, my_property_no
  FROM lease
  WHERE lease_no = enter_lease_no;

  RETURN 'Property '||my_property_no||' was leased from '||my_stdate||' and '||my_enddate;
END;
/

然后可以使用:

BEGIN
  DBMS_OUTPUT.PUT_LINE( test_function( '&enter_lease_no' ) );
END;
/

【讨论】:

我认为值得指出的是,该函数也可以用于直接 SQL 查询:SELECT TEST_FUNCTION('&enter_lease_no') from dual。 (以免初学者认为您的示例是调用函数的唯一方法)。还值得指出的是,在任一示例中,对函数的调用仍取决于替换变量作为输入,并且 1)该替换变量是 sqlplus 构造,以及 2)还有其他提供该值的方法。所有,只是为了让 OP 明白,除了这些简单的示例之外,还有更多使用函数的方法。 :-)

以上是关于如何将此 pl/sql 更改为函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在选择语句的“NOT IN”子句中使用逗号分隔的字符串列表作为 pl/sql 存储的函数参数

如何在返回 SELF 的 pl/sql 对象类型的函数中链接调用

如何根据 PL/SQL 变量值检查输入参数值是不是存在作为列表?

PL/SQL - 如何检查是不是正在使用包/过程/函数?

PL/SQL 函数中的 XmlRoot、XmlElement、InsertChildXml 给出 PLS-00201 必须声明标识符

去掉 PL/SQL 函数末尾的逗号 [Oracle PL/SQL]