我创建了一个交互式报告。我想基于每条记录可用的列链接执行PL / SQL

时间:2015-12-30 16:42:33

标签: oracle-apex

我创建了一个交互式报告。我想基于每条记录可用的列链接执行PL / SQL。例如,该报告包含flight_ID和departure_date列。当用户单击该记录上存在的链接时,使用PL / SQL我想更新/插入到另一个表中,其中包含上述2个列中的当前记录中可用的详细信息。我怎样才能做到这一点?请帮忙。 我有一个plsql块。

BEGIN
   INSERT INTO flight_seats
      WITH seats AS
       (SELECT rownum r FROM dual CONNECT BY LEVEL <= 350)
      SELECT flight_shedule.flight_id,
             flight_shedule.departure_date,
             r seat,
             CASE
                WHEN r BETWEEN start_a AND end_a THEN
                 'A'
                WHEN r BETWEEN start_b AND end_b THEN
                 'B'
                WHEN r BETWEEN start_c AND end_c THEN
                 'C'
             END CLASS,
             900 fare,
             'o' status
        FROM seats, airplane, flight_shedule
       WHERE flight_shedule.airplane_id = airplane.airplane_id;
END;

我怎么能在oracle apex中做到这一点。

2 个答案:

答案 0 :(得分:2)

您可以使用以下网址定义链接:

apex.submit('INSERTSEATS_#FLIGHT_ID#_#DEPARTURE_DATE_STR#');
报告中的

#FLIGHT_ID##DEPARTURE_DATE_STR#引用列别名。列DEPARTURE_DATE_STR是以某种特定方式格式化的出发日期,例如YYYYMMDD。

这将提交页面,其请求值类似于&#34; INSERTSEATS_123_20151231&#34;。

然后,您可以创建在:request like 'INSERTSEATS%'(PL / SQL条件)时触发的提交时页面进程。

此过程需要做的第一件事是解析请求值以找出航班ID和出发日期。您可以使用函数apex_util.string_to_table(:request,'_')将请求字符串拆分为3个元素的数组,即字符串&#39; INSERTSEATS&#39;,航班ID,例如&#39; 123&#39;和出发日期,例如&#39; 20151231&#39;

最后,您可以使用在insert语句中获取的航班ID和出发日期值(首先将日期字符串转换回date值。)

更新

@Drumbeg在评论中指出,您还可以通过apex.submit设置页面项。因此,您的链接可以定义为:

apex.submit
  ({request:"INSERTSEATS", 
    set:{"P1_FLIGHT_ID":#FLIGHT_ID#, 
         "P1_DEPARTURE_DATE_STR":#DEPARTURE_DATE_STR#}
  });

您的提交过程将具有条件Request = INSERTSEATS,并将使用insert语句中的页面项的值。

答案 1 :(得分:0)

这是我过去使用的异步方法。

首先,您需要一些支持变量的页面项。

  • PXXX_DEPARTURE_DATE
  • PXXX_FLIGHT_ID

现在更改列链接,以便触发自定义事件并传递所需的报告行数据。

javascript:$('body').trigger('INSERT_SEATS', {flightId:"#FLIGHT_ID#", departureDate:"#DEPARTURE_DATE_STR#"});

现在根据自定义事件创建动态操作。

  • 事件:自定义
  • 自定义事件:INSERT_SEATS
  • 选择类型:jQuery Selector
  • jQuery Selector:body

此动态操作应该有两个TRUE操作:

  • JavaScript Action(用于设置包含触发器数据的临时页面项,请注意this指的是事件本身。数据包含在事件中)。

    $s('PXXX_FLIGHT_ID', this.data.flightId);
    $s('PXXX_DEPARTURE_DATE', this.data.departureDate);
    
  • PL / SQL操作(参考页面项目并执行DML)。

  • 提醒(可选,但我通常会提醒用户该操作已完成)。

您不必将自定义事件附加到body。它可以附加到页面上的任何DOM节点。因此,例如,如果您的报告区域的静态ID为flightReport,则可以执行$('#flightReport').trigger('INSERT_SEATS', .....)