如何获取数据库表的行数
Posted
技术标签:
【中文标题】如何获取数据库表的行数【英文标题】:How to get row count of database table 【发布时间】:2011-09-21 13:29:46 【问题描述】:我是 abap 语言的新手,我正在尝试练习内部连接语句,但我不知道如何才能在输出之前获取我的 select 语句的行数。
这就是我想要实现的目标。
<--------------------------------------- >
< total number of rows > Record(s) found |
Column Header 1|Column Header 2 ..
< data
....
retrieved >
<--------------------------------------- >
下面是我的选择语句:
SELECT spfli~carrid scarr~carrname sflight~planetype sflight~fldate sflight~price spfli~cityfrom spfli~cityto
INTO (g_carrid ,g_carrname ,g_planetype,g_fldate ,g_price ,g_cityfrom ,g_cityto) FROM spfli
INNER JOIN sflight
ON spfli~carrid = sflight~carrid AND spfli~connid = sflight~connid
INNER JOIN scarr
ON scarr~carrid = spfli~carrid
WHERE spfli~carrid = s_carrid-low.
WRITE: / g_carrname ,g_planetype,g_fldate ,g_price ,g_cityfrom ,g_cityto.
ENDSELECT.
如果您对如何使用内部表执行此操作有任何建议和想法,请给我看一个示例。我只是真的很想学习。谢谢你,上帝保佑。
【问题讨论】:
【参考方案1】:系统变量 SY-DBCNT 应该给你选择的行数,但只有在选择结束之后。
SELECT-ENDSELECT 的替代方法是使用 SELECT INTO TABLE 一次将所有行选择到内部表中(前提是您一次没有选择太多!)。
例如:
data: lt_t000 type table of t000.
select * from t000 into table lt_t000.
这将把该表中的所有内容一次性选择到内部表中。因此,您可以做的是声明一个包含当前 INTO 子句中的所有字段的内部表,然后为您的内部表指定 INTO TABLE。
SELECT 执行后,SY-DBCNT 将包含所选行数。
这是一个完整的示例,围绕您问题中的 SELECT 语句构建,我没有检查过它的完整性,所以我希望它有效!
tables: spfli.
select-options: s_carrid for spfli-carrid.
* Definition of the line/structure
data: begin of ls_dat,
carrid type s_carr_id,
carrname type s_carrname,
planetype type s_planetye,
fldate type s_date,
price type s_price,
cityfrom type s_from_cit,
cityto type s_to_city,
end of ls_dat.
* Definition of the table:
data: lt_dat like table of ls_dat.
* Select data
select spfli~carrid scarr~carrname sflight~planetype sflight~fldate sflight~price spfli~cityfrom spfli~cityto
into table lt_dat
from spfli
inner join sflight
on spfli~carrid = sflight~carrid and spfli~connid = sflight~connid
inner join scarr
on scarr~carrid = spfli~carrid
where spfli~carrid = s_carrid-low.
* Output data
write: 'Total records selected', sy-dbcnt.
loop at lt_dat into ls_dat.
write: / ls_dat-carrid, ls_dat-carrname, ls_dat-planetype, ls_dat-fldate, ls_dat-price, ls_dat-cityfrom, ls_dat-cityto.
endloop.
注意:报告(类型 1)程序仍然支持声明带有标题行的内部表以实现向后兼容性的概念,但不鼓励这样做!希望它有效!
【讨论】:
谢谢您的回复,但我只是想问您是否可以指导我或根据我关于如何使用内部连接选择语句执行内部表并将其循环的语句向我展示一些示例work_area..因为我做错了。请再一次..谢谢 好的,辛苦了,有你的榜样! 我真的很感激你所做的,先生。非常感谢你。永远有一个幸福的一天。我想我真的需要了解更多。 ^^, 只是补充答案,如果您无权访问给定的 select 语句来获取sy-dbcnt
并且需要知道内部表中的行数,您可以使用 DESCRIBE TABLE lt_date LINES lv_integer
。
你也可以使用 lv_integer = lines(lt_date[])【参考方案2】:
如果您只需要行计数而不检索数据本身,则以下语法也可以使用
SELECT COUNT(*)
FROM spfli
INNER JOIN sflight
...
执行此查询后,您将能够从 SY-DBCNT 获取行计数值,并且 DB 负载将比平时SELECT ... INTO itab
时少得多。
但是,仅当您不需要实际数据时,这才是正确的。如果您需要行数和数据本身,则将其拆分为单独的 select 语句是不明智的。
【讨论】:
以上是关于如何获取数据库表的行数的主要内容,如果未能解决你的问题,请参考以下文章