【问题标题】:How to show the sql statement result in the screen when it is executed using PL SQL?使用PL SQL执行时,如何在屏幕上显示sql语句结果?
【发布时间】:2014-08-29 21:50:24
【问题描述】:

早上好,

我想使用 PL SQL 代码执行查询,我希望将结果显示给用户,就像他自己执行 SQL 一样。简而言之,我希望结果像往常一样显示在屏幕上。这与其他主题中报告的问题相同:

How to output result of SELECT statement which is executed using native dynamic SQL?

我尝试应用下面链接中建议的解决方案,但没有奏效。这是我的代码无法正常工作:

DECLARE

    cursor_ID  NUMBER;
    tbl_name VARCHAR2(256);
    record_count INTEGER;
    numRows  INTEGER;

    sql_instruction VARCHAR(10000);
    interface_table_name VARCHAR2(50);
    interfaces_record ALL_TABLES%rowtype;
    CURSOR interfaces_cursor IS 
      SELECT table_name, ROW_NUMBER()OVER(ORDER BY 1) record_number,
               COUNT(*)OVER() total_records FROM ALL_TABLES where table_name like '%TBL_%';

    BEGIN

      FOR interfaces_record in interfaces_cursor
      LOOP
        interface_table_name := interfaces_record.table_name;
        IF interfaces_record.record_number = 1 THEN
          sql_instruction := sql_instruction || ' SELECT ''' || interface_table_name || ''' AS TABELA, COUNT(*) AS QTDE_REGISTROS FROM ' || interface_table_name;
        ELSE
          sql_instruction := sql_instruction || ' UNION ALL SELECT ''' || interface_table_name || ''' AS TABELA, COUNT(*) AS QTDE_REGISTROS FROM ' || interface_table_name;
        END IF;
      END LOOP;
      dbms_output.put_line('SQL: ' || sql_instruction);
      --EXECUTE IMMEDIATE sql_instruction; --this don't show the result on the screen

      -- THIS PART BELLOW IS WHAT I DID TO TRY SHOW THE RESULT ON THE SCREEN
      cursor_ID := DBMS_SQL.OPEN_CURSOR;

      DBMS_SQL.PARSE(cursor_ID, sql_instruction, DBMS_SQL.native);
      DBMS_SQL.DEFINE_COLUMN(cursor_ID, 1, tbl_name, 256);
      DBMS_SQL.DEFINE_COLUMN(cursor_ID, 2, record_count);

      numRows := DBMS_SQL.EXECUTE(cursor_ID);
      LOOP
            IF DBMS_SQL.FETCH_ROWS(cursor_ID) = 0 THEN
                 EXIT;
            END IF;

            DBMS_SQL.COLUMN_VALUE(cursor_ID, 1, tbl_name);
            DBMS_SQL.COLUMN_VALUE(cursor_ID, 2, record_count);

            --DBMS_OUTPUT.PUT_LINE(tbl_name || ' ' || record_count);
      END LOOP;

      EXCEPTION
            WHEN OTHERS THEN
                      RAISE;
            DBMS_SQL.CLOSE_CURSOR(cursor_ID);
    END;

您知道为什么我的代码没有在屏幕上显示结果吗?我将不胜感激。谢谢。

【问题讨论】:

  • 您评论了DBMS_OUTPUT.PUT_LINE。这样它不会做任何事情。

标签: sql plsql screen


【解决方案1】:

使用 DBMS_OUTPUT.PUT_LINE 以在屏幕上获取结果 :) 或在脚本末尾使用 / ......如果您的脚本有任何错误,那么有时它也不会显示结果或显示任何错误在这种情况下最好使用 Exeption..

【讨论】:

  • 对不起,我想我不清楚。简而言之,我希望结果显示在 SQL Developer 的“查询结果”窗口中,而不是“Dbms 输出”窗口中。有没有办法使用 PL SQL 执行查询并在“查询结果”窗口中显示该查询的结果?谢谢。
【解决方案2】:

如果在 SQL*Plus 中执行 PL/SQL 代码,您需要 SET SERVEROUTPUT ON 并取消注释/包含 DBMS_OUTPUT.PUT_LINE 语句。

您可以在单个 SQL 语句中获得相同的结果

SELECT table_name
      ,to_number
         (extractvalue
            (xmltype
               (dbms_xmlgen.getxml
                  ('SELECT count(*) c FROM ' || owner || '.' || table_name)
               )
            ,'/ROWSET/ROW/C'
            )
         ) Count
  FROM all_tables
 WHERE table_name LIKE '%TBL_%'

【讨论】:

  • 对不起,我想我不清楚。简而言之,我希望结果显示在 SQL Developer 的“查询结果”窗口中,而不是“Dbms 输出”窗口中。有没有办法使用 PL SQL 执行查询并在“查询结果”窗口中显示该查询的结果?谢谢。
  • 您可以执行我所说的查询,这些结果将显示在“查询结果”窗口中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-29
  • 1970-01-01
  • 2019-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多