這裡蒐索程式師資訊,查找有用的技術資料
当前位置:首页 » 编程语言 » sqlcollectset
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

sqlcollectset

发布时间: 2022-05-06 05:11:26

A. 如何实时监控mysql中的SQL语句的执行情况

首先介绍下 pt-stalk,它是 Percona-Toolkit 工具包中的一个工具,说起 PT 工具包大家都不陌生,平时常用的 pt-query-digest、 pt-online-schema-change 等工具都是出自于这个工具包,这里就不多介绍了。

pt-stalk 的主要功能是在出现问题时收集 OS 及 MySQL 的诊断信息,这其中包括:

1. OS 层面的 CPU、IO、内存、磁盘、网络等信息;

2. MySQL 层面的行锁等待、会话连接、主从复制,状态参数等信息。

而且 pt-stalk 是一个 Shell脚本,对于我这种看不懂 perl 的人来说比较友好,脚本里面的监控逻辑与监控命令也可以拿来参考,用于构建自己的监控体系。

三、使用

接着我们来看下如何使用这个工具。

pt-stalk 通常以后台服务形式监控 MySQL 并等待触发条件,当触发条件时收集相关诊断数据。

触发条件相关的参数有以下几个:

  • function:

    ∘默认为 status,代表监控 SHOW GLOBAL STATUS 的输出;

    ∘也可以设置为 processlist,代表监控 show processlist 的输出;

  • variable:

    ∘默认为 Threads_running,代表 监控参数,根据上述监控输出指定具体的监控项;

  • threshold:

    ∘默认为 25,代表 监控阈值,监控参数超过阈值,则满足触发条件;

    ∘监控参数的值非数字时,需要配合 match 参数一起使用,如 processlist 的 state 列;

  • cycles:

    ∘默认为 5,表示连续观察到五次满足触发条件时,才触发收集;

  • 连接参数:host、password、port、socket。

  • 其他一些重要参数:

  • iterations:该参数指定 pt-stalk 在触发收集几次后退出,默认会一直运行。

  • run-time:触发收集后,该参数指定收集多长时间的数据,默认 30 秒。

  • sleep:该参数指定在触发收集后,sleep 多久后继续监控,默认 300 秒。

  • interval:指定状态参数的检查频率,判断是否需要触发收集,默认 1 秒。

  • dest:监控数据存放路径,默认为 /var/lib/pt-stalk。

  • retention-time :监控数据保留时长,默认 30 天。

  • daemonize:以后台服务运行,默认不开启。

  • log:后台运行日志,默认为 /var/log/pt-stalk.log。

  • collect:触发发生时收集诊断数据,默认开启。

    ∘collect-gdb:收集 GDB 堆栈跟踪,需要 gdb 工具。

    ∘collect-strace:收集跟踪数据,需要 strace 工具。

    ∘collect-tcpmp:收集 tcpmp 数据,需要 tcpmp 工具。

B. 如何动态执行sql语句

这里只介绍动态SQL的使用。关于动态SQL语句的语法,参见:http://blog.csdn.NET/chiclewu/article/details/16097133

1.什么是时候需要使用动态SQL?
SQL文本在编译时是未知的。
例如,SELECT语句包含的标识符(如表名)在编译时是未知的,或者WHERE子句的条件数量在编译时是未知。
静态SQL不支持
例如,在PL/SQL中用静态SQL只能执行查询以及DML语句。如果想要执行DDL语句,只能使用动态SQL。
当让使用静态SQL,也有它的好处:
编译成功验证了静态SQL语句引用有效的数据库对象和访问这些对象的权限
编译成功创建了模式对象的依赖关系
2.EXECUTE IMMEDIATE语句
EXECUTE IMMEDIATE语句的意思是使用本地动态SQL处理大多数动态SQL语句。
如果动态SQL语句是自包含的(也就是说,它的绑定参数没有占位符,并且结果不可能返回错误),则EXECUTE IMMEDIATE语句不需要子句。
如果动态SQL语句包行占位符绑定参数,每个占位符在EXECUTE IMMEDIATE语句的子句中必须有一个相应的绑定参数,具体如下:
如果动态SQL语句是一个最多只能返回一行的SELECT语句,OUT绑定参数放置在INTO子句,IN绑定参数放置在USING子句。
如果动态SQL语句是一个可以返回多行的SELECT语句,OUT绑定参数放置在BULK COLLECT INTO子句,IN绑定参数放置在USING子句。
如果动态SQL语句是一个除了SELECT以外的其他DML语句,且没有RETURNING INTO子句,所有的绑定参数放置在USING子句中。
如果动态SQL还语句一个匿名PL/SQL块或CALL语句,把所有的绑定参数放置在USING子句中。
如果动态SQL语句调用一个子程序,请确保:
每个对应子程序参数占位符的绑定参数与子程序参数具有相同的参数模式和兼容的数据类型。
绑定参数不要有SQL不支持的数据类型(例如,布尔类型,关联数组,以及用户自定的记录类型)

USING子句不能包含NULL字面量。如果想要在USING子句中使用NULL值,可以使用位初始化的变量或者函数显示将NULL转换成一个有类型的值。

2.1动态SQL语句是一个最多只能返回一行的SELECT语句
使用动态SQL语句返回单列,查询SCOTT的薪水:
declare
v_sql_text varchar2(1000);
v_sal number;
v_ename emp.ename%type := 'SCOTT';
begin
v_sql_text := 'select e.sal from emp e where e.ename = :ename';
execute immediate v_sql_text
into v_sal
using v_ename;
dbms_output.put_line(v_ename || ':' || v_sal);
end;

使用动态SQL返回一条记录,查询SCOTT的基本信息:
declare
v_sql_text varchar2(1000);
v_ename emp.ename%type := 'SCOTT';
vrt_emp emp%rowtype;
begin
v_sql_text := 'select * from emp e where e.ename = :ename';
execute immediate v_sql_text
into vrt_emp
using v_ename;
dbms_output.put_line(v_ename || '的基本信息:');
dbms_output.put_line('工号:' || vrt_emp.empno);
dbms_output.put_line('工资:' || vrt_emp.sal);
dbms_output.put_line('入职日期:' || vrt_emp.hiredate);
end;

2.2动态SQL语句是一个可以返回多行的SELECT语句
2.2.1只有一个占位符
使用动态SQL语句返回多行记录,查询30部门的员工基本信息:
declare
v_sql_text varchar2(1000);
v_deptno emp.deptno%type := 30;
type nt_emp is table of emp%rowtype;
vnt_emp nt_emp;
begin
v_sql_text := 'select * from emp e where e.deptno = :deptno';
execute immediate v_sql_text bulk collect
into vnt_emp
using v_deptno;
for i in 1 .. vnt_emp.count loop
dbms_output.put_line(vnt_emp(i).ename || '的基本信息:');
dbms_output.put_line('工号:' || vnt_emp(i).empno);
dbms_output.put_line('工资:' || vnt_emp(i).sal);
dbms_output.put_line('入职日期:' || vnt_emp(i).hiredate);
dbms_output.put_line('');
end loop;
end

2.2.2多个占位符
查询20部门工资大于2000的员工基本信息:
declare
v_sql_text varchar2(1000);
v_deptno emp.deptno%type := 20;
v_sal number := 2000;
type nt_emp is table of emp%rowtype;
vnt_emp nt_emp;
begin
v_sql_text := 'select * from emp e where e.sal>:sal and e.deptno = :deptno';
execute immediate v_sql_text bulk collect
into vnt_emp
using v_sal, v_deptno; --注意绑定多个变量时,绑定变量只与占位符位置有关,与占位符名称无关,
for i in 1 .. vnt_emp.count loop
dbms_output.put_line(vnt_emp(i).ename || '的基本信息:');
dbms_output.put_line('工号:' || vnt_emp(i).empno);
dbms_output.put_line('工资:' || vnt_emp(i).sal);
dbms_output.put_line('入职日期:' || vnt_emp(i).hiredate);
dbms_output.put_line('');
end loop;

注意:对于SQL文本,占位符名称是没有意义的,绑定变量与占位符名称无关,只与占位符的配置有关。即使有多个相同名称占位符,也需要每个占位符对应一个绑定变量。对于PL/SQL块,占位符名称是有意义的,相同名称的占位符,只需要第一个占位符绑定变量。

2.3动态SQL语句是一个带有RETURNING子句的DML语句
KING的工资增长20%,返回增长后的工资:
eclare
v_sql_text varchar2(1000);
v_sal number;
v_ename emp.ename%type := 'KING';
begin
v_sql_text := 'update emp e set e.sal= e.sal*1.2 where e.ename = :ename returning e.sal into :sal';
execute immediate v_sql_text
using v_ename
returning into v_sal;
dbms_output.put_line(v_ename || ':' || v_sal);
end;

注意:只有当v_sql_text语句有returning into子句时,动态SQL语句才能使用returning into子句。

2.4给占位符传递NULL值
2.4.1通过未初始化变量传递NULL值
declare
v_sql_text varchar2(1000);
v_deptno emp.ename%type := 'ALLEN';
v_comm emp.comm%type;
begin
v_sql_text := 'update emp e set e.comm = :comm where e.ename =:ename';
execute immediate v_sql_text
using v_comm, v_deptno;
end;

2.4.2通过函数将NULL值显式的转换成一个有类型的值
declare
v_sql_text varchar2(1000);
v_deptno emp.ename%type := 'ALLEN';
begin
v_sql_text := 'update emp e set e.comm = :comm where e.ename =:ename';
execute immediate v_sql_text
using to_number(null), v_deptno;
end;

3.OPEN FOR语句
PL/SQL引入OPEN FOR语句实际上并不是为了支持本地动态SQL,而是为了支持游标变量。现在它以一种极其优雅的方式实现了多行的动态查询。
使用OPEN FOR语句来关联动态SQL语句的游标变量,在OPEN FOR语句的USING子句中,指定动态SQL语句每个占位符的绑定参数。
使用FETCH语句获取运行时结果集。
使用CLOSE语句关闭游标变量
使用OPEN FOR语句查询出10部门的员工的基本信息:
declare
type rc_emp is ref cursor;
vrc_emp rc_emp;
v_sql_text varchar2(1000);
v_deptno emp.deptno%type := 10;
vrt_emp emp%rowtype;
begin
v_sql_text := 'select * from emp e where e.deptno=:deptno';
open vrc_emp for v_sql_text
using v_deptno;
loop
exit when vrc_emp%notfound;
fetch vrc_emp
into vrt_emp;

dbms_output.put_line(vrt_emp.ename || '的基本信息:');
dbms_output.put_line('工号:' || vrt_emp.empno);
dbms_output.put_line('工资:' || vrt_emp.sal);
dbms_output.put_line('入职日期:' || vrt_emp.hiredate);
dbms_output.put_line('');

end loop;
close vrc_emp;
end;

4.重复的占位符名称
如果在动态SQL语句重复占位符名称,要知道占位符关联绑定参数的方式依赖于动态语句的类型。
如果执行的是一个动态SQL字符串,则必须为每一个占位符提供一个绑定参数,即使这些占位符是重复的。
如果执行的是一个动态PL/SQL块,则必须为每一个唯一占位符提供一个绑定参数,即重复的占位符只需要提供一个绑定参数。
4.1重复占位符的动态SQL字符串
declare
v_sql_text varchar2(1000);
v_sal emp.sal%type := 4000;
v_comm emp.comm%type;
v_ename emp.ename%type := 'SCOTT';
begin
v_sql_text := 'update emp e set e.sal=:sal , e.comm = :sal*0.1 where e.ename =:ename returning e.comm into :comm ';
execute immediate v_sql_text
using v_sal, v_sal, in v_ename
returning into v_comm;
dbms_output.put_line(v_ename || '分红:' || v_comm);
end;

4.2重复占位符的动态PL/SQL块
declare
v_sql_text varchar2(1000);
v_sal number;
v_ename emp.ename%type := 'KING';
begin
v_sql_text := ' begin select e.sal,e.ename into :sal,:ename from emp e where e.ename =:ename; end;';
execute immediate v_sql_text
using out v_sal, in out v_ename;
dbms_output.put_line(v_ename || ':' || v_sal);
end;

C. Java Collection list=new ArrayList();问题

下面的三个函数都是相等的..返回的都是new ArrayList()

public Collection getDomainsHelper(String sql)
{
Collection list=new ArrayList();
return list;
}

public Collection getDomainsHelper(String sql)
{
List list=new ArrayList();
return list;
}

public Collection getDomainsHelper(String sql)
{
return new ArrayList();
}

Collection是List和Set两个接口的基接口
List在Collection之上增加了"有序"
Set在Collection之上增加了"唯一"

而ArrayList是实现List的类...所以他是有序的.
它里边存放的元素在排列上存在一定的先后顺序

而且ArrayList是采用数组存放元素
另一种List LinkedList采用的则是链表

D. sql语句优化。 数据级为百万级别

数据优化不外乎索引,必要冗余字段,分表等。
这条sql调用了两个函数,且都查询了百万数据级别的表,建议在被检索的字段加索引。

E. SQL2005存储过程,多个传入参数变量,求修改

试试用
sp_execute @strsqlOutput,N'@FileName nvarchar(50),@Photo nvarchar(20),@PhotoNum nvarchar(20)',
@FileName=@FileName,@Photo=@Photo,@PhotoNum=@PhotoNum
1.sp_execute 用于在存储过程中执行相关的sql语句
2.如果要返回值,应该给输出参数赋值

F. sql server触发器没作用怎么办

Select @bno from inserted这里可能有误,通过select语句对变量赋值,应该是select @bno = 字段名 from inserted
你这么写顶多是把变量显示了一遍,并没有对变量赋值,变量值是null,自然下面update时不好用

G. oracle 数据库 sql查询的问题关于bulk collect 和PIPELINED

set serveroutput on;--回显开启

DECLARE
//下面这句很重要,定义一个表记录,然后存储,之后就可以返回了。
TYPE customer_table_type IS TABLE OF customer%ROWTYPE
INDEX BY BINARY_INTEGER;
TYPE agents_table_type IS TABLE OF agents%ROWTYPE INDEX BYBINARY_INTEGER;
TYPE procts_table_type IS TABLE OF procts%ROWTYPE
INDEX BY BINARY_INTEGER;

v_customer_table customer_table_type;
v_agents_table agents_table_type;
v_procts_table procts_table_type;

v_which_table varchar2(30);
v_city varchar2(30);
please_input_a_table_namevarchar2(30);
please_input_a_city_namevarchar2(30);

BEGIN
v_which_table:='&please_input_a_table_name';
v_city:='&please_input_a_city_name';

--下面这句可有可无,为了使结果更加清晰,我加上了
DBMS_OUTPUT.PUT_LINE('您输入的表名是:'||v_which_table||' 城市名称是: '||v_city);
if( upper(v_which_table)='CUSTOMER' ) then
SELECT * BULK COLLECT INTO v_customer_table FROM customer
WHERE city=v_city;
FOR i IN 1..v_customer_table.COUNT LOOP
DBMS_OUTPUT.PUT_LINE('用户编号:'|| v_customer_table(i).cid||
' 用户姓名:'||v_customer_table(i).cname|| ' 城市名称='||
v_customer_table(i).city||' 折扣:'||v_customer_table(i).discnt);
END LOOP;

elsif( upper(v_which_table)='AGENTS' ) then
SELECT * BULK COLLECT INTO v_agents_table FROM agents WHERE city=v_city;
FOR i IN1..v_agents_table.COUNT LOOP
DBMS_OUTPUT.PUT_LINE('订单编号:'||v_agents_table(i).aid||
' 订单名称:'||v_agents_table(i).aname|| ' 城市名称='||
v_agents_table(i).city||'佣金百分比:'||v_agents_table(i).percent);
ENDLOOP;

elsif( upper(v_which_table)='PRODUCTS' ) then
SELECT * BULK COLLECT INTO v_procts_table FROM procts WHERE city=v_city;
FOR i IN1..v_procts_table.COUNT LOOP
DBMS_OUTPUT.PUT_LINE('商品编号:'||v_procts_table(i).pid||
' 商品名称:'||v_procts_table(i).pname||' 城市名称='||v_procts_table(i).city||
' 商品库存:'||v_procts_table(i).quantity||' 商品价格:'||v_procts_table(i).price);
END LOOP;

else dbms_output.put_line('只能输入customer、agents、procts !');
end if;

END;

不懂的,追问我,这个例子应该很清楚了。
先定义一个你存储的表记录类型,然后用SELECT * BULK COLLECT INTO ,存储数据。无论嵌套与否,都可以的

H. Oracle 数据汇总语句!

如2011年1月day2日到2012年2月day1日,
这个查询条件,同时还有减掉2011年1月的day1,day3和2012年2月day2,day3,
减去的是其他字段,
这个似乎需要使用动态sql

declare
Type cid Is Table Of Varchar2(20);
cidset1 cid;
i int;
v_col varchar2(1000);
v_colb varchar2(4000);
v_cole varchar2(4000);
v_sum number(10)
begin
--开始条件中需要减去的日列
Select COLUMN_NAME
Bulk Collect Into cidset1
From dba_tab_cols WHERE table_name=表名
and COLUMN_NAME LIKE '%DAY%' AND SUBSTR(COLUMN_NAME,INSTR(COLUMN_NAME,'Y')+1)<SUBSTR(bdate,10);
if cidset1.Count > 0 Then
v_col:=cidset1(1);
end if;
for i in 2..cidset1.Count loop
v_colb:=v_col||'+'||cidset1(i);
end loop;
end;
--结束条件中需要减去的日列
Select COLUMN_NAME Bulk Collect
Into cidset1
From dba_tab_cols WHERE dba_tab_cols=表名
and COLUMN_NAME LIKE '%DAY%' AND SUBSTR(COLUMN_NAME,INSTR(COLUMN_NAME,'Y')+1)>SUBSTR(edate,10)
if cidset1.Count > 0 Then
v_col:=cidset1(1);
for i in 2..cidset1.Count loop
v_cols:=v_col+cidset1(i);
end loop;
结果集
select sum(月汇总) into v_sum from 表 where 年||lpad(月,2,'0') between bdate and edate;
execute immediate 'select ||v_sum||'-1*sum('||v_colb||'+'||v_cols||') from 表 where 年||lpad(月,2,'0') in(:bdate,:edate)' using v_colb,v_cols,bdate,edate';
end;

I. asp三级级联菜单的后两个菜单问题

<% Option Explicit %>
<!--#include file="../library/class/DBControl.class.asp" -->
<!--#include file="../../config/PConst.asp" -->
<!--#include file="../library/function/Function.asp" -->
<%
Dim DBC,CollectConn
Dim SelectPath
Set DBC = New DataBaseClass
Set CollectConn = DBC.OpenConnection()
Set DBC = Nothing
SelectPath = "/"
Dim Rs
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<link href="/skin/CSS/css.css" rel="stylesheet">

<body onselectstart="return false;" onClick="SelectSite();" leftmargin="0" topmargin="0">
<%
Dim TempletDirectory,intDepth,strSql,objRs
Dim ClassID0,ClassID1,intClassID,ClassList0,ClassList1,ClassList2
TempletDirectory = "/"
intClassID = Request.QueryString("ClassID")
intDepth = Request.QueryString("Depth")
If intClassID="" Or Not IsNumeric(intClassID) Then
intClassID = 0
Else
intClassID = CInt(intClassID)
End If
If intDepth = "" Or Not IsNumeric(intDepth) Then
intDepth = 0
Else
intDepth=CInt(intDepth)
End If
Set objRs = Server.CreateObject("ADODB.RecordSet")
If intDepth = 0 Then
ClassID0 = intClassID
Else
ClassID1=intClassID
strSql = "Select Parent From Bj_Class Where Id="&ClassID1
objRs.Open strSql,CollectConn,1,1
If Not objRs.EOF Then
ClassID0 = ObjRs("Parent")
End If
objRs.CLose
End If
strSql = "Select Id,Title From Bj_Class Where Depth=0 Order By Id"
objRs.Open strSql,CollectConn,1,1
Do While Not objRs.EOF
If ClassID0 = objRs("Id") Then
ClassList0 = ClassList0 & "<option value=""ss.asp?Depth=0&ClassID="&ObjRs("ID")&""""&" selected>" & ObjRs("Title") & "</option>"
Else
ClassList0 = ClassList0 & "<option value=""ss.asp?Depth=0&ClassID="&ObjRs("ID")&""""&">" & ObjRs("Title") & "</option>"
End If
objRs.Movenext()
Loop
objRs.CLose
If Request.QueryString("Depth")="1" And Request.QueryString("ClassId")="0" Then
ClassID0=-1
ClassID1=-1
End If
If Request.QueryString("ClassId")<>"" Then
strSql = "Select Id,Title From Bj_Class Where Parent="&ClassID0
Else
strSql = "Select Id,Title From Bj_Class Where Parent=-1"
End If
objRs.Open strSql,CollectConn,1,1
Do While Not objRs.EOF
If ClassID1 = objRs("Id") Then
ClassList1 = ClassList1 & "<option value=""ss.asp?Depth=1&ClassID="&ObjRs("ID")&"""" &" selected>" & ObjRs("Title") & "</option>"
Else
ClassList1 = ClassList1 & "<option value=""ss.asp?Depth=1&ClassID="&ObjRs("ID")&""""&">" & ObjRs("Title") & "</option>"
End If
objRs.Movenext()
Loop
objRs.CLose
If intDepth = 1 Then
strSql = "Select Id,Title From Bj_Class Where Parent="&ClassID1
objRs.Open strSql,CollectConn,1,1
Do While Not objRs.EOF
ClassList2 = ClassList2 & "<option value="""&ObjRs("ID")&"""" & ">" & ObjRs("Title") & "</option>"
objRs.Movenext()
Loop
objRs.CLose
End If
Set objRs = Nothing
%>
<table width="100%" border="0" cellpadding="0" cellspacing="0">
<form name="AddSiteForm" method="post" action=""><input name="vs" type="hidden" id="vs2" value="add">
<tr>
<td height="26"> <div align="center">目标栏目</div></td>
<td>
<select name="ClassId0" style="width:30%;" id="select" onChange="javascript:location.href=this.options[this.selectedIndex].value;">
<option value="ss.asp?Depth=0&ClassID=0">一级分类</option>
<% = ClassList0 %>
</select>--
<select name="ClassId1" style="width:30%;" id="select" onChange="javascript:location.href=this.options[this.selectedIndex].value;">
<option value="ss.asp?Depth=1&ClassID=0">二级分类</option>
<% = ClassList1 %>
</select>--
<select name="ClassID2" style="width:30%;" id="select">
<option value="">三级分类</option>
<% = ClassList2 %>
</select>
</td>
</tr>
</form>
</table>
</body>
</html>
<%
Set CollectConn = Nothing
%>

J. sql 几种循环方式

1:游标方式

ALTERPROCEDURE[dbo].[testpro]
as

declare@yeardatestrvarchar(20)--日期拼接
declare@meternovarchar(20)--仪表编号
declare@collectindatanamevarchar(30)--数据采集表
declare@collectindataname_backvarchar(30)--数据采集备份表


declare@monsdtvarchar(20)
declare@monedtvarchar(20)

begin


set@yeardatestr=datename(YY,getdate())+datename(MM,getdate())


set@monsdt=Convert(VarChar(4),DatePart(year,GETDATE()))+'-'+Convert(VarChar(2),DatePart(MONTH,DateAdd(MONTH,-2,GETDATE())))+'-01'
set@monedt=CONVERT(VARCHAR(10),DateAdd(DAY,-1,DateAdd(MONTH,2,Convert(datetime,@monsdt,121))),20)

declaremeters_curcursorlocalfast_forward--定义游标
for

openmeters_cur--打开游标
fetchnextfrommeters_curinto@meterno--从游标中取出数据
while@@fetch_status=0--取出数据成功
begin

dbccSHRINKFILE(testdb_log,0)--收缩日志
fetchnextfrommeters_curinto@meterno--下一条
end
closemeters_cur--关闭游标
deallocatemeters_cur--释放游标

end

2:goto方式

nextValue:--循环起点关键字
select@num=ynumfrompp_yunnumwhereprjsht=@prjsht

IF(@flg=1)
set@yunsht='K'+@prjsht+'-'+Convert(varchar(10),@num+1)
ELSE
set@yunsht=REPLACE(@prjsht,'_','')+'-'+dbo.Lpad(@num+1,2,'0')

ifexists(select1frompp_yunwherepp_yun.sht=@yunsht)
begin
updatepp_yunnumsetynum=ynum+1whereprjsht=@prjsht

gotonextValue;--重新从nextValue出执行
end