- 浏览: 1098463 次
- 性别:
- 来自: 南京
博客专栏
-
Oracle管理和开发
浏览量:352977
最新评论
-
Simon.Ezer:
请问对于“如果非主键字段值发生改变,则不会同步过去”这种情况, ...
创建增量同步Oracle物化视图问题 -
dahai639:
挺好的,支持一下
Oracle的pipelined函数实现高性能大数据处理 -
zealotpz:
不错,原来是用户oracle 的所属组的问题
以sysdba身份登录oracle报ORA-1031权限不足错误之完美分析 -
mikixiyou:
zhangyuslam 写道如果担心全局索引失效,可以使用如下 ...
Oracle分区表的分区交互技术实现数据快速转移 -
sea0108:
...
Oracle sql loader使用速成
使用pl sql的数组功能、循环机制将小于10的16次方的任意阿拉伯数字转换为中文大写数字。该函数从原来的200多行,优化成现在70行左右。
始终相信,最少的代码实现某个功能才是最优雅的开发方式,代码越少出bug的概率就越低。
从开发、调试、到优化这个函数,我用掉了约5个小时的时间,最后只有短短的70行。顺便膜拜一下,那个解放军美女尖兵:90昼夜主持编写40万行代码
(miki西游 @mikixiyou 原文链接: http://mikixiyou.iteye.com/blog/1608834 )
附上函数代码:
create or replace function chinese_number_program(p_input float) return varchar2 as /* created by miki西游 on 2012-7-27 It is used to change Arabic numbers to Chinese big numbers. */ type typ_money is table of varchar2(20); c_numbers typ_money := typ_money('零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'); c_unit typ_money := typ_money('分', '角', '圆', '拾', '佰', '仟', '万', '拾', '佰', '仟', '亿', '拾', '佰', '仟', '兆', '拾', '佰', '仟'); v_array_money typ_money := typ_money(); chinese_number varchar2(30); result varchar2(1000); v_number integer; v_number_element integer; i int; begin if (p_input >= power(10, 16)) then result := '超出计算范围'; return result; end if; v_number := round(p_input * 100); i := 1; v_array_money.extend(1); v_array_money(v_array_money.count) := '整'; while v_number > 0 loop v_number_element := mod(v_number, 10); if (v_number_element = 0) then if i in (3, 7, 11, 15) then chinese_number := c_unit(i); else chinese_number := c_numbers(v_number_element + 1); end if; else chinese_number := c_numbers(v_number_element + 1) || c_unit(i); end if; case when chinese_number = '零' then if (v_array_money(v_array_money.count) not in ('整', '零', '圆', '万', '亿', '兆')) then v_array_money.extend(1); v_array_money(v_array_money.count) := chinese_number; end if; when chinese_number like '%亿' then if (v_array_money(v_array_money.count) in ('万')) then v_array_money(v_array_money.count) := chinese_number; else v_array_money.extend(1); v_array_money(v_array_money.count) := chinese_number; end if; when chinese_number like '%兆' then if (v_array_money(v_array_money.count) in ('万', '亿')) then v_array_money(v_array_money.count) := chinese_number; else v_array_money.extend(1); v_array_money(v_array_money.count) := chinese_number; end if; else v_array_money.extend(1); v_array_money(v_array_money.count) := chinese_number; end case; v_number := floor(v_number / 10); i := i + 1; end loop; for i in v_array_money.first .. v_array_money.last loop result := v_array_money(i) || result; end loop; return result; end;
测试结果如下:
SQL> select chinese_number_program(9999999999999999.99) from dual;\ CHINESE_NUMBER_PROGRAM(9999999 -------------------------------------------------------------------------------- 玖仟玖佰玖拾玖兆玖仟玖佰玖拾玖亿玖仟玖佰玖拾玖万玖仟玖佰玖拾玖圆玖角玖分整 SQL> select chinese_number_program(9999999999999999.99) as cc from dual; CC -------------------------------------------------------------------------------- 玖仟玖佰玖拾玖兆玖仟玖佰玖拾玖亿玖仟玖佰玖拾玖万玖仟玖佰玖拾玖圆玖角玖分整 SQL> select chinese_number_program(990000001229.00) as cc from dual; CC -------------------------------------------------------------------------------- 玖仟玖佰亿壹仟贰佰贰拾玖圆整 SQL> select chinese_number_program(9900029.01) as cc from dual; CC -------------------------------------------------------------------------------- 玖佰玖拾万零贰拾玖圆零壹分整 SQL> select chinese_number_program(10029.3) as cc from dual; CC -------------------------------------------------------------------------------- 壹万零贰拾玖圆叁角整 SQL>
btw,如果您觉得有同感,请鼓励一下。呵呵
objective-c
#import <Foundation/Foundation.h> #import <stdio.h> void print( NSArray *array ) { int i; for (i=0;i<[array count];i++) { NSLog(@"%@",[array objectAtIndex:i]); } } void print2( NSArray *array ) { NSEnumerator *enumerator = [array objectEnumerator]; id obj; while ( obj = [enumerator nextObject] ) { printf( "%s\n", [[obj description] cString] ); } } void print3( NSArray *array ) { id obj; NSLog(@"new array is "); for (obj in array) { NSLog(@"%@",obj); } } NSString * printByLine( NSArray *array ) { id obj; NSMutableString * oneLine; oneLine=[NSMutableString stringWithCapacity:100]; NSString * oneString; for (obj in array) { oneString=[obj copy]; //[oneLine appendString:oneString]; [oneLine insertString:oneString atIndex:0]; // NSLog(@"xx= %@,%d,%d",oneLine,oneLine,oneString); } return oneLine; } int main() { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; //NSArray *arr_numbers = [[NSArray alloc] initWithObjects:@"Áã", @"Ò¼", @"·¡", @"Èþ", @"ËÁ", @"Îé", @"½", @"Æâ", @"°Æ", @"¾Á", nil]; NSArray *arr_numbers = [[NSArray alloc] initWithObjects:@"Zero", @"One", @"Two", @"Three", @"Four", @"Five", @"Six", @"Seven", @"Eight", @"Nine", nil]; //NSArray *arr_unit = [[NSArray alloc] initWithObjects:@"·Ö", @"½Ç", @"Ô²", @"Ê°", @"°Û", @"Ǫ", @"Íò", @"Ê°", @"°Û", @"Ǫ", @"ÒÚ", @"Ê°", @"°Û", @"Ǫ", @"Õ×", @"Ê°", @"°Û", @"Ǫ",nil]; NSArray *arr_unit = [[NSArray alloc] initWithObjects:@"F", @"J", @"Yuan", @"S", @"B", @"Q", @"W", @"S", @"B", @"Q", @"Yi", @"S", @"B", @"Q", @"Z", @"S", @"B", @"Q",nil]; NSMutableArray * mutable_money = [[NSMutableArray alloc] init]; NSSet * set_special_number=[[NSSet alloc] initWithObjects:@"Zheng",@"Zero",@"Yuan",@"W",@"Yi",@"Z"]; //print(arr_numbers); // print2(arr_numbers); // print3(arr_unit); float p_input_number; int input_number; int input_number_element; int i=0; NSString * chinese_number; NSString * result; p_input_number=1008.20; if (p_input_number>9999999) { result =@"out of maximize range"; NSLog(@"%@",result); return 0; } input_number=p_input_number*100; [mutable_money addObject:@"Zheng"]; //[[chinese_number alloc] init]; while (input_number>0) { input_number_element=input_number%10; if(input_number_element==0) { if (i == 2 || i==6 || i==10 || i==14) { chinese_number=[arr_unit objectAtIndex:i]; } else { chinese_number=[arr_numbers objectAtIndex:input_number_element]; } } else { chinese_number=[[arr_numbers objectAtIndex:input_number_element] stringByAppendingString:[arr_unit objectAtIndex:i]]; } // NSLog(@"%@,%@,%@",chinese_number,[arr_numbers objectAtIndex:input_number_element],[arr_unit objectAtIndex:i]); // NSLog(@"%d,%d,%d",chinese_number,[arr_numbers objectAtIndex:input_number_element],[arr_unit objectAtIndex:i]); if ([chinese_number isEqualToString:@"Zero"]) { if (!([set_special_number containsObject:[mutable_money lastObject]])) { [mutable_money addObject:chinese_number]; //NSLog(@"zero is %@,%@,%@",chinese_number,[arr_numbers objectAtIndex:input_number_element],[arr_unit objectAtIndex:i]); } } else if ([chinese_number hasSuffix:@"Yi"]) { if ([[mutable_money lastObject] isEqualToString:@"W"]) { [mutable_money removeLastObject]; [mutable_money addObject:chinese_number]; } else { [mutable_money addObject:chinese_number]; } //NSLog(@"Yi is %@,%@,%@",chinese_number,[arr_numbers objectAtIndex:input_number_element],[arr_unit objectAtIndex:i]); } else { [mutable_money addObject:chinese_number]; //NSLog(@"Others is %@,%@,%@",chinese_number,[arr_numbers objectAtIndex:input_number_element],[arr_unit objectAtIndex:i]); } input_number=input_number/10; i++; } NSLog(@"%@",printByLine(mutable_money)); // free memory [arr_numbers release]; [arr_unit release]; [mutable_money release]; [pool release]; return 0; }
评论
8 楼
szkktom
2012-08-02
又见雷锋了 ,呵呵!加油,好好研究下。
7 楼
freezingsky
2012-07-27
数据库来实现这个有点不靠谱,不过,能实现说明掌握了,不错!建议把这种转换放到UI前端!
6 楼
mikixiyou
2012-07-27
jamcode 写道
你这个没有pl sql的实现方法吧。
哈哈
在一些报表上还是能用上的。
5 楼
jamcode
2012-07-27
4 楼
mikixiyou
2012-07-27
我还是觉得,
代码简洁是排在第一位的。
可读性取决于注释,而可维护性是和技术能力关联密切。
代码简洁是排在第一位的。
可读性取决于注释,而可维护性是和技术能力关联密切。
3 楼
teamilk
2012-07-27
其实我觉得,很多时候易读性可维护性要比代码量来的相对重要点,还是要平衡吧
2 楼
mikixiyou
2012-07-27
Miracle_Qsc 写道
不错,留下啦 以后可能用的上~~感谢
呵呵,分享嘛!
优化过程,我是不是也应该也写下来。这个只是产品。
1 楼
Miracle_Qsc
2012-07-27
不错,留下啦 以后可能用的上~~感谢
发表评论
-
Oracle分区表的分区交互技术实现数据快速转移
2013-01-22 11:48 14807有一个需求,将某业务表的某个时间点之前的记录转移到它的历史 ... -
等待事件enq TX row lock contention分析
2013-01-17 17:16 33295在Oracle数据库性能报告AWRRPT分析时,发现top ... -
Oracle的UNDO表空间管理总结
2013-01-14 15:06 12987UNDO是Oracle中的一个很 ... -
Oracle在不同windows系统中的迁移
2013-01-09 15:41 3806在Windows操作系统环境下 ... -
Oracle 10.2.0.1在windows 2008上安装失败经历
2013-01-07 10:29 8705这两天遇到这个一个项目上的数据库迁移的问题。原来的环境是数据库 ... -
所有的物化视图刷新脚本
2012-12-28 13:59 0select 'execute dbms_mview.refr ... -
Oracle数据库的SQL性能问题分析
2012-12-27 15:31 5289在Oracle 10.2.0.4数据库中,有一个SQL执行缓慢 ... -
db block gets和consistent gets的分析
2012-12-26 18:09 0在Oracle的文档中有这样一段解释: db block g ... -
创建增量同步Oracle物化视图问题
2012-12-25 14:07 15312我们采用Oracle的物化视图增量刷新机制定时将数据库A上的某 ... -
查归档日志文件每小时生成量
2012-12-18 16:13 10792在O racle数据库中,通过v$archived_lo ... -
如何删掉临时表空间的文件
2012-12-18 15:40 0Unlike Oracle datafiles which m ... -
Oracle sql性能诊断暨event 10046和10053使用
2012-12-17 10:24 0早上em grid control监控显示数据库的负载增加,其 ... -
查LOB字段占用的空间大小
2012-12-13 16:00 4579查询Oracle表中LOB字段的占用空间大小。表中每一个LOB ... -
Oracle Data Guard的重做日志传输和应用状况监控
2012-12-04 14:05 4079这是一个用来监控Oracle Data Guard环境下从主库 ... -
Oracle sql loader使用速成
2012-11-30 14:14 4949Oracle SQL LOADER是Oracle的 ... -
Oracle 11g2的监听器配置
2012-11-29 14:34 4391Oracle的监听器服务注册 ... -
Deleting archivelog on physical standby with RMAN in Oracle 10g
2012-11-28 13:25 0Turns out to be quite easy ... -
to_char将number转成string的小技巧
2012-11-27 14:14 10638很多数据转换处理操作时,会遇到将0.007007040000转 ... -
to_date转成字符串时ORA-01843 not a valid month 问题分析
2012-11-26 16:38 29307(注,本文三度易稿) 在开发Oracle SQL或PL/SQL ... -
Data Guard 10g 的保护级别为RESYNCHRONIZATION问题
2012-11-25 11:01 1922Oracle的data guard创建完成 ...
相关推荐
在SQL数据库操作中,有时我们需要将日期字段以中文大写的形式展示,这在报表制作、数据分析或者用户界面显示时尤其有用。本篇文章将详细介绍三种在SQL中实现这一功能的方法,包括两种函数方法和一种存储过程方法。 ...
数字金额转换为中文汉字金额:例如select num_to_zhs(123456789.54321) from dual; 我们调用该function可以将金额"123456789.54321"转换为“壹亿贰仟叁佰肆拾伍万陆仟柒佰捌拾玖元伍角肆分叁贰壹”。
oracle数据库,使用自定义函数,实现了金额的大写转换。sql语句中,直接调用此函数即可得到金额大写。
plsql中文使用说明plsql中文使用说明plsql中文使用说明plsql中文使用说明plsql中文使用说明plsql中文使用说明
标题中的“不安装oracle使用plsql”意味着要在没有Oracle数据库客户端的情况下使用PL/SQL Developer这一工具。这通常通过Oracle的Instant Client实现,该组件提供了一种轻量级的解决方案,允许用户连接到Oracle...
PLSQLDEV工具使用实现导数,介绍如何通过PLSQLDEV工具使用实现导数,及导出数据
本文将详细介绍如何将PLSQL Developer的英文界面转换为中文界面,以便于学习和操作。 首先,你需要确保已经安装了PLSQL Developer的英文版本。如果你还没有安装,可以从官方或者其他可信的来源下载并进行安装。安装...
这是确保正确显示中文字符的关键步骤,因为PLSQL导出的CSV文件通常使用UTF-8编码。 5. **加载数据**:确认编码设置无误后,点击“加载”按钮,Excel将使用UTF-8编码解析CSV文件,此时中文字符应该能正常显示。 ...
使用PLSQL创建Oracle数据库User用户并设置权限 主要演示了如何使用 PLSQL 创建一个 User 用户, 并使之具有创建表、修改表、访问表的权限。解决了 使用自定义用户创建表时出现的 没有表空间的访问权限的问题。
"使用PLSQL创建Oracle数据库用户并设置权限" 在 Oracle 数据库中,创建用户并设置权限是数据库管理员的基本任务之一。在本文中,我们将使用 PLSQL 创建 Oracle 数据库用户并设置权限,包括创建用户、设置权限和创建...
为了使用PLSQL Developer 14,用户需要首先登录Oracle数据库。登录过程包括输入用户名、密码和数据库连接信息等步骤。用户可以选择使用基本认证或SSL认证两种方式登录数据库。 编写程序 PLSQL Developer 14提供了...
使用PLSQL创建Oracle数据库User用户并设置权限 主要演示了如何使用 PLSQL 创建一个 User 用户, 并使之具有创建表、修改表、访问表的权限。解决了 使用自定义用户创建表时出现的 没有表空间的访问权限的问题。
PLSQL 中文乱码解决方案 PLSQL 是 Oracle_relational_database_management_system 的一种 procedural_language,用于实现复杂的业务逻辑和数据处理。但是,在执行 SQL 语句时,PLSQL 经常会出现中文乱码的问题,...
总之,"PLSQL中文语言包"为使用中文的开发者提供了一个更友好的开发环境,使得在Oracle数据库管理上使用PLSQL更加顺畅和高效。通过深入学习和实践,开发者可以充分利用PLSQL的强大功能,解决各种复杂的数据库问题。
plsql快捷插件,下载放入 plsql安装路径的PlugIns文件下就能用,还有中文插件,傻瓜式安装就可以使用,希望能帮助到小伙伴
PLSQL(Procedural Language/Structured Query Language)是Oracle数据库的一种扩展,它将SQL与过程编程语言相结合,用于开发在Oracle环境中运行的应用程序。在PLSQL中,我们编写存储过程、函数、触发器等数据库对象...
【标题】"网页端oracle查询工具 简易版的PLSQL实现"是基于Web的数据库查询工具,它简化了PL/SQL Developer的功能,让用户在网页环境下也能方便地进行Oracle数据库的操作和查询。这个工具主要面向开发人员和数据库...