【发布时间】:2012-09-18 00:14:29
【问题描述】:
我的函数有问题。 我需要一张包含月份日期、日期名称和该月份工作日数量的表格。 我已经在这里找到了一些帮助并根据我的需要进行了调整,但是我无法运行/编译该函数 这是我目前所拥有的:
create or replace TYPE DATE_ROW AS OBJECT
(
MyDate DATE,
Dayname VARCHAR2(12),
Amount Integer
)
create or replace TYPE DATE_TABLE as table of DATE_ROW
create or replace FUNCTION myfinaldays (mydate date)
RETURN DATE_TABLE
PIPELINED
IS
V_MYDATE DATE;
V_DAYNAME VARCHAR2(12);
V_AMOUNT NUMBER;
BEGIN
with this_month as (
select trunc(to_date('mydate'), 'mm')+level-1 dy
from dual
connect by level < (trunc(add_months(to_date('mydate'),1), 'mm')- trunc(to_date('mydate'), 'mm'))+1
)
FOR i IN 0 .. (select count(*) from this_month) LOOP
select (dy) Daydate,
to_char(dy, 'day'), Dayname,
( select count(*)
from this_month
where to_char(dy, 'dy') not in ('sat', 'sun')
) Amount
from this_month
where to_char(dy, 'dy') not in ('sat', 'sun')
and EXTRACT(day from to_date(dy)) = i;
pipe row (date_row(v_mydate,v_dayname, v_amount));
END LOOP;
RETURN;
END;
函数调用将类似于:
select * from date_table(cast(myfinaldays('01.02.12')));
我只能给出一个日期作为参数。
我希望有人可以在这里帮助我,因为这让我慢慢发疯。 任何想法、示例或想法将不胜感激。
更新:
好的,这里是 mybe 的更新,为我的问题提供了一些更有用的信息:
这是有效的,我的目标是把它放在一个函数中,这样我就可以用 1 个参数调用它:
with this_month as (
select trunc(to_date('01.02.12'), 'mm')+level-1 dy
from dual
connect by level < (trunc(add_months(to_date('01.02.12'),1), 'mm')- trunc(to_date('01.02.12'), 'mm'))+1
)
select (dy) mydate, (select count(*) from this_month) Days_in_month
, to_char(dy, 'day') Dayname
, ( select count(*) from this_month where to_char(dy, 'dy') not in ('sat', 'sun') ) Amount
from this_month
where to_char(dy, 'dy') not in ('sat', 'sun') ;
对于我在最后添加的循环:'and EXTRACT(day from to_date(dy))=i'。
我添加了一个日期,这样你就可以看到我最后需要什么。如果我改写 mydate 并在开发人员中运行它后输入 01.02.12 作为参数,它仍然可以工作。
编译时出现的错误: - 错误(10,1): PL/SQL: SQL 语句被忽略
- Error(15,5): PL/SQL: ORA-00928: Keyword SELECT missing
- Error(22,8): PLS-00113: END-Definer 'LOOP' must complete 'myfinaldays' in row 1, comlumn 10
- Error(23,4): PLS-00103: Found the symbol "RETURN"
由于我的Oracle没有运行英文,所以错误被翻译,所以我希望猜对了。
【问题讨论】:
-
您是在编译或调用函数时遇到错误;无论哪种方式,你会得到什么错误?我不认为您可以使用
with子句作为for循环的“输入”,因为您正在混合SQL 和PL/SQL。您可能需要构建一个 PL/SQL 表来保存生成的日期。但对于初学者来说,to_date('mydate');mydate已经是一个日期,而'mydate'是一个与之无关的字符串...