暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 有,内联函数

ASKTOM 2020-07-06
459

问题描述

你好,汤姆,

我有一个关于内联函数的问题。

以下语句运行没有问题 (对不起,函数和变量的德语名称)。该功能非常简单,从参考日期sttag中减去12个月,直到它小于比较日btag。

with  
        function zeitpunkt (sttag in timestamp, btag in timestamp) return timestamp is
        v_zeitpunkt timestamp;
        begin
          v_zeitpunkt := sttag;
          while v_zeitpunkt > btag loop
             v_zeitpunkt := add_months_ts(v_zeitpunkt,-12);
          end loop;

          return v_zeitpunkt;

        end;

  select to_timestamp('01.03.2020','DD.MM.YYYY') stichtag,
         zeitpunkt(to_timestamp('01.03.2020','DD.MM.YYYY'), to_timestamp('11.07.1961','DD.MM.YYYY'))
  from dual      
  ;



STICHTAG ZEITPUNKT (至 _ 时间戳 ('01.03

-----------------------------

01.03.2020 00:00:00,000000000 01.03.1961 00:00:00,000000000

但是,如果我在此语句周围放置一个CREATE表 (或INSERT int),则会收到一些错误消息,例如ORA-00933或ORA-06550。这只是一个语法错误还是语义上不可能这样创建一个表?

create table z_tariferstattungen_flexi as
with  
        function zeitpunkt (sttag in timestamp, btag in timestamp) return timestamp is
        v_zeitpunkt timestamp;
        begin
          v_zeitpunkt := sttag;
          while v_zeitpunkt > btag loop
             v_zeitpunkt := add_months_ts(v_zeitpunkt,-12);
          end loop;
          return v_zeitpunkt;

        end;      

  select to_timestamp('01.03.2020','DD.MM.YYYY') stichtag,
         zeitpunkt(to_timestamp('01.03.2020','DD.MM.YYYY'), to_timestamp('11.07.1961','DD.MM.YYYY'))
  from dual      
  ;



费勒贝里希特-
ORA-00933: SQL-Befehl wurde nicht korrekt beendet
00933. 00000-“SQL命令未正确结束”
* 原因:
* 行动:

许多问候
奥拉夫

专家解答

如果在顶级SELECT语句以外的任何其他语句中使用内联PL/SQL函数,则需要WITH_PLSQL提示。

例如:

create table z_tariferstattungen_flexi as
select /*+ WITH_PLSQL */* from (
with  
  function zeitpunkt (sttag in timestamp, btag in timestamp) return timestamp is
    v_zeitpunkt timestamp;
    begin
      v_zeitpunkt := sttag;
      while v_zeitpunkt > btag loop
         v_zeitpunkt := add_months(v_zeitpunkt,-12);
      end loop;
      return v_zeitpunkt;
    end;
  select to_timestamp('01.03.2020','DD.MM.YYYY') stichtag,
         zeitpunkt(to_timestamp('01.03.2020','DD.MM.YYYY'), to_timestamp('11.07.1961','DD.MM.YYYY'))
  from   dual   
);
/

insert /*+ WITH_PLSQL */into z_tariferstattungen_flexi
with  
  function zeitpunkt (sttag in timestamp, btag in timestamp) return timestamp is
    v_zeitpunkt timestamp;
    begin
      v_zeitpunkt := sttag;
      while v_zeitpunkt > btag loop
         v_zeitpunkt := add_months(v_zeitpunkt,-12);
      end loop;
      return v_zeitpunkt;
    end;
  select to_timestamp('01.03.2020','DD.MM.YYYY') stichtag,
         zeitpunkt(to_timestamp('01.03.2020','DD.MM.YYYY'), to_timestamp('11.07.1961','DD.MM.YYYY'))
  from   dual ;
/

select * from z_tariferstattungen_flexi;

STICHTAG                         ZEITPUNKT(TO_TIMESTAMP('01.03.2020','DD.MM.YYYY'),TO_TIMESTAMP('11.07.1961','DD.MM.YYYY'))   
01-MAR-2020 00.00.00.000000000   01-MAR-1961 00.00.00.000000000                                                                
01-MAR-2020 00.00.00.000000000   01-MAR-1961 00.00.00.000000000 

文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论