2016-06-08 2 views
0

SQLite에서 하나의 쿼리에서 둘 이상의 select 문을 실행할 수 있습니까? 예를 들어,iOS의 sqlite에서 하나의 쿼리로 여러 select 문을 실행하는 방법은 무엇입니까?

우리는 사용하여

NSString *create_query = @"create table if not exists Employee (id integer primary key, firstName text, lastName text);create table if not exists Department (id integer primary key, department text, devision text)"; 

,

sqlite3_exec(self.contactDB,[create_query UTF8String], NULL, NULL, &errorMessage) == SQLITE_OK) 

우리가 그것을 실행할 수, 쿼리를 만들거나 삽입 실행할 수 있습니다.

그러나 쿼리 인 경우 뭔가 같은

NSString *select_query = @"select * from Employee;select * from Department"; 

는 그 다음 실행할 수 있습니까? 그렇다면 데이터를 sqlite3_step과 어떻게 구별 할 수 있습니까? 같은

일반적으로 우리가 가져 오는되는 데이터,

if (sqlite3_prepare_v2(self.contactDB, [select_query UTF8String], -1, &statement, NULL) == SQLITE_OK) { 
    NSLog(@"prepared from data get"); 

    while (sqlite3_step(statement) == SQLITE_ROW) { 
     NSString *department = [[NSString alloc]initWithUTF8String:(const char*)sqlite3_column_text(statement, 1)]; 
     NSString *devision = [[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statement, 2)]; 

     NSLog(@"Department : %@, Devision : %@",department,devision); 
    } 
    NSLog(@"errror1 is %s",sqlite3_errmsg(self.contactDB)); 
} 

그러나

두 개의 선택 사항이 sqlite3_step에 행과 열을 식별하는 방법을 다음이 있다면?

터미널에서 두 개의 select 문을 함께 실행할 수 있습니다 (즉, select * from Employee, select from * from Department). 그래서 iOS에서 어떤 식 으로든 사용해야합니다.

+0

각 문은 예를 들어 큰 따옴표로해야한다; const char * sql_stmt = "select 1 .....;" "선택 2 .....;" ; –

+1

'sqlite3_exec'을 사용하고 콜백 함수를 사용할 수 있습니다. 또는 열 수/유형이 두 쿼리에서 동일하면 단일 UNION 쿼리를 수행 할 수 있습니다. 하지만 왜? – Rob

+1

1)'select * from ... '을 절대로 사용하지 마십시오. 선택할 컬럼을 항상 명시 적으로 나열하십시오. 2) 왜 이렇게 두 개의 'select'문을 결합하고 싶습니까? 그들은 각각 완전히 다른 값을 반환합니다. – rmaddy

답변

0

과 함께 C 스타일 callback 기능을 사용하여 수행 할 수 있습니다.

인터넷에서 사용할 수있는 적절한 코드가 없습니다 (찾을 수 없습니다!). 그래서 코드 샘플로 대답하고 싶습니다. (__bridge void *)(self)sqlite3_exec의 매개 변수로 : 우리는 신부을 가지고

우리는

int myCallback(void *parameter, int numberOfColumn, char **resultArr, char **column) 
{ 

NSLog(@"number of column %d",numberOfColumn); // numberOfColumn is return total number of column for correspond table 

NSString *columnName = [[NSString alloc]initWithUTF8String:column[0]]; // This will return column name column[0] is for first, column[1] for second column etc 
NSLog(@"column name is %@",columnName); 

NSString *result = [[NSString alloc]initWithUTF8String:resultArr[2]]; // resultArr returns value for row with respactive column for correspond table. resultArr[2] considered as third column. 

NSLog(@"result is %@",result); 

return 0; 
} 

같은 C - style callback 방법을 구현할 수 있습니다 그리고 우리는 같은 우리의 sqlite3_exec 기능에

NSString *getData = @"select * from Department;select * from Employee"; 


if (sqlite3_exec(self.contactDB, [getData UTF8String], myCallback, (__bridge void *)(self), &err) == SQLITE_OK) { 


    if (err) { 

     NSLog(@"error : %s",err); 
    } 

    else { 

     NSLog(@"executed sucessfully"); 
    } 

} 

을이 콜백 함수를 호출 할 수 있습니다. 이 경우에는 C 스타일 함수를 구현했기 때문에 NULL을 전달할 수 있습니다. 그러나 Objective-C 스타일의 함수 또는 메소드를 구현하면 (__bridge void *)(self)을 매개 변수로 전달해야합니다.

따라서 콜백 함수를 사용하면 select 쿼리 유형 이건 아니건간에 queries을 하나의 명령문에서 여러 번 실행할 수 있습니다.

참조 : One-Step Query Execution Interface

+1

별도의 명시적인 열 목록이있는 각각 별도의 쿼리를 수행하는 것보다이 작업을 수행 할 이유가 없습니다. 이 두 가지 쿼리를 "정상적인"방식으로 수행하는 것의 인식 된 이점은 무엇입니까? – rmaddy

+1

그래,이 접근법에는 여러 가지 단점이 있지만, 유용 할 수있는 경우가 있습니다. – Rob

+0

Lion, 그런데, 당신은 "하지만 우리가 Objective-C 스타일의 함수 나 메소드를 구현한다면, (__bridge void *) (self)를 매개 변수로 전달해야합니다." 나는 이것이 사실이라고 생각하지 않는다. 콜백은 항상 C 스타일의 함수 여야합니다. 그러나'self'를 전달함으로써, C 스타일 함수는 적어도 이제는'self' 객체를 참조하고 그 메소드를 호출하거나 그 속성에 접근 할 수 있습니다. – Rob

2

예, 을 사용하여 한 번의 호출로 두 개의 SELECT 문을 실행할 수 있습니다. 결과 행을 처리 할 때 콜백 함수를 제공하면됩니다. 필자는이 기능을 전혀 사용하지 않았으며, 각 문장의 행을 구별하기 위해 자신이 가지고있는 의사를 어떻게 이해하는지; 아마도 하나의 열 개수를 사용할 수 있습니다.

그런 식으로 sqlite3_exec()을 사용하는 것이 좋습니다. 오히려 지루하고 오류가 발생하기 쉽습니다. sqlite3_prepare_*() 가야하며, 하나의 결과 집합 (SELECT 쿼리) 만 처리 할 수 ​​있지만 핸들은 ppStmt으로 표시되며 한 번에 여러 개의 문을 열 수 있습니다. 문제가있는 경우 XY Problem 질문을 게시하는 대신 설명해야합니다.

+0

예,'sqlite3_exec()'와'callback'이 해결책을 만들었습니다. 당신은 그것을 구현하는 방법을 알고 내 대답을 확인할 수 있습니다. 그리고 링크는 답변에 제공된 유용한 ... 감사합니다. – Lion

관련 문제