PIXNET Logo登入

zer931的部落格

跳到主文

歡迎光臨zer931在痞客邦的小天地

部落格全站分類:不設分類

  • 相簿
  • 部落格
  • 留言
  • 名片
  • 7月 04 週三 201222:37
  • cocos2d學習筆記(2) – touch事件處理







From http://www.richarddz.net/archives/52


八月 21st, 2011cocos2d学习笔记(2) – touch事件处理




Posted by richard in iOS游戏编程, iOS编程

CCLayer是cocos2d处理事件的地方。文档写的很清楚。


CCLayer is a subclass of CCNode that implements the TouchEventsDelegate protocol.
All features from CCNode are valid, plus the following new features:



  • It can receive iPhone Touches

  • It can receive Accelerometer input


CCLayer有两个属性,控制是否响应事件。


BOOL isTouchEnabled
BOOL isAccelerometerEnabled


处理touch事件,第一个属性要设置成YES。



先看看iOS的事件响应机制。事件由UIApplication交给它的key window来分发。
事件分成两类multi-touch事件和非touch事件。
前一类事件,window会做hitTest,找到包含触点的最终view作为响应事件的first responder。
后一类事件,事先指定first responder,window直接交给它。
如果first responder没有处理这个事件,事件就沿着responder chain逐层向上寻找能够处理事件的responder object。第一站通常是view controller (if any),然后就是super view,最后到window和UIApplication的singleton。如图。


作为所有responder objects的超类,UIResponder声明了如下接口用来响应touch事件。


- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event

Began发生在手指在屏幕上落下时;Moved发生在落下的手指位置变化时;Ended发生在手指抬起时;如果有以外的来电等事件打断了这个 multi-touch事件,touch就会被系统Cancel。一个完整的touch event,始于第一个手指落在屏幕上,结束于最后一个手指抬起,或者结束于Cancelled。touches是UITouch对象的集 合,UITouch对象包含了touch的时空信息。


现在回头再看cocos2d的响应机制。CCLayer继承了两个协议:CCStandardTouchDelegate和 CCTargetedTouchDelegate。前一个协议的方法就是iOS的UIResponder里面声明的那四个方法,只不过前缀了cc。后一个 协议声明如下:


@protocol CCTargetedTouchDelegate 
- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event;
@optional
- (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event;
- (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event;
- (void)ccTouchCancelled:(UITouch *)touch withEvent:(UIEvent *)event;
@end

文档说,用CCTargetedTouchDelegate有两个好处:第一,你不需要自己去处理NSSet,cocos2d每次只给你一个 touch;第二,在ccTouchBegan里面,return YES来claim一下,那么只有claim了这个touch的delegate才能收到关于此touch的更新。但是,要用Targeted方式接收事 件,必须重写CCLayer的registerWithTouchDispatcher方法。
方法默认是这样实现的:


-(void) registerWithTouchDispatcher {
[[CCTouchDispatcher sharedDispatcher] addStandardDelegate:self priority:0];
}

文档给了一个重写的示例:


-(void) registerWithTouchDispatcher {
[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self
priority:INT_MIN+1
swallowsTouches:YES];
}

这个swallowsTouches的意思是吃掉claimed touches,于是,没有claim这些touches的delegate就无法接收到响应的touch事件了。






(繼續閱讀...)
文章標籤

zer931 發表在 痞客邦 留言(0) 人氣(128)

  • 個人分類:基本概念
▲top
  • 5月 20 週日 201222:07
  • 取得指南針 / 羅盤 / Magnetometer 數值的方法

From http://furnacedigital.blogspot.com/2011/12/magnetometer.html
取得指南針 / 羅盤 / Magnetometer 數值的方法
 

 

目前大部份的 iOS 裝置都有支援 Magnetometer 指南針的功能,透過 Core Location 的Framework 就可以輕易取得 Magnetometer 當前的數值(角度),請看以下程式碼示範。

首先加入對應的 Framework,與標頭檔,如果不知道如何新增 Framework 的讀者們,可以參考 Xcode 4 新增 Framework 的方法一文。













1



#import <CoreLocation/CoreLocation.h>






之後在對應的 Class 中設定 CLLocationManagerDelegate 的代理方法,並增加一個 CLLocationManager 型態的指標 locationManager,如下(此範例是寫在 ViewCotroller 中)。











1

2

3

4



@interfaceMLViewController :UIViewController<CLLocationManagerDelegate> {

 

CLLocationManager*locationManager;

}






接著 回到程式碼中對 locationManager 進行初始化的動作,並且設定其更新的角度度數。











1

2

3

4

5

6

7

8

9



//locationManager初始化(已使用ARC機制)

locationManager = [[CLLocationManageralloc] init];

locationManager.delegate =self;

 

//設定需要重新定位的角度差距

locationManager.headingFilter =3;

 

[locationManager startUpdatingLocation];

[locationManager startUpdatingHeading];






完成上述設置之後,下面我們就可以開始使用 Framework 所提供的功能來取得指南針的角度讀數,每當指南針的角度變化大於上述所設定的角度差距,就會呼叫下列的內建函式。











1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17



//內建函式

- (void)locationManager:(CLLocationManager*)manager didUpdateHeading:(CLHeading*)newHeading {

 

   //判斷magneticHeading的精準度

   if(newHeading.headingAccuracy >0) {

 

       //取得角度值-磁北(0-北, 90-東, 180-南, 270-西)

       CLLocationDirectiontheHeading = newHeading.magneticHeading;

 

       //取得角度值-正北(0-北, 90-東, 180-南, 270-西)

       //CLLocationDirection theHeading = newHeading.trueHeading;

 

       NSLog(@"%f", theHeading);

   } else{

       NSLog(@"需校正");

   }

}






上述程式碼中 headingAccuracy 是一個 double 形態的唯讀值,它代表了真正磁北與 magneticHeading 之間的誤差值,正常運作下 headingAccuracy 皆為正值,如果出現負數則代表 magneticHeading 要做 8 字形的校正。



若在使用上有需要系統做校正上的提示,可以使用下列內建函式,並回傳一個 YES 的布林值。










1

2

3

4



//內建函式

- (BOOL)locationManagerShouldDisplayHeadingCalibration:(CLLocationManager*)manager {

   returnYES;

}






ps:有關 Core Location 的其它應用,可以參考使用 Core Location 做簡易的定位ㄧ文。
(繼續閱讀...)
文章標籤

zer931 發表在 痞客邦 留言(0) 人氣(263)

  • 個人分類:技巧篇
▲top
  • 5月 20 週日 201221:44
  • [IPHONE]在 iOS 應用中使用 GPS

From http://fecbob.pixnet.net/blog/post/35423944
在 iOS 應用中使用 GPS大致分下麵兩步:1、添加 CoreLocation.framework;2、生成 CLLocationManager 測量位置。 測試代碼如下: // LocationViewCtrl.h #import UIKit/UIKit.h #import CoreLocation/CoreLocation.h @inter
在 iOS 應用中使用 GPS大致分下麵兩步:1、添加 CoreLocation.framework;2、生成 CLLocationManager 測量位置。
 
(繼續閱讀...)
文章標籤

zer931 發表在 痞客邦 留言(0) 人氣(128)

  • 個人分類:技巧篇
▲top
  • 3月 18 週日 201216:05
  • 正確推出鍵盤和消失的方法


FROM http://pingguohe.net/2011/08/21/keyboard-show/
正确推出键盘和消失的方法
在iOS5中苹果对中文输入法进行了升级。在拼音模式下,键盘的上方增加了一条候选栏。在不少程序中键盘弹出后,拼音输入法的候选栏遮住了输入框。
造成这个问题的原因是因为,很多程序在处理键盘弹出和隐藏的的时候,过分简单的把键盘的高度写成了一个常量。然后把输入框推高了一个定死的高度。
在iOS5中这个方法就行不通了,如果把view推高的高度设成是中文键盘的高度。那么在英文输入状态下。键盘和其他的view之间就会流出一段候选栏高度的空白。
(繼續閱讀...)
文章標籤

zer931 發表在 痞客邦 留言(0) 人氣(268)

  • 個人分類:技巧篇
▲top
  • 3月 17 週六 201215:39
  • CustomCell 自适应高度+label自动换行+ UITextView 根据内容自动调整高度

FROM http://hi.baidu.com/%B0%D9ii%D6%AAi%B5%C0/blog/item/98a9d6cfe53ded440eb3457b.html
CustomCell 自适应高度+label自动换行+ UITextView 根据内容自动调整高度
2011/03/26 11:48
CustomCell 自适应高度
//Customiz the height of table view cell
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
   Status * sts = [statuses objectAtIndex:indexPath.row];
    NSString *cellText = sts.text;
    UIFont *cellFont = [UIFont fontWithName:@"Helvetica" size:17.0];
    CGSize constraintSize = CGSizeMake(240.0f, MAXFLOAT);
    CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];
   
   
    return labelSize.height + 20;
}
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 
    static NSString *CellIdentifier = @"Cell";
   
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        //cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
       // cell.textLabel.numberOfLines = 0;
        //cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:17.0];
    }
    Status *sts = [statuses objectAtIndex:indexPath.row];
    //cell.textLabel.text = sts.user.screenName;
    //cell.detailTextLabel.text = sts.text;
   
    UILabel * label = [[UILabel alloc]initWithFrame:CGRectMake(80, 0, 240, 20)];
    label.text = sts.user.screenName;
    [cell addSubview:label];
    [label release];
   
    NSString *cellText = sts.text;
    UIFont *cellFont = [UIFont fontWithName:@"Helvetica" size:12.0];
    CGSize constraintSize = CGSizeMake(240.0f, MAXFLOAT);
    CGSize labelHeight = [cellText sizeWithFont:cellFont];
    CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];
   
    UILabel* tv = [[UILabel alloc]initWithFrame:CGRectMake(80, 20, labelSize.width, labelSize.height)];
    tv.text = sts.text;
    tv.textColor = [UIColor yellowColor];
    tv.numberOfLines = ceil(labelSize.height/labelHeight.height);
    tv.lineBreakMode = UILineBreakModeWordWrap;
    tv.backgroundColor = [UIColor grayColor];
    //[label sizeToFit];
    [cell addSubview:tv];
    [tv release];
    // Configure the cell.
    return cell;
}
(繼續閱讀...)
文章標籤

zer931 發表在 痞客邦 留言(0) 人氣(1,026)

  • 個人分類:技巧篇
▲top
  • 2月 13 週一 201221:54
  • 在ios使用sqlite的救贖 - FMDB




在ios使用sqlite的救贖 - FMDB


FROM http://popcornylu.blogspot.com/2011/06/iossqlite-fmdb.html


 

最近有個專案需要小型資料庫,當然首選一定是iOS內建的sqlite,但是因為他是C的lib,使用上是出了名的困難。之前就有聽說用sqlite可以使用FMDB這個objective-c wrapper library。果不其然的簡單易用,我馬上把我使用經驗跟大家分享,如果你想馬上體驗,也可以去抓我的Sample project - MySqlite。
安裝FMDB
方法很簡單,就跟所有的open source library一樣的三步驟。
1. 首先你要先把 libsqlite3.dylib 加進library
2. 在需要用到FMDB的檔案中#import "FMDatabase.h"
3. 把FMDB的.h跟.m加進你的project中
接著就可以開心的使用FMDB
產生Database
基本上就是透過+[FMDatabase databaseWithPath]取產生Database instance。

NSURL *appUrl = [[[NSFileManager defaultManager]
URLsForDirectory:NSDocumentDirectory
inDomains:NSUserDomainMask] lastObject];
NSString *dbPath = [[appUrl path] stringByAppendingPathComponent:@"MyDatabase.db"];
FMDatabase* db = [FMDatabase databaseWithPath:dbPath];
if (![db open]) {
NSLog(@"Could not open db");
}


產生所需table
其實寫過sql的應該對接下來的動作都不陌生,都一樣就是sql語法囉,詳細的請參考sqlite文件
下面的動作是產生一個user的table,並且有uid, name, descritpion三個column。我們使用IF NOT EXISTS來保證table不存在才會產生table。

if(![db executeUpdate:@"CREATE TABLE IF NOT EXISTS user (uid integer primary key asc autoincrement, name text, description text)"])
{
NSLog(@"Could not create table: %@", [db lastErrorMessage]);
}


新增record
在FMDB中,它有提供很貼心類似-[NSString stringWithFormat:...]的功能,但是比較不一樣的是如果你是字串,它會幫你加上括號,使用上更為便利。

if(![db executeUpdate:@"INSERT INTO user (name, description) VALUES (?,?)", name, description])
{
NSLog(@"Could not insert data: %@", [db lastErrorMessage]);
}


刪除record
一樣是下sql語法,這邊比較需要注意的是如果你要傳進去的是int, double這種基本形態,記得要轉換成物件,也就是用+[NSNumber numberWithInt]去轉換

if(![_db executeUpdate:@"DELETE FROM user WHERE uid = ?", [NSNumber numberWithInt:uid]])
{
NSLog(@"Could not delete data: %@", [db lastErrorMessage]);
}


查詢資料
在FMDB中有提供另外一個class FMResultSet來存放查詢出來的records,透過-[FMResultSet next]來iterate出所有的record

NSMutableArray* items = [NSMutableArray arrayWithCapacity:0];
FMResultSet *rs = [db executeQuery:@"SELECT uid, name, description from user"];
while ([rs next]) {
int uid = [rs intForColumn:@"uid"];
NSString *name = [rs stringForColumn:@"name"];
NSString *description = [rs stringForColumn:@"description"];
[items addObject:[NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:uid], @"uid",
name, @"name",
description, @"description",
nil]];
}
[rs close];


基 本上在其他oo平台中有用過sql的,對於FMDB的設計應該並不陌生,可以說完全不會有太多的困難。而相較於用傳統的plist或是archive的方 法,我相信不管是效能上或是功能上,Sqlite+FMDB的組合絕對會更有優勢。對於中型以上的iOS程式應該會是標準配備。







(繼續閱讀...)
文章標籤

zer931 發表在 痞客邦 留言(0) 人氣(497)

  • 個人分類:DataBase
▲top
  • 2月 13 週一 201212:08
  • [Oracle] Cursor 與 Cursor Variable 的使用


[Oracle] Cursor 與 Cursor Variable 的使用
 FROM http://godleon.blogspot.com/2008/12/oracle-cursor-cursor-variable.html

何謂 Cursor ?
cursor 為 PL/SQL 中內建的一種 pointer,可用來擷取整個資料集合,並讓使用者可以逐筆資料的進行存取。
在 Oracle 中,cursor 分為兩種,分別是:

  • implicit(內隱) cursor 
    在 Oracle 所提供的功能中,可以發現許多 implicit cursor 的蹤跡,例如:PL/SQL 中的 FOR…LOOP。 
    而這一類的 cursor 是沒有辦法透過程式去控制的,而是由 Oracle 本身來進行控制與管理。 

  • explicit(外顯) cursor 
    此種 cursor 就可以透過開發 PL/SQL 的方式來進行控制與管理,讓管理者可以有很大的彈性來使用。


  • 預設中,Oracle 提供了上限 50 個 cursor 可供使用,但若因為開發需求而導致同時需要更多的 cursor 時,可以透過調整起始參數「OPEN_CURSOR」來達成。
     
    使用 Explicit Cursor
    每個 explicit cursor 都會有以下幾個屬性作為程式控制之用:

  • %NOTFOUND 
    根據從資料集合中擷取的最後一筆資料,來決定回傳 TRUE(有資料) or FALSE(沒資料)。 

  • %FOUND 
    與 %NOTFOUND 相反。 

  • %ROWCOUNT 
    回傳資料集合中所包含的資料筆數。當 cursor 從資料集合擷取過資料後,就可以使用此屬性。 

  • %ISOPEN 
    若是 cursor 狀態為 open,則回傳 TRUE;反之則回傳 FALSE。


  • 為了暫時存放從 cursor 擷取出來的資料列,必須定義一個暫存的變數,而這個變數的型態通常為一列資料(row data)。
    以下介紹 cursor 使用的語法: (更詳細的語法可以參考官方網站文件) 

    DECLARE
    --宣告 cursor,並指定擷取資料集合的 SQL 語法(query_definition)
    CURSOR cursor_name type IS query_definition;
    --開啟 cursor(此時會根據宣告時中定義的 SQL 語法取得資料集合)
    OPEN cursor_name
    LOOP
    --取得 cursor 目前所在的資料列(必須使用暫存變數來儲存取得的資料列)
    FETCH record INTO buffer_var;
    --當 cursor 已經將資料集合的資料巡覽完畢
    EXIT WHEN cursor_name%NOTFOUND;
    --各式各樣的處理工作
    ...;
    END LOOP;
    --關閉 cursor(之後 cursor 就不能再繼續使用)
    CLOSE cursor_name;

     
     
    接著介紹使用範例: 

    --PROCEDURE 的實作內容
    PROCEDURE eval_department(department_id IN employees.department_id%TYPE) AS
    --宣告暫存變數,儲存 cursor data
    emp_record employees%ROWTYPE;
    --宣告變數,檢查所有員工是否需要重新評估績效
    all_evals BOOLEAN;
    --今日日期
    today DATE;
    --宣告 cursor
    CURSOR emp_cursor IS
    SELECT *
    FROM employees e
    WHERE department_id = e.department_id;
    BEGIN
    --根據月份判斷是否重新計算績效
    today := SYSDATE;
    IF(EXTRACT(MONTH FROM today) < 6) THEN
    --僅針對新進員工計算績效
    all_evals := FALSE;
    ELSE
    --全部重新計算
    all_evals := TRUE;
    END IF;
    --開啟 cursor
    OPEN emp_cursor;
    DBMS_OUTPUT.PUT_LINE('Determining evaluations necessary in department #' || department_id);
    LOOP
    --透過 cursor 取得一筆資料並存入暫存變數
    FETCH emp_cursor INTO emp_record;
    --若 cursor 已將資料取完,則跳出迴圈
    EXIT WHEN emp_cursor%NOTFOUND;
    IF all_evals THEN
    --呼叫之前宣告的 procedure
    add_eval(emp_record.employee_id, today);
    ELSIF(eval_frequency(emp_record.employee_id) = 2) THEN
    --呼叫之前宣告的 procedure
    add_eval(emp_record.employee_id, today);
    END IF;
    END LOOP;
    DBMS_OUTPUT.PUT_LINE('Processed ' || emp_cursor%ROWCOUNT || ' records.');
    --關閉 cursor
    CLOSE emp_cursor;
    END eval_department;

     
     
    使用 Cursor Variable:REF Cursor
    從上面 cursor 的使用方式可以知道,由於 cursor 的使用必須寫在 subprogram 中,並無法在程式中動態的變更所擷取的資料,因此在使用上是靜態的。
    然而,若要在程式中動態的改變 cursor 所擷取的資料,或是將 cursor 所取到的資料集合當作參數傳到另一個 subprogram 中,就必須改用 REF Cursor 了!
    什麼是 cursor variable 呢? 簡單來說,就是「儲存指向實際 cursor 的指標的變數」,以下用一張簡單的圖來說明:

    其中假設實際 cursor 所在的記憶體位址為 0XBC34AD,而 cursor variable 儲存的就是 0XBC34AD 這個記憶體位址,而非 cursor 本身。
    也由於 cursor variable 有如此特性,因此假設同時有多個 cursor 同時開啟,就可以將不同的記憶體位址指定給 cursor variable,這樣就可以讓 cursor variable 很快速的取得不同 cursor 從資料庫所擷取到的不同資料。
    【附註】cursor 將資料從資料庫取出後,就存放於記憶體中,接著後續的處理就會很快速。
    瞭解 cursor variable 與 ref cursor 的關係後,就先來說明使用的語法: 

    DECLARE
    --定義 ref cursor 與回傳值的資料型態(return_type),稱為 strongly typed
    --也可不定義回傳的資料型態,稱為 weakly typed
    TYPE cursor_type IS REF CURSOR RETURN return_type;
    --定義 cursor variable(為 cursor pointer,指向實際的 cursor)
    cursor_variable cursor_type;
    --定義變數儲存 cursor 回傳的資料
    single_record return_type;
    --使用 cursor variable 開啟 cursor,並依照 query_definition 從資料庫取得資料
    OPEN cursor_variable FOR query_definition;
    LOOP
    --取得一筆資料,暫存入 single_record 中
    FETCH record INTO single_record;
    --資料集合已經巡覽完畢,離開迴圈
    EXIT WHEN cursor_name%NOTFOUND;
    --任何其他實作置於此處
    ...;
    END LOOP;
    --關閉 cursor
    --注意! 不是 cursor_variable 喔!
    CLOSE cursor_name;

     
    有一點需要注意到的是,在定義 ref cursor 時不一定需要同時定義回傳值(return_type)。
    若是有定義回傳值,則 cursor 取回來的資料為 strongly typed;反之若是沒有定義回傳值,cursor 取回的資料則為 weakly typed。
    若是 strongly typed,若是在程式撰寫中發生與定義型別不符的錯誤,就可以在編譯(compile)時期發現;而若是 weakly typed,由於沒有定義回傳型別,因此在使用時可以給定任何型別,若是使用上小心點,似乎也提供了蠻大的彈性。
     
    REF CURSOR 使用範例
    首先先將 ref cursor 與其他 subprogram 的定義放到 package specification 中: 

    CREATE OR REPLACE PACKAGE EMP_EVAL AS
    -- 宣告 PROCEDURE 與 FUNCTION
    PROCEDURE eval_department(department_id IN employees.department_id%type);
    --計算所有人的績效
    PROCEDURE eval_everyone;
    --定義 ref cursor
    TYPE emp_refcursor_type IS REF CURSOR RETURN employees%ROWTYPE;
    END EMP_EVAL;

     
     
    接著是其他 subprogram 的實作部份: 

    --PROCEDURE 的實作內容
    PROCEDURE eval_department(department_id IN employees.department_id%TYPE) AS
    --宣告 cursor variable (型態為 package specification 中定義的 emp_refcursor_type)
    emp_cursor emp_refcursor_type;
    --目前正在處理的部門ID
    department_curr departments.department_id%TYPE;
    BEGIN
    department_curr := department_id;
    FOR loop_c IN 1..3
    LOOP
    --開啟 cursor
    OPEN emp_cursor FOR
    SELECT *
    FROM employees e
    WHERE e.department_id = department_curr;
    eval_loop_control(emp_cursor);
    DBMS_OUTPUT.PUT_LINE('Determining necessary evaluations in department #' || department_curr);
    --關閉 cursor
    CLOSE emp_cursor;
    department_curr := department_curr + 10;
    END LOOP;
    END eval_department;
    PROCEDURE add_eval(emp_record IN employees%ROWTYPE, today IN DATE) AS
    BEGIN
    --新增資料
    INSERT INTO evaluations VALUES( evaluations_seq.NEXTVAL,
    emp_record.employee_id,
    today,
    emp_record.job_id,
    emp_record.manager_id,
    emp_record.department_id,
    0);
    END add_eval;
    PROCEDURE eval_loop_control(emp_cursor IN emp_refcursor_type) AS
    --定義暫存變數,儲存透過 cursor 擷取的資料
    emp_record employees%ROWTYPE;
    --宣告變數,檢查所有員工是否需要重新評估績效
    all_evals BOOLEAN;
    --今日日期
    today DATE;
    BEGIN
    --取得今天的日期
    today := SYSDATE;
    IF(EXTRACT(MONTH FROM today) < 6) THEN
    all_evals := FALSE;
    ELSE
    all_evals := TRUE;
    END IF;
    LOOP
    --透過 cursor 擷取一筆資料
    FETCH emp_cursor INTO emp_record;
    --當 cursor 已經將資料擷取完畢,跳離迴圈
    EXIT WHEN emp_cursor%NOTFOUND;
    IF all_evals THEN
    add_eval(emp_record, today);
    ELSIF(eval_frequency(emp_record.employee_id) = 2) THEN --呼叫其他 subprogram,先忽略這邊
    add_eval(emp_record, today);
    END IF;
    END LOOP;
    END eval_loop_control;
    PROCEDURE eval_everyone AS
    --宣告 cursor variable (型態為 package specification 中定義的 emp_refcursor_type)
    emp_cursor emp_refcursor_type;
    BEGIN
    --開啟 cursor,取得資料集合
    OPEN emp_cursor FOR SELECT * FROM employees;
    DBMS_OUTPUT.PUT_LINE('Determining the number of necessary evaluations');
    --呼叫 subprogram,傳入 cursor variable
    eval_loop_control(emp_cursor);
    DBMS_OUTPUT.PUT_LINE('Processed ' || emp_cursor%ROWCOUNT || ' records.');
    --關閉 cursor (上面呼叫的 subprogram 並未把 cursor 關閉)
    CLOSE emp_cursor;
    END eval_everyone;
    (繼續閱讀...)
    文章標籤

    zer931 發表在 痞客邦 留言(0) 人氣(4,557)

    • 個人分類:ORACLE
    ▲top
    • 2月 10 週五 201218:30
    • 初识SQLITE3

    初识SQLITE3 (2007-09-23 02:47)
     from http://blog.chinaunix.net/space.php?uid=20619057&do=blog&id=1612259
     
    (繼續閱讀...)
    文章標籤

    zer931 發表在 痞客邦 留言(0) 人氣(74)

    • 個人分類:DataBase
    ▲top
    • 2月 07 週二 201212:23
    • NSPredicate利用一个数组的数据来过滤另一个数组




    NSPredicate利用一个数组的数据来过滤另一个数组  


     





    (繼續閱讀...)
    文章標籤

    zer931 發表在 痞客邦 留言(0) 人氣(40)

    • 個人分類:技巧篇
    ▲top
    • 2月 04 週六 201212:39
    • iPhone:在Core Data应用中使用原生Sql功能

     

    iPhone:在Core Data应用中使用原生Sql功能
    2010-01-20 14:35作者:天极网开发频道出处:天极网软件频道责任编辑:郑重
    (繼續閱讀...)
    文章標籤

    zer931 發表在 痞客邦 留言(0) 人氣(4)

    • 個人分類:DataBase
    ▲top
    «1...910

    個人資訊

    zer931
    暱稱:
    zer931
    分類:
    不設分類
    好友:
    累積中
    地區:

    熱門文章

    • (4,557)[Oracle] Cursor 與 Cursor Variable 的使用
    • (263)取得指南針 / 羅盤 / Magnetometer 數值的方法
    • (3,981)VMware 的 Bridged, Host-only 和 NAT 網路型態
    • (4,496) NO-IP 使用教學
    • (248)搭建 Windows 上 Apache + Git 服务器
    • (141)NSArray與NSMutableArray與NSMutableDictionary
    • (270)UITableView cell自訂視圖中插入Table實現複雜介面
    • (7,044)C/C++ 箭頭(->) 、點(.)、雙冒號(::) 用法
    • (316)iOS 開發筆記 - 國曆轉農曆計算

    文章分類

    toggle GIT (3)
    • GIT MAC (1)
    • GIT Linux (2)
    • GIT Win (9)
    toggle PHP (3)
    • Server 設定 (4)
    • 程式技巧篇 (4)
    • PDO (1)
    toggle COCOS2D (2)
    • BOX2D (2)
    • 基本概念 (21)
    toggle IOS (4)
    • PUSH SERVER (2)
    • 基本概念 (21)
    • DataBase (3)
    • 技巧篇 (20)
    • VMWare (3)
    • Winodws (2)
    • C++ (2)
    • ORACLE (2)
    • 未分類文章 (1)

    最新文章

    • PHP.INI 打開DeBug模式
    • [JavaScript]null & undefined
    • 使用PDO時 產生 Zend Debugger Socket link error
    • phpMyAdmin sql query that uses parameters
    • PDO 介紹範例網址
    • genstrings across 多元路徑 Localizable
    • 實作 TableView Section 展開/收合
    • 分享一个搭建php版push服务器的流程
    • Push pem文件生成步骤
    • mac eclipse 設定php debugger

    動態訂閱

    文章精選

    文章搜尋

    誰來我家

    參觀人氣

    • 本日人氣:
    • 累積人氣: