Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 我有一个程序,我想比较带来的日期和所需的数据_Oracle_Plsql_Oracle11g - Fatal编程技术网

Oracle 我有一个程序,我想比较带来的日期和所需的数据

Oracle 我有一个程序,我想比较带来的日期和所需的数据,oracle,plsql,oracle11g,Oracle,Plsql,Oracle11g,我写了我有两个名为Gazeted_DAYS的表格和列(Gazeted_DATE,DESCRIPTION)以及PAY_IN_OUT的列(EMP_代码,ATT_DATE)的所有详细信息。请检查我已经粘贴在DBFIDLE中的数据。我想要的输出是这样的 01-JAN-21 The Day of: Present 02-JAN-21 The Day of: Present 03-JAN-21 The Day of: Present 04-JAN-21 The Day

我写了我有两个名为Gazeted_DAYS的表格和列(Gazeted_DATE,DESCRIPTION)以及PAY_IN_OUT的列(EMP_代码,ATT_DATE)的所有详细信息。请检查我已经粘贴在DBFIDLE中的数据。我想要的输出是这样的

01-JAN-21   The Day of:     Present
02-JAN-21   The Day of:     Present
03-JAN-21   The Day of:     Present
04-JAN-21   The Day of:     Present
05-JAN-21   The Day of:     Present
06-JAN-21   The Day of:     Present
07-JAN-21   The Day of:     Present
08-JAN-21   The Day of:     Present
09-JAN-21   The Day of:     Its Holyday two
10-JAN-21   The Day of:     Present

当它与att_date比较时,它在所有具有范围的日期中显示为这样,它应该是外部连接的;大概是这样的:

SQL> declare
  2    descr      varchar2(90);
  3    gz_dt      date;
  4    date1      date :=to_date('2021-01-01','YYYY-MM-DD');
  5    date2      date :=to_date('2021-01-31','YYYY-MM-DD');
  6    vatt_date  date;
  7    vempcode   number;
  8    cursor c_gzdt is
  9      select g.gazzeted_date, g.description, p.att_date, p.emp_code
 10      from pay_in_out p left join gazzeted_days g
 11         on p.att_date = g.gazzeted_date
 12        and gazzeted_date between date1 and date2
 13        and p.emp_code=111
 14      order by p.att_date;
 15  begin
 16    open c_gzdt;
 17    loop
 18      fetch c_gzdt into gz_dt, descr, vatt_date, vempcode ;
 19      exit when c_gzdt%notfound;
 20
 21      if vatt_date = gz_dt then
 22         dbms_output.put_line(vatt_date||' THE DAY OF : '||descr);
 23      else
 24         dbms_output.put_line(vatt_date||' THE DAY OF : '||'PRESENT');
 25      end if;
 26
 27    end loop;
 28    close c_gzdt;
 29  end;
 30  /
导致

01.01.21 THE DAY OF : PRESENT
02.01.21 THE DAY OF : PRESENT
03.01.21 THE DAY OF : PRESENT
04.01.21 THE DAY OF : PRESENT
05.01.21 THE DAY OF : PRESENT
06.01.21 THE DAY OF : PRESENT
07.01.21 THE DAY OF : PRESENT
08.01.21 THE DAY OF : PRESENT
09.01.21 THE DAY OF : Its Holyday two
10.01.21 THE DAY OF : PRESENT
11.01.21 THE DAY OF : PRESENT
12.01.21 THE DAY OF : PRESENT
13.01.21 THE DAY OF : Its Holyday three
14.01.21 THE DAY OF : PRESENT
15.01.21 THE DAY OF : PRESENT
16.01.21 THE DAY OF : Its Holyday four
17.01.21 THE DAY OF : PRESENT
18.01.21 THE DAY OF : PRESENT
19.01.21 THE DAY OF : PRESENT
20.01.21 THE DAY OF : PRESENT
21.01.21 THE DAY OF : Its Holyday five
22.01.21 THE DAY OF : PRESENT
23.01.21 THE DAY OF : PRESENT
24.01.21 THE DAY OF : PRESENT
25.01.21 THE DAY OF : PRESENT
26.01.21 THE DAY OF : Its Holyday six
27.01.21 THE DAY OF : PRESENT
28.01.21 THE DAY OF : PRESENT
29.01.21 THE DAY OF : PRESENT
30.01.21 THE DAY OF : PRESENT
31.01.21 THE DAY OF : PRESENT

PL/SQL procedure successfully completed.

SQL>

截至Oracle Reports问题:完全跳过PL/SQL,并使用稍微修改的游标查询作为报表查询。在第8行中,您仍然会使用参数,很可能是在对象导航器中报表的用户参数下创建的。我推测,Report将从其他地方(如Oracle Forms或Apex或…)获取它们的值。我相信,
ID
也是如此——你真的不想硬编码
111
,是吗

SQL> select p.att_date     ||
  2       ' THE DAY OF : ' ||
  3         case when p.att_date = g.gazzeted_date then g.description
  4              else 'PRESENT'
  5         end result
  6  from pay_in_out p left join gazzeted_days g
  7     on p.att_date = g.gazzeted_date
  8    and gazzeted_date between date '2021-01-01' and date '2021-01-31'
  9    and p.emp_code = 111
 10  order by p.att_date;

RESULT
--------------------------------------------------------------
01.01.21 THE DAY OF : PRESENT
02.01.21 THE DAY OF : PRESENT
03.01.21 THE DAY OF : PRESENT
04.01.21 THE DAY OF : PRESENT
05.01.21 THE DAY OF : PRESENT
06.01.21 THE DAY OF : PRESENT
07.01.21 THE DAY OF : PRESENT
08.01.21 THE DAY OF : PRESENT
09.01.21 THE DAY OF : Its Holyday two
10.01.21 THE DAY OF : PRESENT
<snip>

尊敬的@Littlefoot请您仅提供一件事,您可以帮助我,请我为oracle报告编写代码,同样的事情,您可以指导我如何实现这一点,我在上面编写代码,我在答案底部添加了更多的代码。请看一看。它只是给我第一个结果,意味着只有两个日期之间的第一个记录,而不是所有数据,请检查一次,因为它在第一次返回时退出循环。看来你不明白我在回答中说的话。您根本不需要使用PL/SQL。作为报表的查询,请使用我在编辑答案时发布的SELECT语句(用Oracle报表标记)。您可以更改我的查询吗
select p.att_date     ||
     ' THE DAY OF : ' || 
       decode(p.att_date, g.gazzeted_date, g.description, 'PRESENT') result
from pay_in_out p, gazzeted_days g 
where p.att_date = g.gazzeted_date (+)
  and g.gazzeted_date (+) between date '2021-01-01' and date '2021-01-31'
  and p.emp_code = 111
order by p.att_date;