将 dbms_output 转换为 html 并有选择地抑制其他输出

Convert dbms_output to html and selectively suppress other output

我正在使用下面的代码按预期输出:

DECLARE
    v_ins_param VARCHAR2(10);
    CURSOR c_ins_param IS
      SELECT status
      FROM   v$instance;      
BEGIN
    OPEN c_ins_param;

    LOOP
        FETCH c_ins_param INTO v_ins_param;

        EXIT WHEN c_ins_param%NOTFOUND;

        --
        --  
        --  
        IF v_ins_param = 'OPEN' THEN
        
            DBMS_OUTPUT.PUT_LINE('
' || CHR(35)  || '' || CHR(35)  ||'' || CHR(35)  || '
Great! Your database is up.
' || CHR(35)  || '' || CHR(35)  ||'' || CHR(35)  || '            ');

    ELSIF v_ins_param = 'MOUNTED' THEN
            DBMS_OUTPUT.PUT_LINE('
' || CHR(35)  || '' || CHR(35)  ||'' || CHR(35)  || '
Database is only mounted.
' || CHR(35)  || '' || CHR(35)  ||'' || CHR(35)  || '
');

        ELSE
            DBMS_OUTPUT.PUT_LINE('
' || CHR(35)  || '' || CHR(35)  ||'' || CHR(35)  || '
Database is neither mounted or open.
' || CHR(35)  || '' || CHR(35)  ||'' || CHR(35)  || '
            ');
        END IF;
    END LOOP;

    CLOSE c_ins_param;
END;

/

这是它会给你的输出的“种类”:

###
Great! Your database is up.
###

最终这将是一系列像这样的匿名块“类型化”脚本,我想将其输出到单个文件。

我现在正在尝试让输出仅在 html 输出中提供文本信息。我在另一页上看到了这个,并根据我的代码对其进行了调整,看看它会如何工作:

spool c:mag.html
DECLARE
  CURSOR c1 IS
    SELECT * FROM dept;
BEGIN
  DBMS_OUTPUT.PUT_LINE('< pre >');
  DBMS_OUTPUT.PUT_LINE('< h1 >Report on Databases</h1>');
  FOR mag IN c1 
  LOOP
    EXIT WHEN c1%notfound;
      DBMS_OUTPUT.PUT_LINE('< b >Department Name[/b] =' || mag.dname);
  END LOOP;
END;
/

但是这样做的方式,使用:

mag.dname

不适用于我的 'non for loop' 示例。

我觉得必须有更合适的方式来实现输出。我试过:

上设置标记html

它不仅返回影响输出,而且影响所有代码。

有没有人以前试过这个,也许知道我如何才能得到返回数据的 html 输出?

这是一个示例 - 我将以下内容存储在名为(例如)scr.sql

的脚本中
set termout off
set feedback off
set serverout on
begin
  for i in ( 
    select 
      case 
        when status = 'OPEN' then '<p>Database is open</p>'
        when status = 'MOUNTED' then '<p>Database is mounted</p>'
        else '<p>Database is not happy</p>'
      end status_output
    from v$instance
  )
  loop
    dbms_output.put_line(i.status_output);
  end loop;
end;
.

spool /tmp/status.html
/
spool off

然后 运行 来自 SQLPlus 的

SQL> @scr.sql

我唯一的结果 status.html 是

<p>Database is open</p>