最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

SQL*Plus HTML Markup: Preventing Raw HTML Tags from Appearing in Output File - Stack Overflow

programmeradmin2浏览0评论

Output needed in this format:

I am using SQL*Plus to generate an HTML report from an Oracle database using SET MARKUP HTML ON. However, the output file contains raw HTML tags as plain text instead of rendering them properly.

Current Output (Incorrect)

My generated HTML file unexpectedly includes raw HTML tags like this:

'<HTML><HEAD><TITLE>SALES REPORT</TITLE><STYLE>BODY{...};</STYLE></HEAD><BODY><TABLE>'
<html><head><title>Sales Report</title>
<style>
body {background: #ffffff; font-family: Arial, sans-serif;}
table {width: 80%; border-collapse: collapse; margin: 25px auto; font-size: 16px; text- 
align: center;}
th, td {padding: 10px; border: 2px solid #ddd; text-align: center;}
th {background-color: #c90421; color: #ffffff; font-weight: bold;}
tr:nth-child(even) {background-color: #f2f2f2;}
</style>
</head><body><table>

As you can see, the first row is the SQL output treating the HTML tags as text, while the actual HTML table structure appears again correctly.

Expected Output (Correct)

I want only the valid HTML to be written to the file like this:

<html><head><title>Sales Report</title>
<style>
body {background: #ffffff; font-family: Arial, sans-serif;}
table {width: 80%; border-collapse: collapse; margin: 25px auto; font-size: 16px; text- 
align: center;}
th, td {padding: 10px; border: 2px solid #ddd; text-align: center;}
th {background-color: #c90421; color: #ffffff; font-weight: bold;}
tr:nth-child(even) {background-color: #f2f2f2;}
</style>
</head><body><table>

Current SQL*Plus Code

Here’s a simplified version of my script:

SET MARKUP HTML ON SPOOL ON PREFORMAT OFF ENTMAP ON
SPOOL "D:\Reports\sales_report.html"

SELECT '<html><head><title>Sales Report</title>
<style>
body {background: #ffffff; font-family: Arial, sans-serif;}
table {width: 80%; border-collapse: collapse; margin: 25px auto; font-size: 16px; text- 
align: center;}
th, td {padding: 10px; border: 2px solid #ddd; text-align: center;}
th {background-color: #c90421; color: #ffffff; font-weight: bold;}
tr:nth-child(even) {background-color: #f2f2f2;}
</style>
</head><body><table>' FROM dual;

SELECT '<thead><tr>
<th rowspan="2">TOTAL</th>
<th colspan="2">Revenue</th>
<th rowspan="2">New Customers</th>
<th rowspan="2">Total Sales</th>
<th colspan="2">Performance</th>
</tr>
<tr>
<th>REVENUE_PREV</th>
<th>REVENUE_CURRENT</th>
<th>NEW_SIGNUPS</th>
<th>PERFORMANCE_SCORE</th>
</tr></thead><tbody>' FROM dual;

SELECT '</tbody></table></body></html>' FROM dual;

SPOOL OFF;
EXIT;

Output needed in this format:

I am using SQL*Plus to generate an HTML report from an Oracle database using SET MARKUP HTML ON. However, the output file contains raw HTML tags as plain text instead of rendering them properly.

Current Output (Incorrect)

My generated HTML file unexpectedly includes raw HTML tags like this:

'<HTML><HEAD><TITLE>SALES REPORT</TITLE><STYLE>BODY{...};</STYLE></HEAD><BODY><TABLE>'
<html><head><title>Sales Report</title>
<style>
body {background: #ffffff; font-family: Arial, sans-serif;}
table {width: 80%; border-collapse: collapse; margin: 25px auto; font-size: 16px; text- 
align: center;}
th, td {padding: 10px; border: 2px solid #ddd; text-align: center;}
th {background-color: #c90421; color: #ffffff; font-weight: bold;}
tr:nth-child(even) {background-color: #f2f2f2;}
</style>
</head><body><table>

As you can see, the first row is the SQL output treating the HTML tags as text, while the actual HTML table structure appears again correctly.

Expected Output (Correct)

I want only the valid HTML to be written to the file like this:

<html><head><title>Sales Report</title>
<style>
body {background: #ffffff; font-family: Arial, sans-serif;}
table {width: 80%; border-collapse: collapse; margin: 25px auto; font-size: 16px; text- 
align: center;}
th, td {padding: 10px; border: 2px solid #ddd; text-align: center;}
th {background-color: #c90421; color: #ffffff; font-weight: bold;}
tr:nth-child(even) {background-color: #f2f2f2;}
</style>
</head><body><table>

Current SQL*Plus Code

Here’s a simplified version of my script:

SET MARKUP HTML ON SPOOL ON PREFORMAT OFF ENTMAP ON
SPOOL "D:\Reports\sales_report.html"

SELECT '<html><head><title>Sales Report</title>
<style>
body {background: #ffffff; font-family: Arial, sans-serif;}
table {width: 80%; border-collapse: collapse; margin: 25px auto; font-size: 16px; text- 
align: center;}
th, td {padding: 10px; border: 2px solid #ddd; text-align: center;}
th {background-color: #c90421; color: #ffffff; font-weight: bold;}
tr:nth-child(even) {background-color: #f2f2f2;}
</style>
</head><body><table>' FROM dual;

SELECT '<thead><tr>
<th rowspan="2">TOTAL</th>
<th colspan="2">Revenue</th>
<th rowspan="2">New Customers</th>
<th rowspan="2">Total Sales</th>
<th colspan="2">Performance</th>
</tr>
<tr>
<th>REVENUE_PREV</th>
<th>REVENUE_CURRENT</th>
<th>NEW_SIGNUPS</th>
<th>PERFORMANCE_SCORE</th>
</tr></thead><tbody>' FROM dual;

SELECT '</tbody></table></body></html>' FROM dual;

SPOOL OFF;
EXIT;
Share Improve this question edited Mar 16 at 18:05 mhk asked Mar 15 at 12:21 mhkmhk 211 silver badge6 bronze badges
Add a comment  | 

1 Answer 1

Reset to default 1

Don't try to build the HTML manually and combine it automatically generated HTML markup. Use one or the other. Your code is automatically embedding the output of your queries into an automatically generated HTML page so you end up with your HTML embedded as literals into a HTML template.

Using Generating Reports from SQL*Plus, something like:

SET MARKUP HTML ON SPOOL ON PREFORMAT OFF ENTMAP ON -
HEAD "<title>Sales Report</title> -
<style> -
body {background: #ffffff; font-family: Arial, sans-serif;} -
table {width: 80%; border-collapse: collapse; margin: 25px auto; font-size: 16px; text-align: center;} -
th, td {padding: 10px; border: 2px solid #ddd; text-align: center;} -
th {background-color: #c90421; color: #ffffff; font-weight: bold;} -
tr:nth-child(even) {background-color: #f2f2f2;} -
</style>"
   
SPOOL "D:\Reports\sales_report.html"

COLUMN REVENUE_PREV HEADING 'Previous Revenue'
COLUMN REVENUE_CURRENT HEADING 'Current Revenue'
COLUMN NEW_SIGNUPS HEADING 'New Sign-Ups'
COLUMN PERFORNACE_SCORE HEADING 'Performance'

SELECT REVENUE_PREV,
       REVENUE_CURRENT,
       NEW_SIGNUPS,
       PERFORMANCE_SCORE
FROM   your_table;

SPOOL OFF;
EXIT;

Note: Untested, but it should give you the general idea and you can use the reference to look up other, more detailed examples.

发布评论

评论列表(0)

  1. 暂无评论