Oracle Pl/SQl:具有中间结果的自定义函数

Posted

技术标签:

【中文标题】Oracle Pl/SQl:具有中间结果的自定义函数【英文标题】:Oracle Pl/SQl: custom function with intermediate results 【发布时间】:2011-02-22 16:41:43 【问题描述】:

我需要使用一些 oracle 内置方法(解析、strlength、...)将字符串转换为数字 我不知道如何为方法内的变量赋值,也不知道将声明部分放在哪里。

CREATE OR REPLACE FUNCTION EXAMPLE (param IN VARCHAR2) 
RETURN NUMBER AS
BEGIN

  SELECT <string_handling_using_param> 
    INTO var 
    FROM DUAL;

  RETURN TO_NUMBER(<some computation using var>);

END EXAMPLE ;

我尝试了一些关于这个函数的变体,比如添加一个 OUT 参数来存储中间变量,但是我不能从常规 SQL 调用这个函数...

关于如何实现这一点的任何建议?

【问题讨论】:

【参考方案1】:

如果我理解正确,您只需要定义“var”变量...

create or replace FUNCTION EXAMPLE (param IN VARCHAR2)
RETURN NUMBER
AS
   var VARCHAR2(100);  -- This datatype may need modification
BEGIN
  select <string_handling>
  into   var
  from   dual;

  return to_number(<some computation using var>);
END EXAMPLE ;

根据您的具体操作,可能会有更好的方法不需要 SELECT ... FROM DUAL:

create or replace FUNCTION EXAMPLE (param IN VARCHAR2)
RETURN NUMBER
AS
   var VARCHAR2(100);  -- This datatype may need modification
BEGIN
  var := <string_handling>;

  return to_number(<some computation using var>);
END EXAMPLE ;

【讨论】:

你救了我的命 :) 至少我的下午。我没有找到放置 'var VARCHAR2(100);' 的位置宣言。非常感谢 !我需要“从双重选择”,因为该过程中涉及到 decode()。 Guillaume,虽然解码存在问题,但请记住,在最近的 ORacle 版本中,CASE 语句可以在简单语句中使用,并且比 DECODE() 更健壮。 var:=case when then when then else end;【参考方案2】:
create or replace FUNCTION EXAMPLE (param IN VARCHAR2) 
RETURN NUMBER AS 
    -- declare section between AS and BEGIN
    var varchar2(100);
BEGIN   
   select <string_handling> into var from dual;  
   -- also note that many built-in functions can be done directly
   -- without calling a select, so in many cases
   -- var := substr(param,1,10) <or some other string handling>;
   -- is perfectly acceptable too. 
   return to_number(<some computation using var>); 
EXCEPTION -- if you need an exception handler
   when value_error then
      <do something with it or set a default return value or whatever>
END EXAMPLE ; 

【讨论】:

以上是关于Oracle Pl/SQl:具有中间结果的自定义函数的主要内容,如果未能解决你的问题,请参考以下文章

Oracle --- PL/SQL

Oracle --- PL/SQL

从 0jdbc6 JDBCthin 驱动程序调用具有自定义对象返回类型的 Oracle PL/SQL 过程

ORACLE当中自定义函数性优化浅析

Oracle存储过程

PL/SQL ORACLE 查询作为结果