还在用SELECT COUNT统计数据库表的行数?Out了
【摘要】 在ABAP里我们如果想用代码获得一个数据库表里有多少条记录,常规做法是使用SELECT COUNT。如果您使用的是HANA数据库,现在有一种新的办法可以达到同样的目的。HANA数据库里有一张名为m_tables的系统视图,里面存放了数据库表的元数据。这个系统视图的详细说明参考SAP帮助文档。我写了一个工具,可以通过查询m_tables来批量获得一系列数据库表的记录条数和占据的存储空间。您可以...
在ABAP里我们如果想用代码获得一个数据库表里有多少条记录,常规做法是使用SELECT COUNT。
如果您使用的是HANA数据库,现在有一种新的办法可以达到同样的目的。HANA数据库里有一张名为m_tables的系统视图,里面存放了数据库表的元数据。
这个系统视图的详细说明参考SAP帮助文档。
我写了一个工具,可以通过查询m_tables来批量获得一系列数据库表的记录条数和占据的存储空间。
您可以通过这个链接获得我的工具的源代码。
在表DBCON里维护一条记录,指向HANA数据库。con_ENV里填入HANA数据库的主机名和端口号。如vmXXXX:30015
DATA: ls_new TYPE DBCON.
ls_new-con_name = 'HAN'.
ls_new-dbms = 'HDB'.
ls_new-user_name = 'system'.
ls_new-password = 'Sap12345'.
ls_new-con_env = 'vml2018:30015'.
CALL FUNCTION 'DBCON_INSERT'
EXPORTING
DBCON_WORKAREA = ls_new
EXCEPTIONS
DBCON_KEY_EXISTS = 1
SECURE_STORE_KEY_EXISTS = 2
SECURE_STORE_OTHER = 3
OTHERS = 4
.
IF SY-SUBRC = 0.
WRITE:/ 'Insert Successfully'.
ENDIF.
然后使用ABAP代码创建一个新的table,插入三条entry进行,再读出来,最后删除table.
TYPES:
BEGIN OF result_t,
key TYPE i,
value TYPE string,
END OF result_t.
DATA: connection TYPE dbcon-con_name VALUE 'HAN',
stmt_ref TYPE REF TO cl_sql_statement,
cx_sql_exception TYPE REF TO cx_sql_exception,
lv_text TYPE string,
res_ref TYPE REF TO cl_sql_result_set,
d_ref TYPE REF TO DATA,
result_tab TYPE TABLE OF result_t,
result_line TYPE result_t,
row_cnt TYPE i,
con_ref TYPE REF TO cl_sql_connection.
con_ref = cl_sql_connection=>get_connection( connection ).
stmt_ref = con_ref->create_statement( ).
TRY.
stmt_ref->execute_ddl( 'CREATE TABLE I042416_TESTPROC_TAB( key INT PRIMARY KEY, value NVARCHAR(255) )' ).
stmt_ref->execute_update( 'INSERT INTO I042416_TESTPROC_TAB VALUES(1, ''First value'' )' ).
stmt_ref->execute_update( 'INSERT INTO I042416_TESTPROC_TAB VALUES(2, ''Second value'' )' ).
stmt_ref->execute_update( 'INSERT INTO I042416_TESTPROC_TAB VALUES(3, ''Third value'' )' ).
res_ref = stmt_ref->execute_query( 'SELECT * FROM I042416_TESTPROC_TAB' ).
GET REFERENCE OF result_tab INTO d_ref.
res_ref->set_param_table( d_ref ).
row_cnt = res_ref->next_package( ).
stmt_ref->execute_ddl( 'DROP TABLE I042416_TESTPROC_TAB' ).
CATCH cx_sql_exception INTO cx_sql_exception.
lv_text = cx_sql_exception->get_text( ).
WRITE:/ 'Error:' , lv_text.
ENDTRY.
LOOP AT result_tab INTO result_line.
WRITE:/ 'Key:' , result_line-key, ' Value:', result_line-value.
ENDLOOP.
Java实现类似:
public static void main(String[] args) {
try
{
Class.forName("com.sap.db.jdbc.Driver");
System.out.println("Create a connection...");
con = (com.sap.db.jdbc.trace.Connection) DriverManager
.getConnection("jdbc:sap://<HANA数据库主机名>:30015",// ,
"system", "此处填入登录密码");
cs = (com.sap.db.jdbc.trace.CallableStatement) con.prepareCall("call I042416_two_par(NULL, NULL)");
cs.execute();
int index = 0;
do
{
int rowCount = 0;
com.sap.db.jdbc.trace.ResultSet rs = (com.sap.db.jdbc.trace.ResultSet)cs.getResultSet();
ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();
while (rs != null && rs.next())
{
for (int i = 1; i <= columnCount; i++)
{
System.out.print(rs.getString(i) + " ");
if (i == columnCount)
{
System.out.println();
}
}
System.out.println("Current Result Set Index:" + index + " Row Count: " + rowCount++);
}
System.out.println("Result Set Index: " + index++);
} while(cs.getMoreResults());
}
console打印结果:数据能够成功通过JDBC从HANA数据库读取出来。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)