这个存储过程的名称是print_table,用于格式化打印SQL结果,为了做下对比,我们看下常规检索v$database视图的效果, ? 若不使用col格式化一些字段,输出是乱的,没有可读性。...p=100:11:0::::P11_QUESTION_ID:1035431863958 原版存储过程接受两个参数,一个是SQL语句,一个是日期的格式化,默认值是’dd-mon-yyyy hh24:mi:...当然存储过程中任何地方,均可以自定义,例如对于判断字段属性BLOB,可以设置任何自己需要的格式,包括日期格式,例如书中使用的是删除日期格式化参数的版本, ?
sqlite3_exec函数的使用 sqlite3数据库是一个小型的关系型的数据库,以文件的方式存在,打开文件即是打开数据库,它小巧且功能强大,在嵌入式领域内使用很广.现在就介绍一下其中一个重要函数的使用...: int sqlite3_exec(sqlite3 *db, const char *sql, sqlite3_callback callback, void *,char **errmsg); 功能...函数执行失败\n"); perror("函数执行失败\n"); return -1; } close_db(db); printf("函数结束\n"); return 0; } 程序执行结果...结果为预期结果....("函数执行失败\n"); perror("函数执行失败\n"); return -1; } close_db(db); printf("函数结束\n"); return 0; } 执行结果
在最近的项目开发中,有个业务需求是界面显示的数字需要保留两位小数,目前我想到的解决方法有两种: (1)在写SQL的时候,直接保留两位小数 (2)在java代码里面将查询出来的数进行格式化处理,保留两位小数...先说第一种方案:在SQL中的处理 我使用的oracle数据库,所以有3个函数可以选择,分别是: (1)ROUND(A/B,2) ROUND()函数是会将计算结果进行四舍五入的,如果所需要的值需要进行四舍五入...例子如下: 3)TO_CHAR(A/B,‘FM99990.99’) TO_CHAR()是一个格式化函数,第一个参数是计算表达式,第二个参数是指定格式化的格式,如果保留两位小数则小数点后写两个99,这里的数字...1/10的结果是0.1,但是实际需要得到的结果是0.10,那么用我上面的那些方法得到的结果只可以是0.1,不可以是0.10,对于这个问题,我去oracle官网的文档查看了一下,可以采用如下的写法得到:...9,但是当你整数部分只有一位且是0的时候,那么你需要在格式化的时候用0来指定格式化的模型,如上文那个.67的样子,小数点后面的值,你可以用0也可以用9来指定模式,用9指定的结果就是你的小数点本来后面几位它就显示几位
= 0 ){ qDebug()<<"sqlite3 open is false"; } else { qDebug()<<"sqlite3 open is OK"; } (4) 建立表格 sqlite3...(5)往表格里写入信息 a.直接添加数据 sqlite3_exec(db, "insert into person values('张翼', 30)", NULL, NULL, &zErrMsg...); sqlite3_exec(db, "insert into person values('hongdy', 28)", NULL, NULL, &zErrMsg); b.添加数字变量..._exec(db,sql2,NULL,NULL,&zErrMsg); *sprintf的作用是字串格式化命令,主要功能是把格式化的数据写入某个字符串中 c.添加字符串变量 char data[]=..."张翼"; char sql2[100]; sprintf(sql2,"insert into person values('%s',10);",data); sqlite3_exec(db,sql2
还记得我们的sqlite3_exec函数么,今天就是说一下它的扩展用法。...其实sqlite3_exec也能执行select语句,而且也能获得返回值,其中第三个参数(是个回调函数)起到了很大作用。 回调函数,就是在sqlite3_exec执行完成后自动被调用的函数。...(其中sqlite3_exec只用调用一次) 我来说明一下回调函数的各个参数。...第三个参数是一个数组,从0到n-1保存着咨询结果,都是字符串。 第四个参数和第三个对应,是每个字段的字段名,也是字符串。 ...知道了回调函数的格式,我们就可以利用sqlite3_exec来查询数据库并用回调函数处理查询结果了。
一般情况下,在 .NET MVC 中,如果是 API 接口,默认使用 JsonOutputFormatter 对结果进行格式化。...常见响应结果格式化器 在 .NET(介于官方改名,咱也不叫 Core 了哈) MVC中,有几种内置的常见响应结果格式化器,他们分别是: 0、OutputFormatter(基类) 1、TextOutputFormatter...在不改动业务代码的情况下,我们可以增加一种 xml 输出结果,具体做法就是增加一个 API 接口,然后在 startup.cs 中添加 xml 格式化器。...如果找到了,就使用该 Formatters 格式化响应结果,如果没有找到,就抛出 No output formatter was found for content types 的警告,同时,客户端会收到一个...我想要更多-自定义格式化器 没错,上面的几种常见的格式化器虽然非常好用。
return -1;}相关api函数介绍打开数据库 或者创建数据库用sqlite3_open在执行sql语句不需要返回结果集时用sqlite3_execsqlite3_execint sqlite3_exec...callback: 当 SQL 命令产生结果集时调用的回调函数。如果 SQL 命令不生成结果集,则此参数可以为 NULL。pArg: 传递给回调函数的任意类型的数据指针。...argc: 结果集中列的数量。argv: 指向数组的指针,数组中的每个元素都是一个指向结果集中相应列的字符串的指针。...azColName: 指向数组的指针,数组中的每个元素都是一个指向结果集中相应列名称的字符串的指针。...其使用例在下面的增删改查中需要返回结果集时需要返回结果集时一般用sqlite3_prepare_v2() 和 sqlite3_step()和sqlite3_finalize()结合使用这里就不提供详细解释了
下面我们来具体看下实验过程和结果, 背景: 文件数据:多伦多市全部交通时间表,大小约 28MB,以 TAB 分隔的文本文件(约 865,000 条记录) 机器环境: Windows XP 3.60 GHz..._exec(db, sSQL, NULL, NULL, &sErrMsg); 输出结果: Imported 864913 records in 9933.61 seconds 很慢,因为每个插入都是在自己的事务里...总结 实验结果已说明一切了,实际应用各取所需即可。 值得一提的是,如果加入索引(Index)的顺序不同也会导致速度有所差异。...); sqlite3_exec(db, "BEGIN TRANSACTION", NULL, NULL, &sErrMsg); ........ sqlite3_exec(db, "END TRANSACTION", NULL, NULL, &sErrMsg); sqlite3_exec(db, "CREATE INDEX 'TTC_Stop_Index
为了防止数据库内的表重复,导致编译问题,我们常常需要判断判断一个表是否在数据库中已经存在了,在sqlite3中,提供了一个sqlite3_exec函数,可以通过此函数的使用来判断一个表是否存在。...,char **), void *, char **errmsg); 用来执行sql语句,查询的结果返回给回调函数callback。...sqlite_exec的参数说明如下: db:是用于保存打开的数据库文件dbname的信息; sql:要执行命令的语句; callback:回调函数,用来处理查询结果,如果不需要回调(比如做insert..._exec(…) 时会返回 SQLITE_ABORT 回调函数中的data是sqlite3_exec()传入的参数指针,即sqlite3_exec()中的void* 参数。...通过在回调函数中对data进行赋值操作,可以获取到sqlite3_exec()的执行结果,即通过赋值的 void* 的参数值来判断一个表是否存在于此数据库中。
SQLite db handle */ ); 参数含义: filename: 数据库文件名 ppDb: 数据库handle ,用结构体sqlite3来表示一个打开的数据库对象 1.2 执行sql语句 sqlite3..._exec int sqlite3_exec( sqlite3*, /* An open database */ const..._exec传入的第四个参数 column_size: 结果字段的个数 column_value: 返回记录的一位字符数组指针 column_name: 结果字段的名称 回调函数的通常写法为: static...{ // azColName:结果字段的名称, argv:字符数组指 printf("%s = %s\n", azColName[i], argv[i] ?...{ // azColName:结果字段的名称, argv:字符数组指 printf("%s = %s\n", azColName[i], argv[i] ?
(2)sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg): 解析并执行由 sql 参数所给的每个命令...、查询数据: 注意:这里的callback函数,是sqlite的一个回调函数,格式如下(必须按照这个格式): int sqlite_callback( void* NotUsed, /* 由 sqlite3..._exec() 的第四个参数传递而来 */ int argc, /* 表的列数 */ char** argv, /* 指向查询结果的指针数组, 可以由 sqlite3_column_text...() 得到 */ char** azColName /* 指向表头名的指针数组, 可以由 sqlite3_column_name() 得到 */ ); 执行sqlite3_exec() 时作为参数传进去...说明: 参数: NotUsed:由sqlite3_exec传递的初始化参数 argc:表头的列数 azColName:表头的名字数组指针,在我们的例子就是指向{ID, NAME,
然后,阅读sqlite库的API文档,下面3个API(sqlite3_open()、sqlite3_exec()、sqlite3_close())基本上就可以满足开发的需要。...param pDb 数据库连接对象,sqlite3_open返回的值 @param sql 要执行的SQL语句,多个SQL语句之间使用分号(;)隔开 @param callback SQL执行过程中每个结果行都会进行回调..., SQL查询时必需设置回调获取查询结果 @param callback_context 作为callback的第一个参数,透传 @param errmsg...如果调用失败,返回错误内容,不需要时调sqlite3_free()释放 @return SQLITE_OK 成功,其它值是错误码 */ int sqlite3_exec( sqlite3* pDb...= "UPDATE COMPANY set SALARY = 25000.00 where ID=1; " \ "SELECT * from COMPANY"; rc = sqlite3
Close database test.db successfully... emacs@ubuntu:~/c$ 编译执行过程中没有报错,从结果来看,符合预期 ---- sqlite3_open sqlite3..._exec 第三个参数而存在的,它的作用在于处理返回的每条结果 一般而言,回调函数的返回结果都是0,如果结果是非0,那么查询过程会中断,所有接下来的查询会中断并且跳过,sqlite3_exec() 的返回结果会是...SQLITE_ABORT 第一个参数 void* 由 sqlite3_exec() 传过来的第四个参数,作为自己的第一个参数 第二个参数 int 查询结果中当条记录的字段数 第三个参数 char**...字段名形成的字符串指针数组 第四个参数 char** 结果集形成的字符串指针数组 ---- sprintf stdio.h 中有关于 sprintf 的声明 /* Write formatted output...__THROW; 在构建 SQL 语句的过程中会经常使用到 sprintf ,它和 printf 的用法相似,但是将结果写到一个字符数组中,而不是直接打印到了终端上,这样便于后期的处理 ---- 总结
HAVING:根据条件筛选查询结果 1.CREATE TABLE语句示例 CREATE TABLE table_name( column1 datatype, column2 datatype..._stmt:初始化SQL语句对象 sqlite3_prepare:编译好语句对象中的SQL代码 sqlite3_step:执行下一条编译好的SQL语句 sqlite3_column:获取执行结果的列值...fprintf(stderr, "Opened database successfully\n"); } sqlite3_close(db); return 0; } 编译运行结果...插入和删除数据 callback函数用于打印select结果 typedef int (*sqlite3_callback)( void*, /* Data provided in the...如果删除了本地的test.db文件,运行结果如下: Opened Database Successfully!
option(db); } case 6: { rc=sqlite3...callback,0,NULL); sqlite3_free(zSQL); } break; case 3:rc=sqlite3...zSQL; zSQL= sqlite3_mprintf("INSERT INTO telbook VALUES('%q','%q')", sql_name,sql_telnum); rc=sqlite3...zSQL= sqlite3_mprintf("update telbook set telnum='%q' where name='%q'", sql_telnum,sql_name); rc=sqlite3...; char zSQL; zSQL= sqlite3_mprintf("DELETE FROM telbook where name='%q'", sql_name); rc=sqlite3
当执行sqlite3_exec时,其内部的执行可分为3步: 解析sql语句字符串 编译sql语句 执行sql语句 可以看到,sqlite3_exec一个函数就实现了这么多功能,这是它的优点——使用方便,...关于sqlite3_exec的使用示例可参考之前的文章:玩转SQLite6:使用C语言来读写数据库 1.2 高效方式 为此解决sqlite3_exec函数执行效率低的问题,就出现了其它更加高效的解决方式...:将sqlite3_exec的功能进行分解,由多个函数共同完成。...2.6 sqlite3_column 该函数实例用于 查询(query)结果的筛选,返回当前结果的某1列。...3 总结 本篇主要介绍了sqlite的C语言操作的高效API函数,用于取代功能强大但效率较低的sqlite3_exec函数。
我们在主函数里用sqlite3_exec来创建一个表: const char * sql = "CREATE TABLE IF NOT EXISTS addlist( \ per_id INTEGER...= SQLITE_OK) { printf("出错\n"); } return ; } 没有用新的API,一个sqlite3_exec就解决了问题。...addlist where per_id='%d'",per_num); sqlite3_prepare(db,sql,-1,&stmt,NULL); 5.sqlite3_step 执行编译好的sql语句,获得结果的一行...这个函数很简单,执行sql语句,得到返回结果的一行。当然这个得到不是说从返回值得到,而是一个抽象的得到,要真正得到具体数据,还得利用其它函数。 ...我们这里查询某个人的信息,结果应该只有一行,所以执行一次step就行。
版权声明:本文为博主原创文章,未经博主允许不得转载。 ${num?string('0.00')} 如果小数点后不足两位,用 0 代替 ${nu...
= SQLITE_OK || sqlite3_exec(db, createAddressTable, nil, nil, nil) !...= SQLITE_OK || sqlite3_exec(db, insertAddressData, nil, nil, nil) !...左连接确保即使 Address 表中没有对应的 PersonId,Person 表的记录也会出现在结果中。结果展示使用 sqlite3_step 遍历查询结果,并处理可能的 null 值。...示例测试及结果输出结果FirstName | LastName | City | StateAllen | Wang | Null | NullBob...空间复杂度额外空间: 用于存储查询结果,复杂度为 O(k),其中 k 是结果行数。总结本文通过 Swift 和 SQLite 实现了对两个表的合并查询,并处理了地址缺失的情况。