當前位置:首頁 » 編程語言 » 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