Apache JMeter--网站自动测试与性能测评

Apache JMeter--网站自动测试与性能测评
2013-02-28 15:48:05
标签:Jmeter

From:http://bdql.iteye.com/blog/291987

 

出于学习热情,翻译总结Emily H. Halili的《Apache JMeter》一书的部分内容。

JMeter的简介

可以肯定的是,JMeter至少符合以下几条自动测试标准:

  • 零购置成本--直接从http://jakarta.apache.org/site/downloads/downloads_jmeter.cgi下载得到。
  • 学习曲线平滑--只需要基本的html和正则表达式知识。
  • 功能全面--不仅只能测试web应用。
  • 架构可伸缩--其组件被设计为可通过合并完成大规模测试。测试可以在多台主机上同时运行。
  • API可扩展--API开放,并可由用户扩展编程。
  • 技术支持良好--在线用户指南、用户论坛、网络文章也包括这本书。

本章引导您开始第一次的JMeter试用。将向您介绍JMeterm同时使您对它的能力有一个整体的认识。除此之外,还会带您认识JMeter的操作界面,让你亲身感受到几个重要的JMeter组件。

让我们开始... 
JMeter是一个桌面应用,被设计为用于测试c/s结构的应用程序,如web应用或FTP应用。是到目前为止,一个使用得最广泛的开源测试工具。它是由纯java编写的,通过其API可以对它进行扩展。JMeter位于c/s中的客户端工作,它可以测试服务器的响应时间,CPU负载,内存占用和资源的使用。

绝大多数的JMeter测试脚本或测试计划都涉及到创建一个循环,按照预先定义的时间间隔和线程组来模拟向服务器发出请求。这些测试脚本可以定制和扩展。一个基本的JMeter测试计划应该至少包括三个部分:线程组,监听器,采样器。 
线程组用来模拟一组用户(用户数至少一个)。 
采样器使请求发往目标服务器。 
监听器捕获每个请求后收到的响应数据。

通过界面认识它 
一个典型的测试计划由一个或多个线程组,逻辑控制器,监听器,定时器,断言和配置等元素组成。 
线程组:一个线程模拟一个用户。所有的测试计划的元素都必须放在一个线程组元素下。 
监听器:监视JMeter运行测试用例时接收到的数据。 
控制器:其逻辑可以自定义,如让检验员告诉JMeter向服务器发出请求。 
定时器:设定一个线程发出的两次请求间的间隔时长。 
断言:测试返回的结果是否是期望的值。 
配置:与检验员相关,可以增加和修改请求。

以下为界面截屏图。 
clip_image001

JMeter界面上有两个面板,一旦JMeter投入运行,你可以看到它们。测试计划和工作区面板,如下图所示。一个测试计划描述了JMeter投入运行后的测试步骤。工作区提供临时的数据存放空间。工作区数据与测试计划分开存放。

clip_image002

左边的面板以树形显示了我们测试计划,其中节点的添加和删除可以通过右击节点进行。右边的面板显示了每个节点的详细配置。

clip_image003

下面是由一个线程组和其它一些元素组成的一个测试计划例子。

clip_image004

在我们使用JMeter进行性能测试时,线程组是必选元素。这个元素可以通过模拟多个用户对服务器进行压力测试。你甚至可以对测试进行的时间进行预设,下图是线程组的详细显示。

clip_image005

另一方面,同样一个测试计划可以扩展成为包括功能或回归测试。如下图所示添加Assertion(断言)元素。

clip_image006

正式开始使用...

安装JMeter 
你需要首先从以下网址下载最新发布的版本http://jakarta.apache.org/site/downloads/index.html,下载完成后,解压缩到你想要的目录就完成了安装。 
提醒:为了进行远程测试请避免在压缩时使用带空格的目录名。

设置环境变量 
首先机器上建议安装jdk1.4或更高版本。并设置JAVA_HOME环境变量。

 

运行JMeter 
在你的JMeter的安装目录下有bin目录。在windows系统中,运行jmeter.bat。如果你运行在unix系统中,你需要运行jmeter。 
在这个过程中,JMeter会自动在它的lib目录或lib/ext目录中找所需要的jar包。因此,如果将来您自己开发了JMeter的组件,你也需要把它们拷贝到JMeter的lib/exit目录中。 
如果你运行JMeter在代理或防火墙的后面,你需要提供服务器名和端口号,用命令行的参数指定。 
例如 
jmeter -H 129.198.1.1 -P 8000 -u someusername -a someuserpassword -N localhost

 

 

测试计划

JMeter的测试计划封装了你需要手动编写的测试脚本。 
什么是测试计划? 
测试计划定义了如何进行测试的框架。最简单的测试计划包括以下元素: 
线程组:用于指定运行线程的个数和坡道期,循环次数。每个线程模拟一个用户,坡道期指定创建所有线程的时间。例如指定5个线程和10秒的坡道期,表示每个线程的创建时间为2秒。循环次数定义了测试重复的次数。而且可以指定开始和结束的具体时间。

采样器:用于发出http/ftp/soap/xml/jdbc/ldap请求到服务器。

监听器:用于后处理请求数据。例如你可以保存数据到文件或者以图表显示。

 

开始运行JMeter,测试计划就会出现工作区左边的面板窗口中。


clip_image007

具体描述如下: 
User Defined Variables:你可以定义静态变量,它们是允许你在测试中重复提取的值,如服务器名,端口号等。例如你要测试一个www.example-jmeter.net的应用,你可以定义一个"server"变量,那么测试脚本中的"${server}"就会该值替代。

Functional Test Mode:它会记录下从服务器返回的数据。如果你要进行压力测试,请不要选择它因为它会影响结果。 
Run each Thread Group separately:单独运行每个线程组。如果您有二个或更多的线程组在你的测试计划中。选中该项,表示JMeter会顺序地运行它们,否则会并发运行它们。

Add directory or jar to classpath:如果你自己扩展了JMeter组件,可以使用该项添加jar包。记住需要重启后才能生效。另外,你也可以直接把jar包拷贝到JMeter/lib目录下。或者通过编辑JMeter.properties文件来包含额外的jar,如"#user.classpath=../classes;../jars/jar1.jar,这样可以避免出现路径中包含空格引发的问题。

 

测试计划的组成 
测试计划必须由至少一个线程组组成。每个线程组中都可以包含一个或多个以下组合: 
采样器,逻辑控制器,配置,监听器和定时器。每个采样器能够关联一个或多个预处理元素,后处理元素和断言元素。让我们更进一步了解它们。

 

线程组 
线程组是测试计划的入口,它包含所有其它的JMeter元素,一个线程组控制所有由JMeter创建的仿真线程,它们模拟多用户请求。 
线程组代表着一组执行特定测试用例的用户,在线程组的控制面板里,显示在下图。如果有多个线程组那么它们会彼此独立地执行。

clip_image008

 

详细描述如下: 
Action to be taken after a Sampler error:一旦采样器在测试过程中报错,你可以作出以下的选择:Continue继续进行下测试,stop Thread停止当前测试的线程,Stop Test完成停止测试,便于进行错误原因的查看。 
Number of Threads:模拟用户的人数或者是web应用的连接数。 
Ramp-Up Period:定义JMeter创 建所有测试线程的时长。例如设定线程数为10,坡道期为60秒,那么每个线程会以6秒/个的速度连续创建。在60秒以后,所有的线程将会投入运行。比较好 的策略是将你的坡道期设置得足够长以避免在测试一开始就造成很大的工作负载,但不要过长,你可以一开始将坡道期设置为等于要创建的线程数,稍后根据情况进行调整。 
Loop Count:定义测试执行的次数,默认情况下,测试仅执行一次。点击Forever选项框那么测试会一直重复执行直到你手动停止它。 
Scheduler Configuration:1.9之后的版本具有该项,允许你设定测试的开始和结束时间。只有时间到达开始时间,测试才会真正开始。在每个测试循环之 后,除非结束时间到了,测试将会继续下去一直到达loop count的上限。startup delay用于设定JMeter在第一个测试线程启动前的开始等待时间,duration用于设定整个测试的进行时间。前者用于覆盖start time的设定,后者覆盖end time的设定。

 

 

控制器 
JMeter有两类控制器: 
1.Samplers:允许发送特定类型的请求给服务器。稍后我们会发送http请求给服务器,所以我们会选用Http Rquest采集器。可以通过Configuration元素给采集器进行设定。

2.Logic Controllers:允许自定义何时发出请求的逻辑。例如你可以用Random Controllers来向服务器随机发出http请求。

 

采集器 
JMeter采集器允许你定义发往服务器的请求,模拟一个用户通过网页向服务器发出的请求。每个采集器生成结果包含以下一些,如性能、延迟时间、呑吐量等。默认情况下,JMeter会按照采样器出现在测试计划树中的顺序发送请求命令。当然,为了处理的采样的顺序可以使用逻辑控制器进一步定制。这将在后面的“逻辑控制器”中进一步解释 。

您可以自定义每个采样器通过设置其属性,或者您也可以添加配置元素。在这本书中,因为我们将发出许多HTTP请求到相同的服务器,我们可以使用默认配置元素,它预先定义了发送的http请求。


一个http请求的采样器面板显示如下:

clip_image009


如果你希望JMeter进行验证,你可以添加Assertion元素,关于Assertion的更多内容,后面再详细介绍。 
在一个Http请求采样器面板中的响应Assertion显示如下:


clip_image010

以下是JMeter提供的所有采样器列表:

HTTP Request 
FTP Request 
JDBC Request 
Java Request 
SOAP/XML-RPC Request 
WebService (SOAP) Request 
LDAP Request 
LDAP Extended Request 
Access Log Sampler 
BeanShell Sampler 
BSF Sampler 
TCP Sampler 
JMS Publisher 
JMS Subscriber 
JMS Point-to-Point 
JUnit Request 
Mail Reader Sampler 
Test Action

 


逻辑控制器:用于定义采样器的执行顺序。一个逻辑控制器的子元素有:采样器、配置,其它逻辑控制器。JMeter可能会随机选取(使用随机控制器) ,重复(使用回路控制器) ,交换(使用交错控制器)等。

几个逻辑控制器可以结合起来,实现不同的结果。

一个循环控制器的面板显示如下:

clip_image011

以下列出JMeter提供的所有的逻辑控制器:

Simple Controller 
Loop Controller 
Once Only Controller 
Interleave Controller 
Random Controller 
Random Order Controller 
Throughput Controller 
Runtime Controller 
If Controller 
While Controller 
Switch Controller 
ForEach Controller 
Module Controller 
Include Controller 
Transaction Controller 
Recording Controller

监听器 
显示采集器的结果为表、图、树或者日志文本。仅显示定义在监听器下的元素的数据。 
每种监听器以自己的方式来显示数据,例如为了显示图,可以使用"Aggregate Report"监听器。"Aggregate Report"或"Summary Report"监听器显示表。所有的监听器都会把数据写到输出文件,扩展名为jtl。 
一个Aggregate Graph监听器的面板显示如下:


clip_image012

所有监听器的公共属性: 
Configure button:用于选择写到文件中的信息,保存为xml或cvs格式,扩展名为jtl,其中cvs格式使得文件较小。一旦选择,Save Configuration Window将会出现。


clip_image013

Browser button:如果你想读或者显示以前保存的结果。 
一个监听器会耗费相当多的内存,如果它关联多少个采集器。JMeter会变慢,如果你选择激活多个监听器。因此尽量选择合适的监听器来使用。 
一个减少内存占用的方法是用CSV默认的格式来保存数据,并且使用Simple data Writer监听器。 
你可以改变默认的格式为xml,通过编辑jmeter.properties。将jmeter.save.saveservice.output_format=csv,改为xml即可。

以下为所有的监听器列表:

Sample Result Save Configuration 
Graph Full Results 
Graph Results 
Spline Visualizer 
Assertion Results 
View Results Tree 
Aggregate Report 
View Results in Table 
Simple Data Writer 
Monitor Results 
Distribution Graph (alpha) 
Aggregate Graph 
Mailer Visualizer 
BeanShell Listener 
Summary Report

定时器 
定时器组件是可选组件,它会引起JMeter暂停,因为默认情况下JMeter会在一个请求结束后马上发出下一个请求,这样能会造成服务器过载。通过添加定时器会降低服务器崩溃的危险。这项功能在进行功能性测试时非常有用。 
不管怎样,你需要小心在一个测试计划中添加了过多的定时器。JMeter会在两次请求间暂停可使用的所有定时器指定时间的总和。

Constant Timer控制面板如下:


clip_image014 

以下是所有JMeter提供的定时器列表: 
Constant Timer 
Gaussian Random Timer 
Uniform Random Timer 
Constant Throughput Timer 
Synchronizing Timer 
BeanShell Timer

Assertions断言:允许你针对响应添加验证条件。它们被添加为采集器的子元素。在进行功能性测试时特别有用。在性能测试中可以用它来保证你收到了响应数据。不包含内容的错误或遗失的部分,因为这可能会影响有效性的测试。
你可以利用类似Perl的正则表达式来创建断言。用这来判断应用返回的值是否是你所期望的。

让我们来看一下这样的场景,在一个Http请求的采样器中,你请求一个页面,如果返回"Login Successful"字符串表示访问成功,你可使用Response Assertion来判断响应中是否具有该字符串。如下图所示: 
clip_image015

与Assertions相关的监听器有"View Result in Table", "View Result Tree", "Aggregate Report","Summary Report"监听器,前三种监听器将会详细显示Assertions结果,而后者只是简要显示失败的比例。 
以下是一个Assertion Results面板显示:

clip_image016

以下是所有JMeter提供的Assertion的列表:

Response Assertion 
Duration Assertion 
Size Assertion 
XML Assertion 
BeanShell Assertion 
MD5Hex Assertion 
HTML Assertion 
XPath Assertion 
XML Schema Assertion

配置元素 
配置元素允许你创建默认的变量在采样器中使用。用于修改采样器发出的请求内容。 
它们只能被同一范围内的采样器访问,并且先于采样器被执行。 
以下是HTTP Request Defaults 面板,如图: 
clip_image017

Request Default 1可以被Request1和Request3采样器访问,因为它是父节点,而Request Default2只能被Request1访问,Request Default3只能被Request3访问。 
以下是JMeter提供的所有配置元素列表: 
CSV Data Set Config 
FTP Request Defaults 
HTTP Authorization Manager 
HTTP Cookie Manager 
HTTP Proxy Server 
HTTP Request Defaults 
HTTP Header Manager 
Java Request Defaults 
JDBC Connection Configuration 
Login Config Element 
LDAP Request Defaults 
LDAP Extended Request Defaults 
TCP Sampler Config 
User Defined Variables 
Simple Config Element

Pre-Processor Elements 
预先处理允许你修改范围内的采样器。他们经常用于在运行之前修改请求的设置,或者更新不能从响应文本中获取的变量。 
以下是JMeter提供的预先处理元素。 
HTML Link Parser 
HTTP URL Re-writing Modifier 
HTML Parameter Mask 
HTTP User Parameter Modifier 
User Parameters 
Counter 
BeanShell PreProcessor

Post-Processor Elements 
后处理元素在采样器发出请求后执行。一种好的做法是将其做为采样器的子元素,以保证它只在特定的采样器运行后执行,而不是全部的采样器。该元素一般用于处理响应数据,例如,提取稍后要用到的变量值。 
以下是JMeter提供的全部后处理元素。 
Regular Expression Extractor 
XPath Extractor 
Result Status Action Handler 
Save Responses to a file 
Generate Summary Results 
BeanShell PostProcessor

构建一个用于测试web站点的测试计划 
本节描述如何创建一个基本的网站测试计划。我们稍后会对该计划进行扩展以进行性能测试(第5章)和功能测试(第6章)。 
以下是基本的测试计划所需要的元素: 
Thread Group 
HTTP Request (Sampler) 
HTTP Request Default (Configuration Element) 
Summary Report (Listener)

我们可以按照以下的步骤来进行:

  • 添加用户
  • 添加和配置默认的HTTP Request
  • 添加HTTP Request
  • 添加监听器显示、存放测试结果
  • 保存和运行测试计划

 

首先,运行JMeter(双击JMeter.bat在jmeter/bin目录中),你可以看到默认的界面,包括测试计划和工作区。

添加用户 
1.右击Test Plan图标在左边窗格,然后选择add|Thread Group。 
clip_image018 
右边的将显示Thread Group的控制面板。 
clip_image019 
2.将Thread Group更名为My Users. 
3.设定为一次连接和一个用户。 
4.更变Ramp-Up Period(坡道期)为0,意味着用户将会马上开始测试。如果还有其他的用户,那就意味着所有的用户立即开始测试。

设定之后图如下:

clip_image020

接下来做其它的步骤。 
添加默认的HTTP Request 
1.右击My Users元素,选择Add | Config Element | HTTP Request Defaults。 
2.选择后显示它的控制台界面。 
3.重命名为My URL。 
4.在服务器名或IP地址栏中输入www.mocksite.net或其它你想用的网址。其余不动。设置HTTP Request Default Element会引起在My Users中的所有请求采样器访问同一个服务器。 
显示如下: 
clip_image021

添加HTTP Requests 
在这一步,我们将向服务做两个模拟的请求:默认的页面和另一个页面。JMeter会以它们在测试计划树中出现的次序来执行,我们首先添加默认页面的请求。 
1.右击My Users线程元素,选择Add | Sampler | HTTP Request. 
2.选择HTTP Request从左边窗格,并做以下修改: 
a. Name栏:Home Page 
b. Web Server:这个信息已经在HTTP Request Defaults中设置。在这里不需要修改,除非你需要重定向到另一个不同的路径。 
c. Path栏:/ 
因为我们已经在HTTP Request Default元素中指定Server name,我们就不必再指定其它内容。 
完成后如图: 
clip_image022

3.添加其它HTTP Request元素在Home Page元素之下。 
a. Name栏:Sample Page 
b. Path栏:/sample.html(或你自己知道的url) 
因为我们已经在HTTP Request Default element指定了服务器名www.mocksite.com,该path就会添加在其后形成完整路径。 
以下为完成图:

clip_image023

添加监听器 
最后,我们添加一个简单的监听器,Aggregate Report。这个元素将存放所有http请求的结果,并以表格形式输出。
1.选择My Users元素并Add | Listener | Aggregate Report。 
2.在Write All Data to a File:在Filename栏中输出目录名或用browse按钮选择,并输入输出文件名。 
以下为完成图: 
clip_image024

保存和运行测试计划 
JMeter要求我们在运行之前保存测试计划。 
1.选择Save Test Plan从File菜单。JMeter允许你只保存一部分,通过选择分支。 
2.在Save as中输入文件名,例如输入My Users。扩展名为.jmx。 
3.从run 菜单选择运行。 
以下为Aggregate Report Element和Control Panel运行结果。注意右上角有小的方框,旁边的数字显示激活的线程数和总线程数。 
clip_image025 

以下为运行测试计划之后的界面。右上角方框为灰色,只显示总线程数,你也可以手动停止测试,通过选择Stop从Run菜单。


clip_image026

报表列解释如下: 
Label—例子的标签 
# Samples—URL的样本数量 
Average—平均时间 
Median—The time in the middle of a set of results 
90% Line—The maximum time taken for the fastest 90% of the samples 
Min—The lowest time for the samples 
Max—The longest time for the samples 
Error %—Percent of requests with errors or failures 
Throughput—Throughput measured in requests per unit of time 
Kb/sec—The throughput measured in Kilobytes per second

转载于:https://www.cnblogs.com/edwardsun/p/4331966.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273360.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hdu3081 Marriage Match II(最大流)

转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud Marriage Match II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2410 Accepted Submission(s): 820 Problem Descriptio…

log4net 日志框架的配置

log4net 日志框架的简单配置 添加对log4net程序集的引用 选择程序集文件添加引用即可,需要注意的是需要添加相应程序版本的程序集,如果你的应用是基于.netFramework2.0,则应选择net 2.0版本的程序集 修改配置文件,配置log4net相…

CSS 设计指南(第3版) 初读笔记

第1章 HTML标记与文档结构 关于<title>标签&#xff1a;搜索引擎会给<title>标签中的文字内容赋予很高的权重。而且这些文字也会作为网页标题出现在搜索结果列表中。 无论你想了解哪个HTML元素&#xff0c;第一个要问的问题都应该是&#xff1a;它是块元素&#xf…

Objective-C中的@property和@synthesize用法

代表“Objective-C”的标志&#xff0c;证明您正在使用Objective-C语言 Objective-C语言关键词&#xff0c;property与synthesize配对使用。 功能&#xff1a;让编译好器自动编写一个与数据成员同名的方法声明来省去读写方法的声明。 如&#xff1a; 1、在头文件中&#xff1a;…

Android用户界面程序设计示例

[例1]按钮和Toast弹出对话框 1 [例2] TextView文本框 &#xff08;1&#xff09; 3 [例3]TextView文本框 &#xff08;2&#xff09; 4 [例4]编辑框EditText 4 [例5]单选RadioButton 6 [例6]Toast的用法简介 8 [例7]多选checkbox 12 [例8]菜单Menu 14 …

Spring Thread Pool 线程池的应用

Spring and Java Thread example 扫扫关注“茶爸爸”微信公众号坚持最初的执着&#xff0c;从不曾有半点懈怠&#xff0c;为优秀而努力&#xff0c;为证明自己而活。Download it – Spring-Thread-Example.zip (22 KB)转自&#xff1a;http://www.mkyong.com/spring/spring-and…

Emule使用Upnp,解决Lowid和port not reachable的问题

路由器上钩选开启Upnp Emule->选择->扩展选项->Upnp&#xff0c; 服务器&#xff1a;【从URL更新】http://upd.emule-security.org/server.met转载于:https://www.cnblogs.com/zhyong/p/4422139.html

Android动画及滑动事件冲突解决(转载)

原文链接&#xff1a;http://blog.csdn.net/singwhatiwanna/article/details/38168103 Android开发中动画和事件处理是程序员迈向高手的必经之路&#xff0c;也是重点和难点。 此篇转载文章思路清晰&#xff0c;结构合理&#xff0c;用图文混合的方式完美的讲解了动画和事件冲突…

使用临时表解决union和order by不能同时使用的问题

最近遇见了这样一个问题&#xff0c;有4张表&#xff0c;A&#xff08;单据&#xff09;表&#xff0c;B&#xff08;产品&#xff09;表&#xff0c;C&#xff08;产品类型&#xff09;&#xff0c;D&#xff08;单据产品关联表&#xff09;。 B表有唯一对应的类型C&#xff…

2.3线性表的链式存储和运算—双向链表

以上讨论的单链表的结点中只有一个指向其后继结点的指针域next&#xff0c;因此若已知某结点的指针为p&#xff0c;其后继结点的指针则为p->next &#xff0c;而找其前驱则只能从该链表的头指针开始&#xff0c;顺着各结点的next 域进行&#xff0c;也就是说找后继的时间性能…

通过栈(Stack)实现对树的遍历

说到数的遍历树&#xff0c;长期以来的第一印象都是通过递归去实现。然而今天看了某位前辈的代码&#xff0c;才发现使用栈去实现遍历是那么简单。理论上通过数组也是可以实现同等功能的&#xff0c;毕竟Stack也是通过数据去实现的。 package com.sysway.ui.widget;import jav…

StroyBoard中UICollectionView中添加Header和footer

到Storyboard中&#xff0c;选择collection view controller中的"Collection View"。在Attributes inspector中&#xff0c;选择"Section Header"和"Section Footer",一旦选中你就会在屏幕中看到下面的的显示&#xff1a; 最重要的是&#xff0c…

树形结构数据汇总查询解决方案+优化求助

最近遇到一个地区数据汇总的问题&#xff0c;地区下的地址呈树形结构&#xff0c;&#xff08;简化结构&#xff09;如A市下有B、C区&#xff0c;B区下有D、E街道。先要查询所有地区的人数&#xff08;包括子区域&#xff09;&#xff0c;如A的人数直属A的人数B的人数C的人数D的…

Dom4j 学习笔记

dom4j 是一种解析 XML 文档的开放源代码 XML 框架。dom4j下载地址 本文主要记载了一些简单的使用方法。 一、xml文件的解析 dom4j既可以解析普通的xml文件&#xff0c;也可以解析一个InputStream&#xff0c;先看看xml文件长什么样子&#xff1a; <books><book>&l…

交叉连接(CROSS JOIN)的实际应用

一次偶然的机会&#xff0c;使用到了万年不用的交叉连接&#xff08;CROSS JOIN&#xff09; 业务场景如下&#xff1a; 1、存在多个运营商&#xff0c;每个运营商下面都有各种类型的设备&#xff0c;不同运营商的设备不完全相同&#xff1b; 2、任何设备有且仅有两种用途‘…

C# xml文件读取与修改

c#读写xml文件已知有一个XML文件&#xff08;bookstore.xml&#xff09;如下&#xff1a; Code<?xml version"1.0" encoding"gb2312"?><bookstore> <book genre"fantasy" ISBN"2-3631-4"> <title>Obero…

外连接从表过滤

1、使用left join时从表的过滤 WITH a AS( SELECT A aid FROM dual UNION ALL SELECT B FROM dual UNION ALL SELECT C FROM dual UNION ALL SELECT D FROM dual UNION ALL SELECT E FROM dual ), b AS( SELECT A aid,10 num,1 type FROM dual UNION ALL SELECT B,20,2 FROM d…

ORACLE将查询字段指定为某种类型

SELECT CAST(张三 AS VARCHAR2(20)) name FROM dual; 一般来说在查询时很少有用到这种语句&#xff0c;但是使用CREATE TABLE ... AS SELECT ...语句的时候这个就很好用了 --建表 CREATE TABLE test01 AS SELECT 张三 name FROM dual; --正常插入数据 INSERT INTO test01 SEL…

分组查询最晚一条数据(ORACLE)

现有客户表&#xff0c;交费表&#xff0c;需查询每个存在交费记录客户的最后一笔交费信息 这里提供两种方式 注&#xff1a;客户不会在同一时间有两条交费&#xff0c;SQL可直接执行 --查询客户名称&#xff0c;最后一笔交费时间&#xff0c;以及最后一笔交费金额 WITH --客…

ORACLE循环中使用序列

在批量生成数据时&#xff0c;经常会用到序列的Nextval&#xff0c;今天碰到了这样的情况&#xff0c;日常记录&#xff0c;下附解决方案。先看这段脚本 DECLARE i INTEGER; BEGINFOR cur IN 1..5 LOOPi : DomainObjectId.Nextval;dbms_output.put_line(i);END LOOP; END; 编…