明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

游標(biāo)的作用及屬性介紹

[摘要]游標(biāo)的作用及屬性游標(biāo)的作用就是用于對查詢數(shù)據(jù)庫所返回的記錄進(jìn)行遍歷,以便進(jìn)行相應(yīng)的操作;游標(biāo)有下面這些屬性: a、游標(biāo)是只讀的,也就是不能更新它; b、游標(biāo)是不能滾動(dòng)的,也就是只能在一個(gè)...
游標(biāo)的作用及屬性

游標(biāo)的作用就是用于對查詢數(shù)據(jù)庫所返回的記錄進(jìn)行遍歷,以便進(jìn)行相應(yīng)的操作;游標(biāo)有下面這些屬性:

a、游標(biāo)是只讀的,也就是不能更新它;

b、游標(biāo)是不能滾動(dòng)的,也就是只能在一個(gè)方向上進(jìn)行遍歷,不能在記錄之間隨意進(jìn)退,不能跳過某些記錄;

c、避免在已經(jīng)打開游標(biāo)的表上更新數(shù)據(jù)。

實(shí)現(xiàn)功能,將數(shù)據(jù)量比較大的nt_m_gpsdata(3000W+),按日期拆分成如nt_m_gpsdata20170501,nt_m_gpsdata20170502,nt_m_gpsdata20170503等

CREATE PROCEDURE `new_procedure` ()

BEGIN

-- 需要定義接收游標(biāo)數(shù)據(jù)的變量

DECLARE a CHAR(16);

-- 定義新建表名

DECLARE tbname CHAR(30);

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

DECLARE sqlstr1 varchar(300);

DECLARE sqlstr2 varchar(300);

-- 遍歷數(shù)據(jù)結(jié)束標(biāo)志

DECLARE done INT DEFAULT FALSE;

-- 定義游標(biāo)

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

-- 將結(jié)束標(biāo)志綁定到游標(biāo)

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

-- 打開游標(biāo)

OPEN cur;

-- 開始循環(huán)

read_loop: LOOP

-- 提取游標(biāo)里的數(shù)據(jù),這里只有一個(gè),多個(gè)的話也一樣;

FETCH cur INTO a;

-- 聲明結(jié)束的時(shí)候

IF done THEN

LEAVE read_loop;

END IF;

-- 這里做你想做的循環(huán)的事件

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

-- select tbname;

-- 復(fù)制表結(jié)構(gòu),create table newtable select * from oldtable where 1=2 只能復(fù)制表字段,無法復(fù)制字段主鍵、自增、非空等屬性 create table newtable like oldtable 可以復(fù)制字段屬性

    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;

-- 關(guān)閉游標(biāo)

CLOSE cur;

END

后來又將這個(gè)分表策略應(yīng)用到一個(gè)oracle項(xiàng)目,附上代碼

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;

以上就是游標(biāo)的作用及屬性介紹的詳細(xì)內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!


學(xué)習(xí)教程快速掌握從入門到精通的SQL知識。