如何从sql过程打印结果?

我正在编写一个过程来对数据库中每个表中的行进行计数。到目前为止看起来像这样:

create or replace procedure count_database_rows()
dynamic result sets 1
P1: begin atomic
DeclARE stmt CHAR(40);--
  FOR v1 AS
      c1 CURSOR FOR
   SELECT TABLE_SCHEMA,TABLE_NAME FROM sysibm.tables
    DO
       SET stmt = 'SELECT COUNT(*) FROM '||TABLE_SCHEMA||'.'||TABLE_NAME;--
       PREPARE s FROM stmt;--
       EXECUTE s;--
  END FOR;--
end P1
~

但是,当我运行它时:

db2 -ntd~ -f script.sql > dump.csv

我所得到的是:

DB20000I  The SQL command completed successfully.

我该如何打印所有结果?

qq845402721 回答:如何从sql过程打印结果?

仅用于演示。我认为,这是一项教育任务,它是LUW的Db2。

仅用于LUW系统的非DPF Db2

bidirectional_1

对于LUW系统的任何Db2

对于DPF系统来说有些棘手,但也可行。我们必须将softmax: (None,20,64) Bidirectional: (None,64) 语句中不允许的代码包装到存储过程中。

keras.layers.dot([y,flow_features],axes=[2,2])
,

如果Db2服务器在Linux / Unix / Windows上运行,则可以使用DBMS_OUT.PUT_LINE函数将诊断输出从SQL例程发送到控制台。这个想法是,在您的例程中,您给变量分配了一些文本(例如,表名及其计数),然后调用DBMS_OUTPUT.PUT_LINE(...)使该文本出现在控制台上。这种方法的缺点是,仅在例程完成后才显示输出。这通常不是您想要的,有时您希望在行计数可用时查看它们,因此请考虑使用其他方法,如下所示。

要查看带有Db2 CLP(或db2cmd.exe)的DBMS_OUTPUT.PUT_LINE输出,首先需要在调用该过程之前使用set serveroutput on

但是对于诸如此类的简单操作,存储过程可能不合适,因为在连接到数据库后,您可以使用CLP分两步来完成工作。出于脚本目的,这通常更方便。这样的想法是,您创建一个文件来生成查询,当您使用CLP运行时会创建另一个文件,然后执行第二个文件以获得所需的结果。

示例

创建包含生成实际查询的查询的文件gen_counts.sql,例如gen_counts.sql可能包含

select 'select count(*) from '||rtrim(tabschema)||'.'||rtrim(tabname)||' with ur;' from syscat.tables;

然后您可以执行以下步骤:

db2 connect to $database
db2 -txf gen_counts.sql > count_queries.sql
db2 -tvf count_queries.sql > count_results.txt

请注意,当脚本继续运行时,可以通过另一个Shell会话读取输出文件(在这种情况下为count_results.txt)。如果需要,还可以将输出通过管道传输到并发作业。

但是,经验丰富的DBA可以避免以这种方式对所有表进行行计数,而是可以选择确保所有表的运行状态始终是最新的,并接受最近的 estimates 行计数,runstats完成后在SYSCAT.TABLES.CARD中可见。如果统计信息是最新的,那么CARD计数通常足够好用于许多用途。如果需要精确计数,则通常在数据库处于活动状态时才对特定时间戳有效。

本文链接:https://www.f2er.com/3152511.html

大家都在问