首頁 >資料庫 >mysql教程 >遊標的作用及屬性介紹

遊標的作用及屬性介紹

rayZ
rayZ原創
2017-07-26 09:24:273773瀏覽

遊標的作用及屬性

遊標的作用就是用來對查詢資料庫所傳回的記錄進行遍歷,以便進行對應的操作;遊標有以下這些屬性:

    a、遊標是唯讀的,也就是不能更新它;

    b、遊標是不能滾動的,也就是只能在一個方向上進行遍歷,不能在記錄之間隨意進退,不能跳過某些記錄;

    c、避免在已開啟遊標的表格上更新資料。

實作功能,將資料量比較大的nt_m_gpsdata(3000W+),依日期分割成如nt_m_gpsdata20170501,nt_m_gpsdata20170502,nt_m_gpsdata20170503等
##F1

#BEGIN

-- 需要定義接收遊標資料的變數

DECLARE a CHAR(16);

-- 定義新表名

#DECLARE tbname CHAR(30);

-- 定義存放sql語句的變數

DECLARE sqlstr1 varchar(300);

#DECLARE sqlstr2 varchar(300);

-- 遍歷資料結束標誌

DECLARE done INT DEFAULT FALSE;

-- 定義遊標

DECLARE cur CURSOR FOR select DISTINCT DATE_FORMAT(ctime,'% Y%m%d') as ctime from nt_m_gpsdata;

-- 將結束標誌綁定到遊標

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

# -- 開啟遊標

OPEN cur;

-- 開始循環

#read_loop: LOOP

##-- 提取遊標裡的數據,這裡只有一個,多個的文字也一樣;

    FETCH cur INTO a;

    -- 宣告結束的時候

    IF done THEN

      LEAVE read_loop;

    END IF;

    -- 這裡做你想做的循環的事件

        set tbname=CONCAT("nt_m_gpsdata",a);# 

     tbname;

        -- 複製表格結構,create table newtable select * from oldtable where 1=2  只能複製表格字段,無法複製字段主鍵、自增、非空白等屬性  create table newtable like oldtable 可複製欄位屬性

    set sqlstr1 = CONCAT("create table ",tbname," like nt_m_gpsdata");
        set sqlstr2 = CONCAT("insert into ",tbname," select * from nt_m_gpsdata where deleted=0 and DATE_FORMAT(ctime,'%Y%m%d')='",a,"'");
        set @firstsql = sqlstr1;
        PREPARE stmt1 FROM @firstsql;
        EXECUTE stmt1;
        DEALLOCATE PREPARE stmt1;
        set @secondsql = sqlstr2;
        PREPARE stmt2 FROM @secondsql;
        EXECUTE stmt2;
        DEALLOCATE PREPARE stmt2;

END LOOP;

-- 關閉遊標

#CLOSE cur;

END

後來又將這個分錶策略應用到一個oracle項目,附上程式碼

DECLARE
cursor my_cursors is select DISTINCT to_char(ctime,'yyyymmdd') as ctime from NTGIS_GPS_EVENTDATA;
mcursor varchar2(40);
begin
for mcursor in my_cursors loop
DECLARE
tbname VARCHAR2(50) := 'NTGIS_GPS_EVENTDATA'||mcursor.ctime;
sqlstr VARCHAR2(300) := 'CREATE TABLE '||tbname||' as SELECT * from NTGIS_GPS_EVENTDATA where to_char(ctime,''yyyymmdd'')='''||mcursor.ctime||'''';
BEGIN
--dbms_output.put_line(tbname);
execute immediate sqlstr;
END;
end loop;
end;

以上是遊標的作用及屬性介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn