Oracle中快速查看表中数据量的PRO*C程序

ORACLE,表,数据量

遇到一个问题 :想得到 ORACLE中 每个表有多少条 数据

 

程序环境是

 

操作系统:UnixWare szstore 5 7.1.3 i386 x86at SCO UNIX_SVR5 65

数据库:Oracle7 Server Release 7.2.3.0.0

各位看官请先不要嫌弃系统古老,再古老的系统,能用的就是好系统^^

程序目的是为了查看系统用户下 各个表的数量

  1. 1、我们知道 查看用户下所有的对象(表)的数据是
SELECT * FROM CAT

或者都可以

SELECT * FROM TAB
备注:
TAB 是当前用户的表及视图; 
TABS 是用户表的存储及数据的分配信息; 
CAT 用户的表、视图、序列信息
2、查看表中的数据是
SELECT COUNT(*) FROM TABLE_NAME

 

那么根据1,2 这2点 可以知道我们只要将1中取出来的表循环取2表的数据,然后按此打印出来就可以得到结果,于是得到程序如下:

/*--------------------------------------------------------------*/
/*程序名:*/
/*功  能:统计*/
/*环  境:UnixWare 7.1.3 i386 x86at SCO UNIX_SVR5 65            */
/*        Pro * C : Release 1.6.9.0.0                           */
/*--------------------------------------------------------------*/
/*--------------------------------------------------------------*/

#include <stdio.h>
#include <string.h>
#include "bsys.h"

EXEC SQL INCLUDE  SQLCA.H;
EXEC SQL INCLUDE  ORACA.H;
EXEC SQL BEGIN    DECLARE SECTION;
         VARCHAR  oracleid[40];
         VARCHAR  sqlstmt[300];
         int     recno;
         char     r_table_name[600][41];
         char     tb_name[41]; 
         char     cur_date[9];              /*当前日期*/
EXEC SQL END      DECLARE SECTION;
EXEC SQL WHENEVER SQLERROR GOTO error;
 
void main(int argc, char *argv[])
{ 
   FILE *fp;
   int i = 0, cnt = 0, len;
   
   /*连接数据库*/
   strcpy(oracleid.arr, "report/system");
   oracleid.len = strlen(oracleid.arr);
   EXEC SQL CONNECT :oracleid;
   /*写入文件*/
   fp = fopen("tj_count.txt", "w");
  /*取出所有表的表名*/
   EXEC SQL SELECT RTRIM(TABLE_NAME)
            INTO   :r_table_name
            FROM   CAT 
            WHERE  TABLE_TYPE = 'TABLE'/*'VIEW'*/;
 /*记录取数时返回的数量*/
   cnt = sqlca.sqlerrd[2];
   printf("总共有%3d个表/n", cnt);
   fprintf(fp, "总共有%3d个表/n", cnt);
   for (i = 0; i < cnt; i++)
   {  
      strncpy(tb_name, r_table_name[i], 30);
      len = strlen(tb_name);
      tb_name[len] = 0;
      sqlstmt.len = sprintf((char*)sqlstmt.arr, "SELECT COUNT(*) FROM %s", tb_name);   
      EXEC SQL PREPARE STMT FROM :sqlstmt;
      EXEC SQL DECLARE S_CUR CURSOR FOR STMT;
      EXEC SQL OPEN S_CUR;
      EXEC SQL FETCH S_CUR INTO :recno;  
      EXEC SQL CLOSE S_CUR;
      printf("%s 共有 %10ld条记录/n", tb_name, recno);
      fprintf(fp , "%s 共有 %10ld条记录/n", tb_name, recno);
   }
   EXEC SQL COMMIT WORK RELEASE;
    fclose(fp);
   return;
   
   error:
      EXEC SQL WHENEVER SQLERROR CONTINUE;
      printf("/nORACLE error detected:/n");
      printf("/n%.70s/n", sqlca.sqlerrm.sqlerrmc);
      EXEC SQL ROLLBACK WORK RELEASE;
      fclose(fp);
      return;
}


 

UNIX下配置编译环境如下
FILE=tj_count.pc

.SUFFIXES: .c .pc

CC=cc
RM=rm

CFLAGS=-I$(BSYS)/libstore -O
LDFLAGS=-L$(LIBHOME) -s
OTHERLIBS=`cat $(ORACLE_HOME)/rdbms/lib/sysliblist`
CLIBS=$(OTHERLIBS)

BSYSLIB=$(BSYS)/libstore/libstore.a

PROC=$(ORACLE_HOME)/bin/proc16
PCCINC=$(ORACLE_HOME)/sqllib/public
PCCFLAGS = include=$(PCCINC) ireclen=132 select_error=no dbms=v6 /
           ltype=none userid=$(USERID) sqlcheck=full oraca=yes

LIBHOME=$(ORACLE_HOME)/lib

LLIBNLSRTL=-lnlsrtl3 -lnlsrtl
LLIBCV6= -lc3v6
LLIBCORE= -lcore3 -lcore
OSNTAB= $(LIBHOME)/osntab.o
LLIBSQLNET=-lsqlnet
NETLIBS= $(OSNTAB) $(LLIBSQLNET)
LLIBORA= -lora
CORELIBS= $(LLIBNLSRTL) $(LLIBCV6) $(LLIBCORE) $(LLIBNLSRTL) /
	$(LLIBCCOREFUND) $(LLIBCORE)

SQLLIBS= -lsql
TTLIBS= $(NETLIBS) $(LLIBORA) $(LLIBSQLNET) $(LIBPLSHACK) $(LLIBORA) /
        $(CORELIBS) $(LDLIBS) $(CLIBS)

PROLDLIBS= $(SQLLIBS) $(TTLIBS)

$(FILE): $(FILE).pc
	$(PROC) $(PCCFLAGS) [email protected]
	$(CC) -c $(CFLAGS) [email protected]
	$(RM) -f [email protected]
	$(CC) $(LDFLAGS) -o $@ [email protected] $(BSYSLIB) $(PROLDLIBS)
	$(RM) -f [email protected]


编译成功,执行生成文件,截图如下内容

image

你可能感兴趣的:(oracle,sql,c,table,include,FP)