问题描述
你好,汤姆,
我有一个关于内联函数的问题。
以下语句运行没有问题 (对不起,函数和变量的德语名称)。该功能非常简单,从参考日期sttag中减去12个月,直到它小于比较日btag。
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。这只是一个语法错误还是语义上不可能这样创建一个表?
费勒贝里希特-
ORA-00933: SQL-Befehl wurde nicht korrekt beendet
00933. 00000-“SQL命令未正确结束”
* 原因:
* 行动:
许多问候
奥拉夫
我有一个关于内联函数的问题。
以下语句运行没有问题 (对不起,函数和变量的德语名称)。该功能非常简单,从参考日期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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




