我的功能有问题。我需要一张包含月份日期、日期名称和该月份工作日数量的表格。我已经在这里找到了一些帮助并对其进行了调整以适应我的需要,但是我无法运行/编译该函数这是我目前所拥有的:
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 没有运行英文,因此错误已被翻译,所以我希望猜对了。