【问题标题】:Oracle Pl/SQl: custom function with intermediate resultsOracle Pl/SQl:具有中间结果的自定义函数
【发布时间】: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 调用这个函数...

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

【问题讨论】:

    标签: sql oracle function plsql


    【解决方案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 ; 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多