sqlfound
1. sql%NOTFOUND是什麼是ORACLE的全局變數嗎
是游標的屬性。
cursor%NOTFOUND,布爾值,游標沒有獲取到結果時為 True。與%FOUND結果相反。
游標名稱為 SQL,表明這是一個隱式游標。在程序塊中執行一個語句,就會打開一個游標,並自行管理。
BEGIN
DELETEempWHEREempno='7788';
IFSQL%FOUNDTHEN
dbms_output.put_line('刪除成功。');
ELSE
dbms_output.put_line('沒有數據被刪除。');
ENDIF;
END;
/
2. select found_row()沒效果
判斷Select得到的行數用found_rows()函數進行判斷。
比如說有段sql需要取出一張表的前10行,同時又需要取出符合條件的總數。這在某些分頁操作中很常見在上一查詢之後,你只需要用FOUND_ROWS()就能獲得查詢總數,這個數目是拋掉了LIMIT之後的結果數。
其中第一個sql裡面的SQL_CALC_FOUND_ROWS不可省略,它表示需要取得結果數,也是後面使用FOUND_ROWS()函數的鋪墊。
3. mysql 里是否有sql%notfound
SQL%NOTFOUND,這是隱式游標屬性,這類東西的使用只能在plus腳本裡面,oracle pl/sql的語法
不會出現在MySQL
4. MYSQL中SQL_CALC_FOUND什麼意思
MySQL不符合SQL標準的地方不少,比如TIMESTAMP列的處理,字元串比較默認大小寫不敏感什麼的。有時候這些問題會讓你很郁悶,尤其是對從其它資料庫轉過來的人來說。但有些功能倒也蠻有趣。今天我就發現一個:SQL_CALC_FOUND_ROWS。所謂SQL_CALC_FOUND_ROWS是指在執行帶LIMIT的查詢時,附帶統計一下如果不加LIMIT的話將會輸出多少條結果(注意這個不是估計估計,而是精確的哦)。在做分頁顯示的時候,就可以用這個功能還計算總共有多少頁,性能一定是比不帶LIMIT直接查詢的要高。
不過在沒有搞清楚這個玩意是怎麼實現之前,我對這一方法的性能還是持懷疑態度。一般來說,為了得到精確的數據,訪問所有的數據總是需要的,因此如果I/O是瓶頸的話,這比直接查詢也好不到那裡去。有些查詢倒是可能可以有不少優化的,比如:
T1, T2是兩個表,T1.a引用T2.a,對於查詢
SELECT SQL_CALC_FOUND_ROWS * FROM T1, T2 where T1.b = 'XXX' and T2.a = T1.a;
因為T1中的每條記錄在T2中一定找得到對應的,這樣在SQL_CALC_FOUND_ROWS里就可以不訪問T2也可以統計出精確的結果來。只不過,嘿嘿,不知道這個MySQL有沒有實現。
。
5. 在PL/SQL中怎樣判斷查詢的結果是否為空
1、只有一個查詢結果的查詢:
select min(to_char(b.arrive_date,'yyyymmdd')||lpad(b.arrive_time,6,0)||c.xs_mc)
into vtmpstr
from tb_evt_bag_mail_rela a, tb_evt_route_bag_rela b, tb_jgjm c
where a.mail_num = vmail_num
。。。。。。
對這個查詢,只需判斷變數vtmpstr是否為空就可以了,即:
if vtmpstr is null then
注意:查詢中用聚合函數才可以這樣用,如果直接取一個值,又沒有結果,則會出錯跳出模塊,跑到例外處理那兒去了,如下面語句:
select city_name into vcity_jdj
from tb_county
where xs_code=substr(vrcv_area,1,4);
如果沒有查詢結果,或者多個查詢結果,都會出錯跑到例外處理那兒,所以應該寫成下面格式:
select min(city_name) into vcity_jdj
from tb_county
where xs_code=substr(vrcv_area,1,4);
2、游標的查詢結果:
OPEN cur_get_trans(vin_date,vmail_num);
LOOP
FETCH cur_get_trans
INTO vdeal_date,vdeal_time,vdeal_org_code,vlabel_strip,
vmway_code,vflight_name,vdepart_date,vdepart_time;
--判斷查詢結果
if cur_get_trans%found then
。。。
else
。。。
end if;
或者退出循環處理,即:
OPEN cur_get_trans(vin_date,vmail_num);
LOOP
FETCH cur_get_trans
INTO vdeal_date,vdeal_time,vdeal_org_code,vlabel_strip,
vmway_code,vflight_name,vdepart_date,vdepart_time;
EXIT WHEN cur_get_mail%NOTFOUND;
--處理有結果的查詢
END LOOP;
--處理無結果的查詢
--注意,有查詢結果處理完畢也會執行到此處,所以要區分上面是否進行過有結果的處理。
CLOSE cur_get_trans;
===================================================================
附:
1、游標相關的4個語句:
declare(聲明)、open(打開)、fetch(取數)、close(關閉)。
2、游標相關的4個屬性:%isopen, %found, %notfound,和 %rowcount
(1)%Isopen:布爾型,用於檢測游標是否已經打開。如果游標已經打開,返回true,否則返回false。
(2)%found:布爾型,判斷最近一次執行fetch語句後,是否從緩沖區中提取到數據,返回true,否則返回false。
(3)%notfound:與%found相反。
(4)%rowcount:數值型,返回到目前為止已經從游標緩沖區提取數據的行數。在fetch語句沒有執行之前,該屬性值為0。
使用隱式游標%found屬性,sql%found;
使用顯示游標%found屬性,cur_get_trans%found。
6. SQL SERVER 有沒有類似於 MYSQL SQL_CALC_FOUND_ROWS 的方法
sql server中沒有這樣的函數或方法,不過可以自定義用戶函數,嘿嘿!
sql server的分頁操作和mysql的有所不同,目前來看sql server里沒有這樣的函數或方法,但是可以通過其它的方式來實現,直接上代碼:
select * from (
select name,changliang,addtime,ROW_NUMBER() over(order by id desc) as rownum,(select COUNT(1) from Test_Data) as countdata from Test_Data
) as p where rownum between 3 and 5
在頁面只要讀取countdata 欄位的值就可以了!
當然也可以,在查詢的時候,一次性查詢使用兩個語句返回兩個表,頁面上讀取的時候,讀兩個表,第一個表做記錄,第二個表返回總條數,看語句:
select * from (
select name,changliang,addtime,ROW_NUMBER() over(order by id desc) as rownum from Test_Data
) as p where rownum between 3 and 5;select COUNT(1) from Test_Data
7. Pro C問題:PL/SQL found semantic errors
EXEC SQL SELECT BN_BANK_NAME INTO :s_name from ken_CardCenter where BN_CARDCENTER_ID='9999';
8. PL SQL 查詢結果為空的怎麼排序到最後面
1、只有一個查詢結果的查詢:
select min(to_char(b.arrive_date,'yyyymmdd')||lpad(b.arrive_time,6,0)||c.xs_mc)
into vtmpstr
from tb_evt_bag_mail_rela a, tb_evt_route_bag_rela b, tb_jgjm c
where a.mail_num = vmail_num
。。。。。。
對這個查詢,只需判斷變數vtmpstr是否為空就可以了,即:
if vtmpstr is null then
注意:查詢中用聚合函數才可以這樣用,如果直接取一個值,又沒有結果,則會出錯跳出模塊,跑到例外處理那兒去了,如下面語句:
select city_name into vcity_jdj
from tb_county
where xs_code=substr(vrcv_area,1,4);
如果沒有查詢結果,或者多個查詢結果,都會出錯跑到例外處理那兒,所以應該寫成下面格式:
select min(city_name) into vcity_jdj
from tb_county
where xs_code=substr(vrcv_area,1,4);
2、游標的查詢結果:
open cur_get_trans(vin_date,vmail_num);
loop
fetch cur_get_trans
into vdeal_date,vdeal_time,vdeal_org_code,vlabel_strip,
vmway_code,vflight_name,vdepart_date,vdepart_time;
--判斷查詢結果
if cur_get_trans%found then
。。。
else
。。。
end if;
或者退出循環處理,即:
open cur_get_trans(vin_date,vmail_num);
loop
fetch cur_get_trans
into vdeal_date,vdeal_time,vdeal_org_code,vlabel_strip,
vmway_code,vflight_name,vdepart_date,vdepart_time;
exit when cur_get_mail%notfound;
--處理有結果的查詢
end loop;
--處理無結果的查詢
--注意,有查詢結果處理完畢也會執行到此處,所以要區分上面是否進行過有結果的處理。
close cur_get_trans;
===================================================================
附:
1、游標相關的4個語句:
declare(聲明)、open(打開)、fetch(取數)、close(關閉)。
2、游標相關的4個屬性:%isopen, %found, %notfound,和 %rowcount
(1)%isopen:布爾型,用於檢測游標是否已經打開。如果游標已經打開,返回true,否則返回false。
(2)%found:布爾型,判斷最近一次執行fetch語句後,是否從緩沖區中提取到數據,返回true,否則返回false。
(3)%notfound:與%found相反。
(4)%rowcount:數值型,返回到目前為止已經從游標緩沖區提取數據的行數。在fetch語句沒有執行之前,該屬性值為0。
使用隱式游標%found屬性,sql%found;
使用顯示游標%found屬性,cur_get_trans%found。
9. 執行完一段SQL語句後,"if sql%notfound then"表示什麼意思
sql是系統自動創建隱式游標
隱式游標自動聲明、打開和關閉,其名為 SQL
通過檢查隱式游標的屬性可以獲得最近執行的DML 語句的信息
隱式游標的屬性有:
SQL%FOUND – SQL 語句影響了一行或多行時為 TRUE
SQL%NOTFOUND – SQL 語句沒有影響任何行時為TRUE
SQL%ROWCOUNT – SQL 語句影響的行數
SQL%ISOPEN - 游標是否打開,始終為FALSE