在AnySQL.net中搜索标签(Tags) 'Perl' 的结果:
简单Perl XML编程
XML出来好久了, 亏我很早就用Java写程了, 但从没有写过处理XML的程序, 前段时间在整Text Links Ads的广告代码时, 发现了一段Perl处理XML的样本程序, 因为也常用XML来写工具, 如果将配置文件改成XML文件, 倒是件好事, 就在这儿总结一下. 下面是我要处理的一个XML文件的内容: <?xml version="1.0" encoding="UTF-8"?> <rows> <row col1="AnySQL" col2="4"></row> <row col1="DBATools" col2="1"></row> </rows> XML的数据结构, 在Perl中对应起来主要是Hash的Hash结构, 也不是很复杂. #!/usr/bin/perl -w use XML::Simple; my $xml = new XML::Simple; my $data...
Perl Array DML的正确错误处理方法
以前一直以为自已的处理方法是对的, 在asyncdata脚角正式使用了一次后, 发现还是错了. 下面一段是原来的处理角本: my $rv = $delstmt->execute_array({ArrayTupleStatus => \@rowstats}); if (! defined($rv)) { # Error processing my $updcnt = @rowstats; for($i=0;$i<$updcnt;$i++) { if (ref $rowstats[$i]) { # Error code : $rowstats[$i]->[0] ...
在Perl中用Array DML来进行性能调优
asyncdata是一个用于同步数据的角本, 基于实体化视图日志或自定义的触发器来获得变更的记录, 然后防照实体化视图刷新的过程来进行数据同步. 几个月之前完成的这一段角本, 现在要拿来作一些数据的迁移用了. 除正确性外, 性能就是最关键的因素了. 在处理SELECT的结果时, 我们已经广泛地使用Array Fetch提升性能了, 不过Array DML真正用得还是不够广的, 相对来说, 在PL/SQL中用得多一些. 现在我要测试的是在Perl中测试Array DML的性能提升. 做的测试是在两个不同的数据中心间进行数据同步, 网络速度肯定是不够快的, 在不用Array DML的情况下, 源节点这边插入一万条记录(表有13个字段, 一个主键索引), 用Perl同步到目标数据库需要40秒, 用dblink的结果更差, 需要一分钟左右. 通过升级DBD Oracle后, 用Array DML方式处理这一万条刻录时(Array Size为500), 只用了4秒钟, 整个速度提升了10倍, 应当可以满足性能要求了. ...
Perl的如何操作文件 -- FileHandle
这几天连续写了几个Perl程序, 有的是自愿写的, 有的是任务型的, 这都无所谓了. 在所有的程序中都有一个共同点, 那就是要么程序要输出到屏蔽, 要么输出到一个文件, 对于刚学Perl的我来说, 这个地方也是花了不少时间查有关资料的, 不过最后让我明白的文档是Perl Doc站点上的FileHandle说明文档. 先说说我是如何处理的. 在我的程序中, 如果在命令行指定了一个log文件名的话, 就向log文件写, 否则就向屏蔽写出. 大致代码如下: use FileHandle; ...... sub openFile { my ($logfile) = @_; my ($fh); if (defined($logfile)) {...
让Perl DBI返回的记录按列存贮
最新版本的Perl DBI接口定义了Array DML接口, 指将一个数组作为一个绑定变量, 这个在数据库的接口层上是早已经支持的了, 象Oracle Pro*C中早就支持命名用数组了. 但在实际使用中, 去发现一点不方便的地方. 通常Perl中返回结果集是按行排列的, 如下所示: { ROW1 {col1, col2, col3, col4}, ROW2 {col1, col2, col3, col4}, ..... ROWn {col1, col2, col3, col4} } 但实际上在绑定时, 是这样的: $sth->bind_param_array( COL1={row1, row2, ... rown}); $sth->bind_param_array( COL2={row1, row2,...
在Perl中如何派生多进程 -- fork函数
这个函数当前在学校没有搞懂, 刚从学校出来时也没搞懂, 不会用他来写多线程程序. 今天有人问我在Perl中如何进行多进程编程, 去Google了一把, 发现境界好象比以前高了, 因为感觉上懂了一些了. 下面是写的一个例子: #!/usr/bin/perl # my $pid = fork(); if (!defined($pid)) { print ("Fork process failured!\n"); exit(); } if ($pid) { # This is the child process. sleep(1); ...
角本语言转型, 安装Windows上的Perl环境
1, 安装Windows上的ActivePerl软件. 在下载后, 点击install.bat角本, 然后按照提示打Yes或No, 下面是将软件安装到c:\usr目录(因为Perl角本的第一行一般是/usr/bin/perl -w)下的例子: Did you read the LICENSE.txt file? [no] yes Do you agree to the ActivePerl Community License v2.1? [no] yes Enter top level directory for install? [C:\Perl] c:\usr Create shortcuts to the...
refresh_mysql.pl角本的一个配置例子
在Oracle中创建表和实体化视图日志: CREATE TABLE T_OBJECTS AS SELECT * FROM DBA_OBJECTS WHERE ROWNUM < 1; ALTER TABLE T_OBJECTS MODIFY OBJECT_ID NOT NULL; ALTER TABLE T_OBJECTS ADD PRIMARY KEY (OBJECT_ID); CREATE MATERIALIZED VIEW LOG ON T_OBJECTS WITH PRIMARY KEY, SEQUENCE; ...
写了一个从Oracle复制到MySQL的Perl角本
根据对实体化视图的研究及昨天的设想, 花了大约一个早上的时间, 写了一个从Oracle复制到MySQL的Perl角本, 早上测试时还是比较有趣的. 在现在的角本中, 源表名和目标表名可以不一样, 但字段名必须一样. 做测试时, 先开一个窗口, 运行刷新角本: C:\AnySQL>perl refresh_mysql.pl -s anysql:anysql:test -t mysql:root:mysql:localhost:test -c myrefresh.conf 02/13 12:52:25 - 1 tables will be processed. 02/13 12:53:06 - Start replication from T_MVLOG to T_MVLOG with...
再见了, Java语言!
几年以前, 曾经喜欢用Java写编写程序. 历时最长的一个程序是用Java写的数据库交互工具 -- AnySQL. 使用JDBC, 可以连接很多不同的关系数据库, 这是名字中的SQL这几个字段的来源. 又因为用Java写成, 可以运行在不同的操作和硬件平台上, 这是Any这几个字母的来源, 也为了宣传这个工具, 所以申请了AnySQL.net这个网址. 可现在我已经很少再对这个工具作修改了, 也很少再用Java来写工具了, 转向了C及Perl, 个人站点上的内容也不光是这个用Java写成的工具了, 事实上, 它所占的比重已经非常少了. 因此我个人和Java说, 再见了! 这个断断续续维护了2年多时间的程序, 曾经让我对Java很有感情, 为了一个图形界面, 从AWT研究到SWing, 最后到Eclipse项目组搞出来的SWT. 可是, 当我两年前开始写MyDUL时, 发现Java是多么地不适合, 为了一个小小的程序, 必须要装一个越来越大的JRE环境, 而且可以很方便地使用反编译工具生成可读性很好的源代码, 于是我转向了C语言. 当我在工作中要写一些工具时, 发现Java是多么地不适合于作文本处理, 不适合和OS打交道,...
Perl中的正则表达式起步之三
作为了一个DBA, 在接触了正则表达式后, 深深为其所打动, 利用正则表达式可以轻松地简化很多的工作, 并开发出别人刮目相看的工具. 下面简单地写几个例子: 1, 在sed, grep, vi等工具中使用, 下面的例子是grep和vi中删除空行及用sed替换ALTER后面的一个单位为INDEX. grep -v '^\s*$' cr.sql egrep -v '^\s*$' cr.sql vi: g/^\s*$/d sed 's/ALTER [A-Z]+/ALTER INDEX/g' cr.sql 2, 在Perl程序中使用, 可以用于字符串比较或替换, 下面的例子中将CREATE TABLE或INDEX语句中的表名替换掉, 就这一点用其他的语言来实现的话就要写很多的代码了. $create_syntax =...
Perl中的正则表达式起步之二
单个字符的正则表达式作用有限, 但这是构造复杂的正则表达式的基础, 现在我们就来看一下如何将单个字符扩成多个字符. | : 或者 * : 表示出现0个或多个 + : 表示出现1个或多个 ? : 表示出现0个或1个 {n} : 表示重复出现n次 {m,n} : 表示重复出现最少m次, 最多n次 到这一部份就比较难理解了, 还是举例子来解释吧. (ab|cd|ef) "ab", "cd", "ef"中的任一个 [a-zA-Z]+ 只包括字母的单词 [A-Z][a-z]* 第一个字母是大写的单词 \d+\.?\d* 表示一个数字 [a-z]{4} 四个小写字母...
Perl中的正则表达式起步之一
Perl是最强的文本处理语言, 其强大的正则表达式(Regular Expression)支持是其他语言所不及的. 正式表达在很多Unix的工具中都支持, 如grep, awk, sed等. Oracle从10g开始也引入了正式表达式的支持, 因此学好它对DBA来说也是很重要的. 正则表达式只是用于字符串匹配的特征串, 我们从如何表示一个字符开始. [ ] : 表示选择一个字符. (.) : 表示任何了个除换行符(\n)之外的字符. \r : 表示回车 \n : 表示换行 \t : 表示TAB键 \w : 表示字母,数字或下划线, 等同于[A-Za-z0-9_] \W : 表示非字母,数字或下划线, 等同于[^A-Za-z0-9_] \s...
学习Perl DBI -- 以SYSDBA或SYSOPER连接到Oracle
在连接9i或以上版本的Oracle数据库时, 必须指定SYSDBA或SYSOPER选项, 当你的Perl角本需要以SYS用户连接时, 如何指定呢? #!/usr/bin/perl -w # use DBI; # Get a database connection Handle. my $dbconn = DBI->connect("dbi:Oracle:", '/','/', {ora_session_mode=>2}); ...... 当ora_session_mode的值指定为2时表示以SYSDBA连接, 指定值为4时表示以SYSOPER来连接. 最近越来越发现Perl的好处, 以后将改用Perl来写些小角本, 并将源代码共享给大家....
Perl程序的一个小问题 -- Command not found
今天发现以前能跑的一个角本, 突然不能跑了. 于是我被要求去看了一下为什么不能跑了? 找到角本后, 直接运行报"Command not found"的错误, 但是我看文件是存在的, 并且执行的权限也是有的, 如下所示: $ p1.pl p1.pl: Command not found $ ls -la p1.pl -rwxrwxr-x 1 oracle dba ...... p1.pl 用vim打开程序一看, 原来第一行中的perl解释器的路径不对: #!/usr/share/bin/perl -w # 从而导致了运行perl程序时报"Command not found", 将其更改为准确的值后,...
学习Perl DBI -- 真正的Array DML支持
在早期的DBD Oracle (1.18)以前, Array DML的接口是假的, 其实是一条一条地执行的, 而DBD Oracle的主要编写人员也受到了很多开发人员的质问. 在DBD-Oracle v1.19的更改列表中, 我看到了下面的几行: =head1 Changes in DBD-Oracle 1.18 (svn rev 6697) Added support for native Oracle Array interface thanks Kristian Nielsen Added suppot for LOB Locators from Jeffrey Klein. Updated...
学习Perl DBI -- Array Insert/Update/Delete
在DBI的较新版本和DBD的最新版本(如: DBD Oracle V1.19)中就支持了Array DML操作, 这样可以大幅提高应用程序的性能, 在Perl中我们可以通过bind_param_array和execute_array来实现, 如下代码所示: my (@rowstats, $rv); $dbh->{AutoCommit} = 0; my @col1 = (.....); my @col2 = (.....); my $sth = $dbconn->prepare( "INSERT INTO T_PERLARRAY VALUES (?, ?)"); $sth->bind_param_array(1, \@col1); $sth->bind_param_array(2, \@col2); $rv =...
学习Perl DBI -- 语句的高级属性
1, NUM_OF_FIELDS -- 查询返回的字段个数 在执行之后, 就可以用这个属性获得SELECT语句返回的字段数了, 如下所示: $sth->execute(); print("Number of fields: $sth->{NUM_OF_FIELDS}\n"); 2, NAME, NAME_UC, NAME_LC -- 取得字段名 这些属性是一个数组, NAME返回的是大小写混合的列名, NAME_UC是大写, NAME_LC是小写. 使用方法如下所示: $sth = $dbh->prepare( "SELECT * FROM megaliths" ); $sth->execute();...
学习Perl DBI -- 数据库连接的高级属性
1, AutoCommit -- 是否自动提交 一般来说自动提交不利于应用程序的性能. $dbh->{AutoCommit} = 1; print "AutoCommit: $dbh->{AutoCommit}\n"; 2, ChopBlanks -- 取舍CHAR类型后面的空格 当你从数据库中取CHAR类型的值时, 你可以指定要不要带后面的空格, 在数据库中CHAR是定长的, 长足不足时, 后面以空格补充, 但你在写应用程序时, 可能并不想要后面的空格, 这时你可以将这个选项设为1. $dbh->{ChopBlanks} = 1; print "ChopBlanks: $dbh->{ChopBlanks}\n"; 3,...
学习Perl DBI -- 处理返回记录(Fetch)
在Perl中, 如果你的记录确保只有一条记录被返回, 则可以用以下的更简单的方法, 而不需要经过Prepare-Bind-Execute-Fetch四个阶段, 如下所示: my ($iniext, $nxtext) = $dbh->selectrow_array ( "SELECT INITITAL_EXTENT, NEXT_EXTENT FROM DBA_TABLESPACES WHERE TABLESPACE_NAME='USERS'"); my ($iniext, $nxtext) = $dbh->selectrow_array ( "SELECT INITITAL_EXTENT, NEXT_EXTENT FROM DBA_TABLESPACES WHERE TABLESPACE_NAME=?", undef, "USERS"); my...
学习Perl DBI -- 绑定(Bind)变量
给SQL语句动态地传入值的方法叫绑定(Bind), 在写数据库有关的角本时, 这是很重要的一点, 在Perl中你可以在SQL中写一个问号表示不确定的值, 不管是在SELECT还是在Insert/Update/Delete语句中, 都一样. 如下所示: my $sth = $dbh->prepare( "select tname from tab where tname like ?"); ...... my $sth = $dbh->prepare("Delete from test where col1=?"); 接下来在执行之前要传入真实的值和类型, bind_param就是用来传入值的, 第一个参数为问题的位置, 从1开始数; 第二个参数为变量的值; 第三个参数是可选的, 为参数的类型. 如下所示:...
学习Perl DBI -- 处理查询语句
在建立连接后, 就可以进行查询了. 可以用prepare函数来准备一个SQL语句, 获得一个Cursor的句柄(Handle)后就可以执行了, 如下所示: my $sth = $dbh->prepare("select ....."); if (!defined($sth)) { ...... } if ($sth->execute()) { ...... } 在调用execute函数(如果成功返回True, 否则False)后, 接下来需要进行Fetch操作才能将查询的结果取出来, 取出记录有很多种方法: my ($col1, $col2, ....); while ( ($col1, $col2, ...) = $sth->fetchrow_array() )...
学习Perl DBI -- 连接到数据库
从data_sources函数知道了连接信息的格式后, 我们就可以连接了, 只要调用DBI的connect函数, 根据连接信息的格式, 可以自动区别数据库类型, 选择合适的数据库驱动进行连接. 一般写法如下: my $dbh = DBI->connect("data source", "username", "password"); my $dbh = DBI->connect("data source", "username", "password", properties); connect函数如果连接失败会返回undef值, 因此很容易判断连接是否成功: my $dbh = DBI->connect("dbi:Oracle:test8i","anysql", "anysql") || die("Cannot connect...
学习Perl DBI -- Database Driver
从今天开始起从头学习Perl的DBI编程, 先接触到的是DBI中的数据库驱动(Driver)对象, 有三个函数可以调用: avaialable_drivers, data_sources和connect. connect是用来连接到数据库的, avaialable_drivers是用来看你所安装的Perl支持那几种数据库. 如下面的代码: #!/usr/bin/perl -w # use DBI; my @drvlist = DBI->available_drivers(); foreach my $drvname (@drvlist) { print ("$drvname\n"); } 在运行后输出的结果是: ExampleP Oracle Proxy data_sources函数是用来列出有那些数据库可以连接的,如下面的代码: #!/usr/bin/perl -w #...
Perl中文件与目录的操作
1, 删除文件 -- unlink 如成功返回删除的文件数(True), 否则返回0(False). 如: unlink("test.txt"); unlink("test1.txt","test2.txt"); unlink(<test*.txt>); // "rm test*.txt" under shell 2, 重命名文件 -- rename 如成功返回真(True), 否则返回假(False). 如: rename("a.txt","b.txt"); rename("a.txt","subdirectory/a.txt"); 3, 创建连接 -- link(硬链接), symlink(软链接)和readlink(取得链接内容) 对link和symlink, 如成功返回真(True),...
Perl或Shell中的文件测试命令
最近用Shell和Perl的机会越来越多了, 又开始看相关书籍了, 下面是从书中抄下来的关于文件操作的命令: -r可被当前用户读 -w可被当前用户写 -x可被当前用户执行 -o属于当前用户 -R可被setuid之前的用户读 -W可被setuid之前的用户写 -X可被setuid之前的用户执行 -O性于setuid之前的用户 -e文件或目录存在 -z文件存在并且大小为0 -s文件存在并且大小不为0 -f是否普通文件 -d是否目录 -l是否符号连接 -S是否套接字(Socket) -p是否管道(Pipe) -b是否块设备 -c是否字符设备 -u是否属于setuid之后的用户 -g是否属于setgid之后的组 -ksticky标志是否设置 -tisatty()函数是否为真 -T是否文本文件 -B是否二进制文件 -M最后修改距现在的天数 -A最后访问距现在的天数 -C最后Inode修改距现在的天数 这些东西很是常用, 但却总是记不清....
为Windows上的ActivePerl编译和安装DBD-Oracle模块
Perl角本的确管用, 应当推荐使用, Windows平台可以用ActivePerl, 它可以免费下载. 为了和Unix一保持一致(/usr/bin/perl), 我是安装到"c:\usr"目录的, 接下来我们就来安装DBD-Oracle模块吧! 首先要安装DBI, ActivePerl默认安装是没有DBI的, 先让机器能连上互联网, 然后运行PERL_HOME的bin子目录下的Perl Package Manager(ppm.bat)程序, 会出现一个命令行, 输入"install DBI"就可以了, 这一步不会很久的. 如下所示: ppm> install DBI ==================== Install 'DBI' version 1.53 in ActivePerl 5.8.0.806. ==================== Downloaded 597997 bytes. Extracting 82/82: blib/arch/auto/DBI/Driver_xst.h...
偶学Perl过程中写的第二个程序
对于管理Unix/Linux上面数据库的DBA来说, 学点Perl是很有用的技术. 来到这个公司后, 所有的数据库都在Unix上, 因此也就有了学习Perl的压力, 可到现在也没有学好, 没有为公司写过一个用Perl语言的小工具. 下面是我学习过程中的第二个程序, 其中用到了DBI来查询数据库的记录. 程序如下: #!/usr/bin/perl -w # use DBI; # Get a database connection Handle. my $dbconn = DBI->connect("dbi:Oracle:tnsname","username","password"); my $row; # Fetch record row by row into an array $row=$dbconn->selectall_arrayref("SELECT TNAME,TABTYPE...
如何编译Perl的Oracle模块?
发现我们用的Perl在数据库版本变化后(如8i到9i, 9i到10g)时, DBD-Oracle模块都需要重新编译Perl才能工作. 在多种数据库版本混合使用的环境下, 就需要安装几个Perl(或只使用一个版本的客户端)才能解决问题, 其中的原因是因为编译出来的Oracle.so会去找特定版本的Oracle客户端库文件, 如下所示: $ldd ./lib/site_perl/5.8.5/sun4-solaris-64/auto/DBD/Oracle/Oracle.so libclntsh.so.9.0 => /export/home/oracle/products/9201/lib/libclntsh.so.9.0 libnsl.so.1 => /usr/lib/64/libnsl.so.1 libsocket.so.1 => /usr/lib/64/libsocket.so.1 ...... 其实在每一个Oracle的客户端库目录下都会有一个"libclntsh.so"的链接指向"libclntsh.so.ver", 如果在ldd的输出中只去查找"libclntsh.so"的话, 就可以解决在8i/9i/10g下的重新编译的问题了. 我在编译OCI程序时, 就没有不同版本的客户端的问题. $ldd ociuldr.bin libm.so.1 => /usr/lib/libm.so.1 libclntsh.so => /export/home/oracle/products/9201/lib32/libclntsh.so ...... 今天就将这个方法用在Perl的DBD-Oracle模块中试试吧, 首先下载DBD-Oracle源程序, 然后就可以开始了. 如果你只想替换Oracle.so文件,...
站内搜索 | Search
总数: 534 | 留言: 1687
- Name: Fangxin Lou
- MSN: anysql©live.com
- Mail:anysql©yahoo.com
anysql©gmail.com - Skype: anysql
- AIM: loufangxin
- Mobile:008615925611590
分类 | Categories
软件下载:
MSN: loufangxin(a)msn.com, Mail: anysql(at)126.com/support(at)iamdba.com, Skype ID:anysql