1

我的代码:

Declare 
l_body CLOB;

 l_body := '<html><head><style>tr:last-child {font-weight: bold;}</style></head><body>'

                  ||'<table><tbody>'
                  || '<tr>'

                  || '<th style="font-weight:bold;border: 1px solid black; padding:6px;">Emp</th>'
                  || '<th style="font-weight:bold;border: 1px solid black; padding:6px;">Days</th>'
                  || '<th style="font-weight:bold;border: 1px solid black; padding:6px;">Amount</th>
                  </tr>';    

for r in (select  name, days, amount from employee)

loop
     
      l_body := l_body || '<tr><td style="color:#000000;border: 1px solid black;">';

      l_body_html  :=  l_body_html ||  r.emp || '</td><td style="color:#000000;border: 1px solid black;">'
                     || r.days||  '</td><td style="color:#000000;border: 1px solid black;">'
                     || r.amount||'</td> </tr>';

end loop;

如何动态创建 HTML 表头和行而不是静态列和行?

根据查询,我应该使用从查询和行中选择的列创建 HTML 表。

4

1 回答 1

0

您的表头是在l_body的初始化中设置的。所以你所能做的就是使这个初始化动态化:

代替

     l_body := '<html><head><style>tr:last-child {font-weight: bold;}</style></head><body>'
      ||'<table><tbody>'
      || '<tr>'

      || '<th style="font-weight:bold;border: 1px solid black; padding:6px;">Emp</th>'
      || '<th style="font-weight:bold;border: 1px solid black; padding:6px;">Days</th>'
      || '<th style="font-weight:bold;border: 1px solid black; padding:6px;">Amount</th>
      </tr>'; 

你可以做 :

        l_body := '

          <html>
                <head>
                    <style>tr:last-child {font-weight: bold;}</style>
                </head>
                <body>
                <table>
                    <tbody>
                        <tr>
                            <th style="font-weight:bold;border: 1px solid black; padding:6px;">#Header1#</th>
                            <th style="font-weight:bold;border: 1px solid black; padding:6px;">#Header2#</th>
                            <th style="font-weight:bold;border: 1px solid black; padding:6px;">#Header3#</th>
                        </tr>
        '; 

      l_body := replace(l_body,'#Header1#',WhatEverValue1);
      l_body := replace(l_body,'#Header2#',WhatEverValue2);
      l_body := replace(l_body,'#Header3#',WhatEverValue3);

这假设您事先知道要显示的查询的标题。您必须注意文本的长度。函数 Replace 仅适用于少于 32767 个字符的 clob/varchar。如果文本太长,您必须切换到连接而不是替换(或编写自己的大文本替换函数......),例如:

l_body := l_body || '<th style="font-weight:bold;border: 1px solid black; padding:6px;">' || WhatEverValue || '</th>';

如果你想让它像真正的动态,这将是相当复杂但可行的。方法如下:

  • 为您要使用的每个查询创建一个视图

  • 使用查询读取视图的列名:

     SELECT * FROM USER_TAB_COLUMNS where table_name = upper('MyViewName')
    
  • 并像以前一样重复标题替换......

于 2020-07-20T06:32:02.637 回答