﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-HelloWorld 善战者,求之于势,不责于人;故能择人而任势。-随笔分类-SQL</title><link>http://www.blogjava.net/zhaochengming/category/24906.html</link><description> 知止而后有定，定而后能静，静而后能安，安而后能虑，虑而后能得。物有本末，事有终始。知所先后，则近道矣。</description><language>zh-cn</language><lastBuildDate>Tue, 22 Jan 2013 06:09:22 GMT</lastBuildDate><pubDate>Tue, 22 Jan 2013 06:09:22 GMT</pubDate><ttl>60</ttl><item><title>InstantClient安装使用 转自http://freefancy.iteye.com/blog/422578</title><link>http://www.blogjava.net/zhaochengming/archive/2013/01/22/394539.html</link><dc:creator>helloworld2008</dc:creator><author>helloworld2008</author><pubDate>Tue, 22 Jan 2013 04:57:00 GMT</pubDate><guid>http://www.blogjava.net/zhaochengming/archive/2013/01/22/394539.html</guid><wfw:comment>http://www.blogjava.net/zhaochengming/comments/394539.html</wfw:comment><comments>http://www.blogjava.net/zhaochengming/archive/2013/01/22/394539.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaochengming/comments/commentRss/394539.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaochengming/services/trackbacks/394539.html</trackback:ping><description><![CDATA[<div id="blog_content" class="blog_content">
<p>&nbsp;</p>
<p>因oracle应用程序及其工具toad、PLSQL Developer等的部署很多,动辙要安装几百兆的Oracle Client实在很烦。</p>
<p>Instant client小而够用。这里共享出自己的经验，供同行参考，如果能给你帮助，荣幸之至。</p>
<p>&nbsp;</p>
<p>运行环境：windows XP sp3，新安装系统，从未安装过任何版本Oracle</p>
<p>&nbsp;</p>
<p>1、下载Instant Client</p>
<p>http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html</p>
<p>&nbsp;</p>
<p>找到与系统对应版本下载。</p>
<p>&nbsp;</p>
<p>这里以32位windows系统：</p>
<p>instantclient-basic-nt-11.2.0.3.0.zip</p>
<p>instantclient-sqlplus-nt-11.2.0.3.0.zip</p>
<p>&nbsp;</p>
<p>如果你只用客户端工具，不使用命令行下sqlplus，第二个包可以不用</p>
<p>&nbsp;</p>
<p>2、解压缩包到C:\instantclient_11_2</p>
<p>&nbsp;</p>
<p>3、设置变量：</p>
<p>NLS_lANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK（注意中间有空格，这个如果不设，toad查询中文会是乱码）</p>
<p>TNS_ADMIN=C:\instantclient_11_2</p>
<p>Path=C:\instantclient_11_2</p>
<p>&nbsp;</p>
<p>4、保存以下内容为注册表文件，导入注册表（路径部分，请自己修改）</p>
<p>&nbsp;</p>
<p>Windows Registry Editor Version 5.00</p>
<p>&nbsp;</p>
<p>[HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraClient10g_home]</p>
<p>"NLS_LANG"="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"</p>
<p>"ORACLE_BUNDLE_NAME"="Enterprise"</p>
<p>"ORACLE_GROUP_NAME"="Oracle - OraClient10g_home"</p>
<p>"ORACLE_HOME"="C:\\instantclient_11_2"</p>
<p>"ORACLE_HOME_KEY"="SOFTWARE\\ORACLE\\KEY_OraClient10g_home"</p>
<p>"ORACLE_HOME_NAME"="OraClient10g_home"</p>
<p>&nbsp;</p>
<p>5、建立tnsnames.ora，并保存到安装目录：C:\instantclient_11_2</p>
<p>&nbsp;</p>
<p>这个这里就不多说了</p>
<p>&nbsp;</p>
<p># tnsnames.ora Network Configuration File: D:\oracle\product\10.2.0\client_1\network\admin\tnsnames.ora</p>
<p># Generated by Oracle configuration tools.</p>
<p>&nbsp;</p>
<p>ORCL =</p>
<p>&nbsp; &nbsp;(DESCRIPTION =</p>
<p>&nbsp; &nbsp; &nbsp;(ADDRESS_LIST =</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp;(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))</p>
<p>&nbsp; &nbsp; &nbsp;)</p>
<p>&nbsp; &nbsp; &nbsp;(CONNECT_DATA =</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp;(SERVICE_NAME = orcl)</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>6、测试：</p>
<p>C:\Documents and Settings\Administrator&gt;sqlplus /nolog</p>
<p>&nbsp;</p>
<p>SQL*Plus: Release 11.2.0.3.0 Production on 星期六 4月 28 10:10:10 2012</p>
<p>&nbsp;</p>
<p>Copyright (c) 1982, 2010, Oracle. &nbsp;All rights reserved.</p>
<p>&nbsp;</p>
<p>SQL&gt; conn scott/tiger@orcl</p>
<p>已连接。</p>
<p>SQL&gt;</p>
<p>&nbsp;</p>
<p>至此，安装已经完成。toad、PLSQL Developer等工具，以及应用软件都可以正常使用了。</p>
<p>&nbsp;</p></div><img src ="http://www.blogjava.net/zhaochengming/aggbug/394539.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaochengming/" target="_blank">helloworld2008</a> 2013-01-22 12:57 <a href="http://www.blogjava.net/zhaochengming/archive/2013/01/22/394539.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sqlserver多行转一行</title><link>http://www.blogjava.net/zhaochengming/archive/2013/01/17/394334.html</link><dc:creator>helloworld2008</dc:creator><author>helloworld2008</author><pubDate>Wed, 16 Jan 2013 17:24:00 GMT</pubDate><guid>http://www.blogjava.net/zhaochengming/archive/2013/01/17/394334.html</guid><wfw:comment>http://www.blogjava.net/zhaochengming/comments/394334.html</wfw:comment><comments>http://www.blogjava.net/zhaochengming/archive/2013/01/17/394334.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaochengming/comments/commentRss/394334.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaochengming/services/trackbacks/394334.html</trackback:ping><description><![CDATA[with TestTitle AS (select distinct Professional_name, member from sys_MemberOfRole,<br />(SELECT Professional_code,Professional_name,Professional_name+'指标填报人' AS RN,Professional_manager FROM bm_professional WHERE Professional_status=1 <br />&nbsp; AND Professional_code NOT IN&nbsp; (SELECT professional_code FROM bm_report_status WHERE status &lt;&gt; 0 AND object_code=15074 AND time_code='MO201211')) t <br />where rolename=t.RN and member in(select member from bm_menberofobject where objectForUser=15074))<br />SELECT&nbsp; Professional_name,&nbsp; STUFF(( SELECT',' + member&nbsp;&nbsp;&nbsp; FROM TestTitle subTitle WHERE Professional_name = TestTitle.Professional_name<img src ="http://www.blogjava.net/zhaochengming/aggbug/394334.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaochengming/" target="_blank">helloworld2008</a> 2013-01-17 01:24 <a href="http://www.blogjava.net/zhaochengming/archive/2013/01/17/394334.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>.用友数据量过大造成软件缓慢的优化策略 </title><link>http://www.blogjava.net/zhaochengming/archive/2012/07/12/382845.html</link><dc:creator>helloworld2008</dc:creator><author>helloworld2008</author><pubDate>Thu, 12 Jul 2012 01:49:00 GMT</pubDate><guid>http://www.blogjava.net/zhaochengming/archive/2012/07/12/382845.html</guid><wfw:comment>http://www.blogjava.net/zhaochengming/comments/382845.html</wfw:comment><comments>http://www.blogjava.net/zhaochengming/archive/2012/07/12/382845.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaochengming/comments/commentRss/382845.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaochengming/services/trackbacks/382845.html</trackback:ping><description><![CDATA[我们有一些客户的数据库是巨量数据，特别是用到生产管理的模块，千万行甚至亿行记录都不足为奇。如此情况下，数据库运行速度将受到严重影响，打开一个账表半小时甚至两小时，做一个计划要两天两夜，客户抱怨不断，服务人员焦头烂额，总不能叫客户都去买大型计算机吧。<br /><br /><br />其实是有办法可以大大提升数据库运行效率的，这要求我们的服务人员要学会数据库日常维护的高级技巧，而且是必须学会。<br /><br />下面是数据库效率提升技巧的全面内容，建议所有服务人员自行练习并用在实际工作中，要求熟练掌握。<br /><br /><br /><strong>技巧一：重建索引</strong><br />效率提升指数：高<br /><br />特点：一二三买单，灰常的快，一下就弄完可以走人了。<br /><br />案例：某超市T1商贸宝 百万行级数据，原速度五秒，重建索引后两秒不到，速度提升近一倍。不要小看这几秒，对超市来讲，那意味着不必要排长队。<br /><br /><br />由于数据库日常写操作频繁，索引的工作效率会越来越低，速度自然大受影响，很多客户会有这种感觉，前半年还非常快，后半年就受不了了。刚刚到年底，正好是出报告、查资料的年关，偏偏软件慢得要命，服务人员也别想有好日子过，陪着加班吧，就算解决不了问题，也让人家心理舒服点。这样的日子可以过去了。<br /><br /><br />命令1：DBCC DBREINDEX (表名称,"",70) ---针对主要影响速度的表，一般如rdrecords、salebillvouchs、pp_mrpdetails、pp_rmrpdetails<br />说明：只对主要表操作，影响速度的当然是这几个大表，速度解决问题，也不影响客户使用<br /><br /><br />命令2：exec sp_msforeachtable "DBCC DBREINDEX(""?"")" ---数据库所有表重建索引<br />说明：不太建议，除非太咸了<br /><br /><br />特别指出，重建索引前必须断网，以保证所有客户端无人在操作软件，你懂的<br /><br /><br /><br /><strong>技巧二：表分区 </strong><br /><br />效率提升指数：超高<br /><br />特点：慢工出快活。硬盘越多，它就越快，所有硬盘一起转当然快；CPU越多，它就更快，sqlserver的引擎对这个有优化设计；设计得越合理，它就灰常滴快，例如历史数据按年存放，因为你一般不用嘛，那数据库只对你要操作的部分分区检索，自然飞快。<br />还有，必须得是sql2005及以上版本，人家买的ERP你还装sql2000，去死吧。<br /><br />案例：NC、U8 10.0，是的，它们用的就是表分区，所以数据越海，速度也越Hi<br /><br /><br />没有做表分区之前，客户是痛苦的，你也得痛苦，因为你不明白几万元的服务器怎么就玩不转一个T6，但NC这么海却可以在宽带上溜溜的跑？U8 10.0还不分年度裤呢，咱一个年度还用爬的？如果我说可以提升五倍甚至更高的速度，你信不信？反正我是信了。<br /><br />真的。<br /><br /><br />这个有点点难，因为要求有更多的数据库知识，不过初中生的水平也够用了，来吧。<br /><br />1.为数据库建个文件组（可以建多个），最好是存放于不同磁盘上。这样效率得以最大化，想一想吧，我们查一个年度所有收发记录，三个硬盘一起转，是不是原来速度的三倍？ <br /><br />ALTER DATABASE 数据库名 ADD FILEGROUP 文件组名<br /><br />2.一个文件组可放置多个文件，下面，只为一个文件组分配一个文件，类推吧。<br /><br /><br />ALTER DATABASE 数据库名 ADD FILE (NAME = N"文件组名", FILENAME = N"存放路径",SIZE = 5MB , FILEGROWTH = 10% ) TO FILEGROUP 文件组名 <br /><br />3.创建分区函数。这个函数是本文件组专有的，再建其它的文件组还得再搞一个。主要是设定，包括预设现有的数据从哪里开始水平分割，比如我们假设U8 10.0的上一年度最后一行rdrecords记录的Id是5000000，那么就可以设定这个值，这以内的记录会切割保存到第一个分区中。<br /><br />CREATE PARTITION FUNCTION [函数名] (int) AS RANGE LEFT FOR VALUES (5000000,8274249,12000000)<br />此句表示，分三个区存放原先的数据<br /><br />4.将分区函数绑定到分区架构上 <br /><br />CREATE PARTITION SCHEME [架构名]<br />AS PARTITION [函数名]<br />TO ([PRIMARY],[文件组名],[PRIMARY],[文件组名],[PRIMARY],[文件组名])<br /><br />5.删除表的主键，必须删除，表担心，主键可以再建的 <br />ALTER TABLE 数据表名称 DROP CONSTRAINT [主键]<br /><br />6.删除聚集索引，如果有的话，我还没找到命令，现在是手动删除的<br /><br />7.开始做表分区 <br /><br />ALTER TABLE 数据表名称 add CONSTRAINT [主键] PRIMARY KEY CLUSTERED (主键字段名)<br />ON [SHEME_rdrec](主键字段名)<br /><br />你看，这不是恢复了主键吗<br />不过还是得手动恢复原来的聚集索引，这个我再查查语句吧<br /><br /><br /><br /><strong>特别提出：</strong><br />数据库收缩并不能提高数据库的读取效率，正相反，它反而更慢了。原因，是收缩后数据库内部的数据存储发生位移，也就是索引变得更低效。<br />这种情况下，必须再做一次索引重建，但我发现似乎只要收缩了以后，数据库都慢，重建索引也恢复不到原来的速度，一下想不明白道理，而且做的测试次数也有限。<br />(转帖于:http://bbs.iufida.com/thread-174625-1-1.html)<img src ="http://www.blogjava.net/zhaochengming/aggbug/382845.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaochengming/" target="_blank">helloworld2008</a> 2012-07-12 09:49 <a href="http://www.blogjava.net/zhaochengming/archive/2012/07/12/382845.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sqlserver经典查询练习</title><link>http://www.blogjava.net/zhaochengming/archive/2012/07/01/381914.html</link><dc:creator>helloworld2008</dc:creator><author>helloworld2008</author><pubDate>Sun, 01 Jul 2012 06:26:00 GMT</pubDate><guid>http://www.blogjava.net/zhaochengming/archive/2012/07/01/381914.html</guid><wfw:comment>http://www.blogjava.net/zhaochengming/comments/381914.html</wfw:comment><comments>http://www.blogjava.net/zhaochengming/archive/2012/07/01/381914.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaochengming/comments/commentRss/381914.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaochengming/services/trackbacks/381914.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: --创建测试数据create table Student(S# varchar(10),Sname nvarchar(10),Sage datetime,Ssex nvarchar(10))insert into Student values('01' , N'赵雷' , '1990-01-01' , N'男')insert into Student values('02' , N'钱...&nbsp;&nbsp;<a href='http://www.blogjava.net/zhaochengming/archive/2012/07/01/381914.html'>阅读全文</a><img src ="http://www.blogjava.net/zhaochengming/aggbug/381914.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaochengming/" target="_blank">helloworld2008</a> 2012-07-01 14:26 <a href="http://www.blogjava.net/zhaochengming/archive/2012/07/01/381914.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SqlServer函数</title><link>http://www.blogjava.net/zhaochengming/archive/2012/06/28/381740.html</link><dc:creator>helloworld2008</dc:creator><author>helloworld2008</author><pubDate>Thu, 28 Jun 2012 14:57:00 GMT</pubDate><guid>http://www.blogjava.net/zhaochengming/archive/2012/06/28/381740.html</guid><wfw:comment>http://www.blogjava.net/zhaochengming/comments/381740.html</wfw:comment><comments>http://www.blogjava.net/zhaochengming/archive/2012/06/28/381740.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaochengming/comments/commentRss/381740.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaochengming/services/trackbacks/381740.html</trackback:ping><description><![CDATA[<span class="headline-content">字符串函数</span>　　1 字符串函数 
<div class="spctrl" paragraphindex="1"></div>　　1.1 长度与分析用 
<div class="spctrl" paragraphindex="2"></div>　　datalength(Char_expr) 返回字符串包含字符数,但不包含后面的空格 
<div class="spctrl" paragraphindex="3"></div>　　substring(expression,start,length) 不多说了,取子串 
<div class="spctrl" paragraphindex="4"></div>　　right(char_expr,int_expr) 返回字符串右边int_expr个字符 
<div class="spctrl" paragraphindex="5"></div>　　1.2 字符操作类 
<div class="spctrl" paragraphindex="6"></div>　　upper(char_expr) 转为大写 
<div class="spctrl" paragraphindex="7"></div>　　lower(char_expr) 转为小写 
<div class="spctrl" paragraphindex="8"></div>　　space(int_expr) 生成int_expr个空格 
<div class="spctrl" paragraphindex="9"></div>　　replicate(char_expr,int_expr)复制字符串int_expr次 
<div class="spctrl" paragraphindex="10"></div>　　reverse(char_expr) 反转字符串 
<div class="spctrl" paragraphindex="11"></div>　　stuff(char_expr1,start,length,char_expr2) 将字符串char_expr1中的从 
<div class="spctrl" paragraphindex="12"></div>　　start开始的length个字符用char_expr2代替 
<div class="spctrl" paragraphindex="13"></div>　　ltrim(char_expr) rtrim(char_expr) 取掉空格 
<div class="spctrl" paragraphindex="14"></div>　　ascii(char) char(ascii) 两函数对应,取<a href="http://baike.baidu.com/view/812.htm" target="_blank">ascii码</a>,根据ascii吗取字符 
<div class="spctrl" paragraphindex="15"></div>　　1.3 字符串查找 
<div class="spctrl" paragraphindex="16"></div>　　charindex(char_expr,expression) 返回char_expr的起始位置 
<div class="spctrl" paragraphindex="17"></div>　　patindex("%pattern%",expression) 返回指定模式的起始位置,否则为0 
<h3 class="headline-2 bk-sidecatalog-title" sizset="39" sizcache="0" paragraphindex="18"><a name="1_1"></a><a name="sub2279638_1_1"></a><span class="headline-content">数学函数</span></h3>　　trunc(45.923，1) 按指定精度截断十进制数 结果：45.9 
<div class="spctrl" paragraphindex="19"></div>　　mod(1600,300) 求除法余数 结果：100 
<div class="spctrl" paragraphindex="20"></div>　　abs(numeric_expr) 求<a href="http://baike.baidu.com/view/220956.htm" target="_blank">绝对值</a> 
<div class="spctrl" paragraphindex="21"></div>　　ceiling(numeric_expr) 取大于等于指定值的最小整数 
<div class="spctrl" paragraphindex="22"></div>　　avg（numeric_expr）取平均数 
<div class="spctrl" paragraphindex="23"></div>　　exp(float_expr) 取指数 
<div class="spctrl" paragraphindex="24"></div>　　floor(numeric_expr) 小于等于指定值得最大整数 
<div class="spctrl" paragraphindex="25"></div>　　pi() 3.1415926......... 
<div class="spctrl" paragraphindex="26"></div>　　power(numeric_expr,power) 返回power次方 
<div class="spctrl" paragraphindex="27"></div>　　rand([int_expr]) 随机数产生器 
<div class="spctrl" paragraphindex="28"></div>　　round(numeric_expr,int_expr) 安int_expr规定的精度四舍五入 
<div class="spctrl" paragraphindex="29"></div>　　sign(int_expr) 根据正数,0,负数,,返回+1,0,-1 
<div class="spctrl" paragraphindex="30"></div>　　sqrt(float_expr) 平方根 
<div class="bpctrl" paragraphindex="31"></div>
<h2 class="headline-1 bk-sidecatalog-title" sizset="42" sizcache="0" titleindex="1"><span class="text_edit editable-title" data-edit-id="2279638:2279638:2"><a class="nslog:1019" href="http://baike.baidu.com/view/2279638.htm#">编辑本段</a></span><a name="2"></a><a name="sub2279638_2"></a><span class="headline-content">日期、时间函数</span></h2>　　getdate() 返回日期 
<div class="spctrl" paragraphindex="32"></div>　　datename(datepart,date_expr) 返回名称如 June 
<div class="spctrl" paragraphindex="33"></div>　　datepart(datepart,date_expr) 取日期一部份 
<div class="spctrl" paragraphindex="34"></div>　　datediff(datepart,date_expr1.dateexpr2) 日期差 
<div class="spctrl" paragraphindex="35"></div>　　dateadd(datepart,number,date_expr) 返回日期加上 number 
<div class="spctrl" paragraphindex="36"></div>　　上述函数中datepart的 
<div class="spctrl" paragraphindex="37"></div>　　写法 取值和意义 
<div class="spctrl" paragraphindex="38"></div>　　yy 1753-9999 年份 
<div class="spctrl" paragraphindex="39"></div>　　qq 1-4 刻 
<div class="spctrl" paragraphindex="40"></div>　　mm 1-12 月 
<div class="spctrl" paragraphindex="41"></div>　　dy 1-366 日 
<div class="spctrl" paragraphindex="42"></div>　　dd 1-31 日 
<div class="spctrl" paragraphindex="43"></div>　　wk 1-54 周 
<div class="spctrl" paragraphindex="44"></div>　　dw 1-7 周几 
<div class="spctrl" paragraphindex="45"></div>　　hh 0-23 小时 
<div class="spctrl" paragraphindex="46"></div>　　mi 0-59 分钟 
<div class="spctrl" paragraphindex="47"></div>　　ss 0-59 秒 
<div class="spctrl" paragraphindex="48"></div>　　ms 0-999 毫秒 
<div class="spctrl" paragraphindex="49"></div>　　日期转换 
<div class="spctrl" paragraphindex="50"></div>　　convert() 
<div class="bpctrl" paragraphindex="51"></div>
<h2 class="headline-1 bk-sidecatalog-title" sizset="44" sizcache="0" titleindex="2"><span class="text_edit editable-title" data-edit-id="2279638:2279638:3"><a class="nslog:1019" href="http://baike.baidu.com/view/2279638.htm#">编辑本段</a></span><a name="3"></a><a name="sub2279638_3"></a><span class="headline-content">系统、其他函数</span></h2>　　suser_name() 用户登录名 
<div class="spctrl" paragraphindex="52"></div>　　user_name() 用户在数据库中的名字 
<div class="spctrl" paragraphindex="53"></div>　　user 用户在数据库中的名字 
<div class="spctrl" paragraphindex="54"></div>　　show_role() 对当前用户起作用的规则 
<div class="spctrl" paragraphindex="55"></div>　　db_name() 数据库名 
<div class="spctrl" paragraphindex="56"></div>　　object_name(obj_id) 数据库对象名 
<div class="spctrl" paragraphindex="57"></div>　　col_name(obj_id,col_id) 列名 
<div class="spctrl" paragraphindex="58"></div>　　col_length(objname,colname) 列长度 
<div class="spctrl" paragraphindex="59"></div>　　valid_name(char_expr) 是否是有效<a href="http://baike.baidu.com/view/390932.htm" target="_blank">标识符</a> 
<div style="clear: both" class="bpctrl" paragraphindex="60"></div><img src ="http://www.blogjava.net/zhaochengming/aggbug/381740.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaochengming/" target="_blank">helloworld2008</a> 2012-06-28 22:57 <a href="http://www.blogjava.net/zhaochengming/archive/2012/06/28/381740.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sqlserver sql常用函数,语法 </title><link>http://www.blogjava.net/zhaochengming/archive/2012/06/28/381739.html</link><dc:creator>helloworld2008</dc:creator><author>helloworld2008</author><pubDate>Thu, 28 Jun 2012 14:50:00 GMT</pubDate><guid>http://www.blogjava.net/zhaochengming/archive/2012/06/28/381739.html</guid><wfw:comment>http://www.blogjava.net/zhaochengming/comments/381739.html</wfw:comment><comments>http://www.blogjava.net/zhaochengming/archive/2012/06/28/381739.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaochengming/comments/commentRss/381739.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaochengming/services/trackbacks/381739.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: --&nbsp;返回一个表中所有的字段select&nbsp;name&nbsp;from&nbsp;syscolumns&nbsp;where&nbsp;id=object_id('tb_usertable_online')--&nbsp;获取最近添加的标识列的值set&nbsp;@rs&nbsp;=&nbsp;@@identity--&nbsp;print&nbsp;len('abcdef')...&nbsp;&nbsp;<a href='http://www.blogjava.net/zhaochengming/archive/2012/06/28/381739.html'>阅读全文</a><img src ="http://www.blogjava.net/zhaochengming/aggbug/381739.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaochengming/" target="_blank">helloworld2008</a> 2012-06-28 22:50 <a href="http://www.blogjava.net/zhaochengming/archive/2012/06/28/381739.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>事务日志已满和'PRIMARY' 文件组已满的解决方案 .    http://blog.csdn.net/jwdream2008/article/details/5703780</title><link>http://www.blogjava.net/zhaochengming/archive/2012/05/30/379562.html</link><dc:creator>helloworld2008</dc:creator><author>helloworld2008</author><pubDate>Wed, 30 May 2012 07:37:00 GMT</pubDate><guid>http://www.blogjava.net/zhaochengming/archive/2012/05/30/379562.html</guid><wfw:comment>http://www.blogjava.net/zhaochengming/comments/379562.html</wfw:comment><comments>http://www.blogjava.net/zhaochengming/archive/2012/05/30/379562.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaochengming/comments/commentRss/379562.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaochengming/services/trackbacks/379562.html</trackback:ping><description><![CDATA[<h3><span class="link_title"><a href="http://blog.csdn.net/jwdream2008/article/details/5703780">事务日志已满和'PRIMARY' 文件组已满的解决方案 </a></span></h3>
<div class="article_manage"><span class="link_postdate">2010-06-30 10:23</span> <span class="link_view" title="阅读次数">1297人阅读</span> <span class="link_comments" title="评论次数"><a href="http://blog.csdn.net/jwdream2008/article/details/5703780#comments">评论</a>(0)</span> <span class="link_collect"><a title="收藏" href="javascript:void(0);">收藏</a></span> <span class="link_report"><a title="举报" href="http://blog.csdn.net/jwdream2008/article/details/5703780#report">举报</a></span> </div>
<div id="article_content" class="article_content">
<p>&nbsp;&nbsp; 昨天突然有客户反应系统无法正常的操作了！感到很震惊啊，系统一直运行正常啊，怎么会突然出问题。于是赶紧跟踪调查终于发现了问题的根源。</p>
<p>&nbsp;问题一：数据库 'XXXX' 的事务日志已满。若要查明无法重用日志中的空间的原因，请参阅 sys.databases 中的&nbsp;&nbsp; log_reuse_wait_desc 列</p>
<p>&nbsp; 问题二：无法为数据库 'XXX' 中的对象 ''PK_tbl_XXXX' 分配空间，因为 'PRIMARY' 文件组已满。请删除不需要的文件、删除文件组中的对象、将其他文件添加到文件组或为文件组中的现有文件启用自动增长，以便增加可用磁盘空间。"</p>
<p>&nbsp; 对于解决这两个问题的解决方案如下（在网上搜索了一把，问题解决了。现在整理了如下）：</p>
<p>&nbsp;<span style="color: #ff0000"><strong>问题一的解决方法：</strong></span></p>
<p><strong>方法1：&nbsp; </strong><span style="color: #000000"><strong>MSSQL2005日志的收缩</strong><br /></span><span style="color: #800000; font-weight: bold">１</span><span style="color: #000000">.右键在清除日志的数据库，如&#8220;TestDB&#8221;，点击</span><span style="color: #ff0000">[</span><span style="color: #ff0000">新建查询（Q）</span><span style="color: #ff0000">]</span><span style="color: #000000"><br /></span><span style="color: #800000; font-weight: bold">２</span><span style="color: #000000">.输入以下SQL语句，其中&#8220;TestDB&#8221;是数据库名称<br /></span><span style="color: #0000ff">&nbsp;&nbsp; DUMP</span><span style="color: #000000"> </span><span style="color: #0000ff">TRANSACTION</span><span style="color: #000000"> TestDB </span><span style="color: #0000ff">WITH</span><span style="color: #000000"> NO_LOG３.执行该SQL，成功后继续以下操作<br /></span><span style="color: #800000; font-weight: bold">４</span><span style="color: #000000">.右键该数据库节点，点击</span><span style="color: #ff0000">[</span><span style="color: #ff0000">任务（T）</span><span style="color: #ff0000">]</span><span style="color: #000000"> </span><span style="color: #808080">-&gt;</span><span style="color: #000000"> </span><span style="color: #ff0000">[</span><span style="color: #ff0000">收缩（S）</span><span style="color: #ff0000">]</span><span style="color: #000000"> </span><span style="color: #808080">-&gt;</span><span style="color: #000000"> </span><span style="color: #ff0000">[</span><span style="color: #ff0000">文件（F）</span><span style="color: #ff0000">]</span><span style="color: #000000"><br /></span><span style="color: #800000; font-weight: bold">５</span><span style="color: #000000">.在弹出的&#8220;收缩文件&#8221;对话框中，将&#8220;文件类型（T）&#8221;选为&#8220;日志&#8221;，将&#8220;收缩操作&#8221;选中&#8220;在释放未使用的空间前重新组织页（O）&#8221;<br /></span><span style="color: #800000; font-weight: bold">６</span><span style="color: #000000">.在&#8220;将文件收缩到（K）&#8221;文本框中输入后面提示的最小大小的数值，点击</span><span style="color: #ff0000">[</span><span style="color: #ff0000">确定</span><span style="color: #ff0000">]</span><span style="color: #000000">即可。</span></p>
<p>&nbsp;</p>
<p><span style="color: #000000"><strong><span style="color: #333333">方法2：下面的所有库名都指你要处理的数据库的库名</span></strong><span style="color: #000000"><br /></span><span style="color: #800000; font-weight: bold">1</span><span style="color: #000000">.清空日志<br /></span><span style="color: #0000ff">DUMP</span><span style="color: #000000"> </span><span style="color: #0000ff">TRANSACTION</span><span style="color: #000000"> 库名 </span><span style="color: #0000ff">WITH</span><span style="color: #000000"> NO_LOG<br /></span><span style="color: #800000; font-weight: bold">2</span><span style="color: #000000">.截断事务日志：<br /></span><span style="color: #0000ff">BACKUP</span><span style="color: #000000"> </span><span style="color: #ff00ff">LOG</span><span style="color: #000000"> 库名 </span><span style="color: #0000ff">WITH</span><span style="color: #000000"> NO_LOG<br /></span><span style="color: #800000; font-weight: bold">3</span><span style="color: #000000">.收缩数据库文件(如果不压缩,数据库的文件不会减小<br />企业管理器</span><span style="color: #008080">--</span><span style="color: #008080">右键你要压缩的数据库--所有任务--收缩数据库--收缩文件</span><span style="color: #008080"><br />--</span><span style="color: #008080">选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了</span><span style="color: #008080"><br />--</span><span style="color: #008080">选择数据文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了</span><span style="color: #008080"><br /></span><span style="color: #000000"><br />也可以用SQL语句来完成 <br /></span><span style="color: #008080">--</span><span style="color: #008080">收缩数据库</span><span style="color: #008080"><br /></span><span style="color: #0000ff">DBCC</span><span style="color: #000000"> SHRINKDATABASE(库名)<br /></span><span style="color: #008080">--</span><span style="color: #008080">收缩指定数据文件,1是文件号,可以通过这个语句查询到:select * from sysfiles</span><span style="color: #008080"><br /></span><span style="color: #0000ff">DBCC</span><span style="color: #000000"> SHRINKFILE(</span><span style="color: #800000; font-weight: bold">1</span><span style="color: #000000">)<br /></span><span style="color: #800000; font-weight: bold">4</span><span style="color: #000000">.为了最大化的缩小日志文件(如果是sql </span><span style="color: #800000; font-weight: bold">7.0</span><span style="color: #000000">,这步只能在查询分析器中进行)<br />a.分离数据库:<br />企业管理器</span><span style="color: #008080">--</span><span style="color: #008080">服务器--数据库--右键--分离数据库</span><span style="color: #000000"><br />b.在我的电脑中删除LOG文件</span></span></p>
<p><span style="color: #000000"><span style="color: #000000">c.附加数据库:<br />企业管理器</span><span style="color: #008080">--</span><span style="color: #008080">服务器--数据库--右键--附加数据库</span><span style="color: #000000"><br />此法将生成新的LOG，大小只有500多K<br />或用代码： <br />下面的示例分离 pubs，然后将 pubs 中的一个文件附加到当前服务器。<br />a.分离<br /></span><span style="color: #0000ff">EXEC</span><span style="color: #000000"> sp_detach_db </span><span style="color: #008000">@dbname</span><span style="color: #000000"> </span><span style="color: #808080">=</span><span style="color: #000000"> </span><span style="color: #ff0000">'</span><span style="color: #ff0000">库名</span><span style="color: #ff0000">'</span><span style="color: #000000"><br />b.删除日志文件<br />c.再附加<br /></span><span style="color: #0000ff">EXEC</span><span style="color: #000000"> sp_attach_single_file_db </span><span style="color: #008000">@dbname</span><span style="color: #000000"> </span><span style="color: #808080">=</span><span style="color: #000000"> </span><span style="color: #ff0000">'</span><span style="color: #ff0000">库名</span><span style="color: #ff0000">'</span><span style="color: #000000">, <br /></span><span style="color: #008000">@physname</span><span style="color: #000000"> </span><span style="color: #808080">=</span><span style="color: #000000"> </span><span style="color: #ff0000">'</span><span style="color: #ff0000">c:/Program Files/Microsoft SQL Server/MSSQL/Data/库名.mdf</span><span style="color: #ff0000">'</span><span style="color: #000000"><br /></span><span style="color: #800000; font-weight: bold">5</span><span style="color: #000000">.为了以后能自动收缩,做如下设置:<br />企业管理器</span><span style="color: #008080">--</span><span style="color: #008080">服务器--右键数据库--属性--选项--选择"自动收缩"</span><span style="color: #000000"><br /></span><span style="color: #008080">--</span><span style="color: #008080">SQL语句设置方式:</span><span style="color: #008080"><br /></span><span style="color: #0000ff">EXEC</span><span style="color: #000000"> sp_dboption </span><span style="color: #ff0000">'</span><span style="color: #ff0000">库名</span><span style="color: #ff0000">'</span><span style="color: #000000">, </span><span style="color: #ff0000">'</span><span style="color: #ff0000">autoshrink</span><span style="color: #ff0000">'</span><span style="color: #000000">, </span><span style="color: #ff0000">'</span><span style="color: #ff0000">TRUE</span><span style="color: #ff0000">'</span><span style="color: #000000"><br /></span><span style="color: #800000; font-weight: bold">6</span><span style="color: #000000">.如果想以后不让它日志增长得太大<br />企业管理器</span><span style="color: #008080">--</span><span style="color: #008080">服务器--右键数据库--属性--事务日志</span><span style="color: #008080"><br />--</span><span style="color: #008080">将文件增长限制为xM(x是你允许的最大数据文件大小)</span><span style="color: #000000"><br /></span><span style="color: #008080">--</span><span style="color: #008080">SQL语句的设置方式:</span><span style="color: #008080"><br /></span><span style="color: #0000ff">alter</span><span style="color: #000000"> </span><span style="color: #0000ff">database</span><span style="color: #000000"> 库名 modify </span><span style="color: #0000ff">file</span><span style="color: #000000">(name</span><span style="color: #808080">=</span><span style="color: #000000">逻辑文件名,maxsize</span><span style="color: #808080">=</span><span style="color: #800000; font-weight: bold">20</span><span style="color: #000000">)</span></span></p>
<p><span style="color: #000000"><span style="color: #000000"><span style="color: #ff0000">特别注意</span>：<span style="color: #008080">--</span><span style="color: #008080">最好备份日志，以后可通过日志恢复数据。。。</span><span style="color: #008080"><br /></span><span style="color: #000000">以下为日志处理方法<br />一般不建议做第4,6两步<br />第4步不安全,有可能损坏数据库或丢失数据<br />第6步如果日志达到上限,则以后的数据库处理会失败,在清理日志后才能恢复.<br /></span></span></span></p>
<p><span style="color: #000000"><span style="color: #ff0000"><strong>问题二的解决方案：</strong></span></span></p>
<p><span style="color: #000000"><span style="color: #000000">解决方法：<br />1.检查你的磁盘剩余空间是否足够,如果没有磁盘剩余空间,则清理磁盘,腾出空间</span></span></p>
<p><span style="color: #000000"><span style="color: #000000">2.检查你的磁盘分区格式<br />如果是FAT16,则数据文件最大只能是2G<br />如果是FAT32,则数据文件最大只能是4G<br />改为NTFS分区则没有这种限制</span></span></p>
<p><span style="color: #000000"><span style="color: #000000">3.检查一下你有没有限制数据库文件的大小<br />企业管理器--右键你的数据库--属性--文件增长限制--如果有限制大小,取消限制</span></span></p>
<p><span style="color: #000000"><span style="color: #000000">4.检查你的SQL版本,如果你用MSDE,则限制了数据文件最大是2G</span></span></p>
<p><span style="color: #000000"><span style="color: #000000">5.你也可以为 primary 组添加新的数据文件来解决这个问题<br />alter database 库名 add file(NAME = 逻辑文件名,FILENAME = 'c:/实际文件名.ndf'</span></span></p>
<p><span style="color: #000000"><span style="color: #000000">&nbsp;或者 选中数据库-&gt;属性-&gt;文件：添加一个新文件</span></span><span style="color: #000000"><br /></span></p></div><img src ="http://www.blogjava.net/zhaochengming/aggbug/379562.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaochengming/" target="_blank">helloworld2008</a> 2012-05-30 15:37 <a href="http://www.blogjava.net/zhaochengming/archive/2012/05/30/379562.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sqlserver删除日志</title><link>http://www.blogjava.net/zhaochengming/archive/2012/05/29/379462.html</link><dc:creator>helloworld2008</dc:creator><author>helloworld2008</author><pubDate>Tue, 29 May 2012 09:41:00 GMT</pubDate><guid>http://www.blogjava.net/zhaochengming/archive/2012/05/29/379462.html</guid><wfw:comment>http://www.blogjava.net/zhaochengming/comments/379462.html</wfw:comment><comments>http://www.blogjava.net/zhaochengming/archive/2012/05/29/379462.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaochengming/comments/commentRss/379462.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaochengming/services/trackbacks/379462.html</trackback:ping><description><![CDATA[backup log upd364 with NO_LOG<br />backup log upd364 with TRUNCATE_ONLY<br />DBCC SHRINKDATABASE(upd364) <img src ="http://www.blogjava.net/zhaochengming/aggbug/379462.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaochengming/" target="_blank">helloworld2008</a> 2012-05-29 17:41 <a href="http://www.blogjava.net/zhaochengming/archive/2012/05/29/379462.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库表的连接(转)</title><link>http://www.blogjava.net/zhaochengming/archive/2008/01/09/173891.html</link><dc:creator>helloworld2008</dc:creator><author>helloworld2008</author><pubDate>Wed, 09 Jan 2008 01:32:00 GMT</pubDate><guid>http://www.blogjava.net/zhaochengming/archive/2008/01/09/173891.html</guid><wfw:comment>http://www.blogjava.net/zhaochengming/comments/173891.html</wfw:comment><comments>http://www.blogjava.net/zhaochengming/archive/2008/01/09/173891.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaochengming/comments/commentRss/173891.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaochengming/services/trackbacks/173891.html</trackback:ping><description><![CDATA[<p>原文作者 <a class="headermaintitle" id="Header1_HeaderTitle" href="http://blog.csdn.net/dmlk31/">外来物种</a><br />
<font size="3">地址 <a href="http://blog.csdn.net/dmlk31/archive/2008/01/02/2010216.aspx">http://blog.csdn.net/dmlk31/archive/2008/01/02/2010216.aspx</a><br />
<br />
<strong>本文收集了网上关于Left join , Right Join, Inner Join 的相关内容，非常实用，对于理解原理和具体应用都很有帮助！</strong></font></p>
<p><strong><font size="3">一.先看一些最简单的例子</font></strong></p>
<p>例子</p>
<p><strong>Table A</strong><br />
aid&nbsp;&nbsp; adate <br />
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a1 <br />
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a2 <br />
3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a3 </p>
<p><strong>TableB</strong></p>
<p>bid bdate <br />
1&nbsp;&nbsp;&nbsp; b1 <br />
2&nbsp;&nbsp; &nbsp;b2 <br />
4&nbsp;&nbsp;&nbsp; b4 <br />
两个表a,b相连接,要取出id相同的字段 <br />
select * from a<font color="#993300"> <strong>inner join</strong></font> b on a.aid = b.bid这是仅取出匹配的数据. <br />
此时的取出的是: <br />
1 a1 b1 <br />
2 a2 b2 <br />
<br />
那么left join 指: <br />
select * from a <strong><font color="#800000">left join</font></strong> b on a.aid = b.bid <br />
首先取出a表中所有数据,然后再加上与a,b匹配的的数据 <br />
此时的取出的是: <br />
1 a1 b1 <br />
2 a2 b2 <br />
3 a3 空字符 <br />
<br />
同样的也有<strong><font color="#800000">right join</font></strong> <br />
指的是首先取出b表中所有数据,然后再加上与a,b匹配的的数据 <br />
此时的取出的是: <br />
1 a1 b1 <br />
2 a2 b2 <br />
4 空字符 b4<br />
<br />
LEFT JOIN 或 LEFT OUTER JOIN。 <br />
左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行，而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行，则在相关联的结果集行中右表的所有选择列表列均为空值</p>
<p><strong><font size="3">二. left join/right join/inner join操作演示</font></strong></p>
<div class="postText"><span style="color: rgb(255,0,0)">表A记录如下：</span><br />
<span style="color: rgb(0,0,255)"><strong>aID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aNum</strong><br />
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a20050111<br />
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a20050112<br />
3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a20050113<br />
4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;a20050114<br />
5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a20050115</span><br />
<br />
<span style="color: rgb(255,0,0)">表B记录如下:</span><br />
<span style="color: rgb(0,0,255)"><strong>bID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bName</strong><br />
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2006032401<br />
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2006032402<br />
3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2006032403<br />
4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2006032404<br />
8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2006032408<br />
</span><br />
<span style="color: rgb(255,0,0)">实验如下:</span><br />
<strong style="color: rgb(255,102,0)">1.&nbsp;&nbsp;&nbsp; left join</strong><br />
<span style="color: rgb(0,0,255)">sql语句如下: <br />
</span>
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: rgb(0,0,255)">SELECT</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(128,128,128)">*</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">FROM</span><span style="color: rgb(0,0,0)">&nbsp;A<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: rgb(255,0,255)">LEFT</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">JOIN</span><span style="color: rgb(0,0,0)">&nbsp;B&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: rgb(0,0,255)">ON</span><span style="color: rgb(0,0,0)">&nbsp;A.aID&nbsp;</span><span style="color: rgb(128,128,128)">=</span><span style="color: rgb(0,0,0)">&nbsp;B.bID</span></div>
<br />
<span style="color: rgb(255,0,0)">结果如下:</span><br />
<span style="color: rgb(0,0,255)">aID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aNum&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; bID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bName<br />
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a20050111&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2006032401<br />
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a20050112&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2006032402<br />
3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a20050113&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2006032403<br />
4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a20050114&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2006032404<br />
5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a20050115&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL</span><br />
（所影响的行数为 5 行）<br />
<br />
<span style="color: rgb(0,128,0)">结果说明:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.<br />
换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID).<br />
B表记录不足的地方均为NULL.</span><br />
<br />
<strong style="color: rgb(255,102,0)">2.&nbsp;&nbsp;&nbsp; right join</strong><br />
<span style="color: rgb(0,0,255)">sql语句如下: <br />
</span>
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: rgb(0,0,255)">SELECT</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(128,128,128)">*</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">FROM</span><span style="color: rgb(0,0,0)">&nbsp;A<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: rgb(255,0,255)">RIGHT</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">JOIN</span><span style="color: rgb(0,0,0)">&nbsp;B&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: rgb(0,0,255)">ON</span><span style="color: rgb(0,0,0)">&nbsp;A.aID&nbsp;</span><span style="color: rgb(128,128,128)">=</span><span style="color: rgb(0,0,0)">&nbsp;B.bID</span></div>
<br />
<span style="color: rgb(255,0,0)">结果如下:</span><br />
<span style="color: rgb(0,0,255)">aID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aNum&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; bID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bName<br />
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a20050111&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2006032401<br />
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a20050112&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2006032402<br />
3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a20050113&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2006032403<br />
4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a20050114&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2006032404<br />
NULL&nbsp;&nbsp;&nbsp;&nbsp;NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2006032408</span><br />
（所影响的行数为 5 行）<br />
<br />
<span style="color: rgb(0,128,0)">结果说明:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 仔细观察一下,就会发现,和left join的结果刚好相反,这次是以右表(B)为基础的,A表不足的地方用NULL填充.</span><br />
<br />
<strong style="color: rgb(255,102,0)">3.inner join</strong><br />
<span style="color: rgb(0,0,255)">sql语句如下: <br />
</span>
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: rgb(0,0,255)">SELECT</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(128,128,128)">*</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">FROM</span><span style="color: rgb(0,0,0)">&nbsp;A<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />INNERJOIN&nbsp;B&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: rgb(0,0,255)">ON</span><span style="color: rgb(0,0,0)">&nbsp;A.aID&nbsp;</span><span style="color: rgb(128,128,128)">=</span><span style="color: rgb(0,0,0)">&nbsp;B.bID</span></div>
<br />
<span style="color: rgb(255,0,0)">结果如下:</span><br />
<span style="color: rgb(0,0,255)">aID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aNum&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; bID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bName<br />
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a20050111&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2006032401<br />
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a20050112&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2006032402<br />
3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a20050113&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2006032403<br />
4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a20050114&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2006032404</span><br />
<br />
<span style="color: rgb(0,128,0)">结果说明:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 很明显,这里只显示出了 A.aID = B.bID的记录.这说明inner join并不以谁为基础,它只显示符合条件的记录.</span><br />
<br />
<p>－－－－－－－－－－－－－－－－－［以下为网上的一点资料］－－－－－－－－－－－－－－－－－－ <br />
LEFT JOIN操作用于在任何的 FROM 子句中，组合来源表的记录。使用 LEFT JOIN 运算来创建一个左边外部联接。左边外部联接将包含了从第一个（左边）开始的两个表中的全部记录，即使在第二个（右边）表中并没有相符值的记录。 <br />
<br />
<span style="color: rgb(255,0,0)">语法：</span><br />
<span style="color: rgb(0,0,255)">FROM table1 LEFT JOIN table2 ON table1.field1 compopr table2.field2 </span><br />
<br />
<span style="color: rgb(255,0,0)">说明：</span><br />
<span style="color: rgb(0,0,255)">①　table1, table2参数用于指定要将记录组合的表的名称。<br />
②　field1, field2参数指定被联接的字段的名称。且这些字段必须有相同的数据类型及包含相同类型的数据，但它们不需要有相同的名称。<br />
③　compopr参数指定关系比较运算符："="， "&lt;"， "&gt;"， "&lt;="， "&gt;=" 或 "&lt;&gt;"。<br />
④　如果在INNER JOIN操作中要联接包含Memo 数据类型或 OLE Object 数据类型数据的字段，将会发生错误。</span></p>
</div>
<p><strong><font size="3">三.相关的复杂的解释和实例</font></strong></p>
<p>简介: 外部连接和自联接 inner join(等值连接) 只返回两个表中联结字段相等的行 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录 on 指定表间联结字段及其关系的等号 "=" 表达式, 返回 true 或 false. 当表达式返回 true 时, 则查询中包含该记录. ! 外部连接只能操作已存在于数据库中的数据<br />
update (ctarticle as a left join ctclass as c on a.classid = c.classid) left join cttag as b on a.articleid = b.articleid <br />
set tag=tag+' ', b.articleid=a.articleid, b.classid=a.classid, b.nclassid=a.nclassid <br />
where a.classid=23 and a.nclassid=0 and tagid is not null <br />
<br />
update (ctarticle as a left join (ctnclass as c left join ctclass as d on c.classid = d.classid) on a.nclassid = c.nclassid and a.classid = c.classid) left join cttag as b on a.articleid = b.articleid set tag=d.class+' '+c.nclass, b.articleid=a.articleid, b.classid=a.classid, b.nclassid=a.nclassid where a.classid=23 and a.nclassid=197; <br />
<br />
更新操作 <br />
左连接中数据的筛选 <br />
insert into cttag(articleid,classid,nclassid) select a.articleid,a.classid,a.nclassid from ctarticle a left join cttag b on a.articleid=b.articleid where b.articleid is null <br />
<br />
//本语句功能为, 显示主表的全部内容, 插入数据到副表中没有的数据 <br />
//主要作用为: 让数据减少冗余 <br />
<br />
上例中的延续 <br />
select a.*, b.*, c.*, d.* from cttag as d left join ((ctarticle as a left join ctclass as b on a.classid=b.classid) left join ctnclass as c on a.nclassid=c.nclassid) on d.articleid=a.articleid; <br />
<br />
显示文章表中的全部, 调用类别表中的栏目 <br />
select a.*, b.*, c.* from (ctarticle a left join ctclass b on a.classid=b.classid) left join ctnclass c on a.nclassid=c.nclassid <br />
<br />
//作用, 有时在文章表中包含了在个别类别表中没有的数据, 用这个语法可以读出文章表的全部数据 <br />
//a 为 文章表, b 为主类别, c 为子类别 <br />
<br />
同上例, 选择追加数据时加上空格 <br />
insert into cttag(articleid,classid,nclassid,tag) select a.articleid,a.classid,a.nclassid,d.class+' '+c.nclass <br />
from (ctarticle as a left join (ctnclass c left join ctclass d on c.classid=d.classid) on a.classid=c.classid and a.nclassid=c.nclassid) left join cttag as b on a.articleid = b.articleid where a.classid=4 and a.nclassid=154; <br />
<br />
连接n个表, 并追加数据到其中一个表, n=4 <br />
insert into cttag(articleid,classid,nclassid,tag) select a.articleid,a.classid,a.nclassid,d.class+c.nclass <br />
from (ctarticle as a left join (ctnclass c left join ctclass d on c.classid=d.classid) on a.classid=c.classid and a.nclassid=c.nclassid) left join cttag as b on a.articleid = b.articleid where a.classid=1 and a.nclassid=1; <br />
<br />
//解读 <br />
插入到 表2(栏1,栏2,栏3,栏4) <br />
选择 别名a.栏1, 别名a.栏2, 别名a.栏3, 别名d.栏4 加上 别名c.栏5 <br />
从 (表1 别名a 左连接 (表3 别名c 左连接 表4 别名d 在 别名c.栏2 等于 别名d.栏2) 在 别名a.栏2 等于 别名c.栏2 和 别名a.栏3=别名c.栏3) 左连接 表2 别名b 在 别名a.栏1 等于 别名b.栏1 在那里 别名a.栏2=1 和 别名a.栏3=1 <br />
<br />
连接两个表, 并追加数据到其中一个表 <br />
insert into cttag(articleid,classid,nclassid) <br />
select a.articleid,a.classid,a.nclassid <br />
from ctarticle as a left join cttag as b on a.articleid = b.articleid where a.classid=1 and a.nclassid=1; <br />
<br />
//解读 <br />
插入到 表2(栏1,栏2,栏3) <br />
选择 别名a.栏1, 别名a.栏2, 别名a.栏3 <br />
从 表1 别名a 左连接 表2 别名b 在 别名a.栏1 等于 别名b.栏1 在那里 别名a.栏4=1 和 别名a.栏5=1 <br />
<br />
左连接 <br />
<br />
同步两表的数据 <br />
update ctarticle a inner join cttag b on a.articleid = b.articleid set b.classid=a.classid, b.nclassid=a.nclassid; <br />
<br />
//解读 <br />
更新 表1 别名a 联接 表2 别名2 在 别名a.栏1 等于 别名b.栏1 设置 别名b.栏2 更新为 别名a.栏2, 别名b.栏3 更新为 别名a.栏3 <br />
<br />
右外连接 <br />
select a.*, b.* from bunclass a right join ctclass b on a.classid=b.classid where a.nclassid=20 <br />
<br />
查询别名 a,b 表, 只匹配 b 表中的内容. <br />
<br />
添加数据到连接表之一 <br />
insert into cttag ( tag, articleid ) select top 1 b.tag, a.articleid from ctarticle as a left join cttag as b on a.articleid = b.articleid where a.articleid order by a.articleid desc; <br />
<br />
变通中的用法二 <br />
insert into bureply <br />
select b.*, a.classid, a.nclassid <br />
from article as a inner join reply as b on a.articleid = b.articleid <br />
where classid=50; <br />
<br />
实际应用中的变通 <br />
insert into butag ( tag, articleid, classid, nclassid) <br />
select b.tag, a.articleid, a.classid, a.nclassid <br />
from article as a inner join tag as b on a.articleid = b.articleid <br />
where classid=24; <br />
<br />
<br />
添加数据到其他表 <br />
insert into butag ( tag, articleid ) <br />
select b.tag, a.articleid <br />
from article as a inner join tag as b on a.articleid = b.articleid <br />
where a.articleid&lt;&gt;false; <br />
<br />
//解读 <br />
添加到 接收表(列1,列2) <br />
选择 别名b.列1, 别名a.列2 <br />
从 表1 表名a 联接 表2 表名b 在 别名a.列c 等于 别名b.列c <br />
在哪里 别名a.列c 不等于 没有 <br />
<br />
实际应用中的变通 <br />
select b.tag, a.articleid, a.classid, a.nclassid <br />
from article as a inner join tag as b on a.articleid = b.articleid <br />
where a.classid=24; <br />
<br />
查询 <br />
select b.tag, a.articleid <br />
from article as a inner join tag as b on a.articleid = b.articleid <br />
where a.articleid&lt;&gt;false; <br />
<br />
//解读 <br />
选择 别名b.列, 别名a.列 <br />
从 表1 别名a 联接 表2 别名b 在 别名a.列c = 别名b.列c <br />
在哪里 别名a.列c 不等于 没有 <br />
注: as 不是必要</p>
<img src ="http://www.blogjava.net/zhaochengming/aggbug/173891.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaochengming/" target="_blank">helloworld2008</a> 2008-01-09 09:32 <a href="http://www.blogjava.net/zhaochengming/archive/2008/01/09/173891.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>postgresql 的一个更新字符串的类脂(存储过程)</title><link>http://www.blogjava.net/zhaochengming/archive/2007/08/24/139096.html</link><dc:creator>helloworld2008</dc:creator><author>helloworld2008</author><pubDate>Fri, 24 Aug 2007 06:11:00 GMT</pubDate><guid>http://www.blogjava.net/zhaochengming/archive/2007/08/24/139096.html</guid><wfw:comment>http://www.blogjava.net/zhaochengming/comments/139096.html</wfw:comment><comments>http://www.blogjava.net/zhaochengming/archive/2007/08/24/139096.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaochengming/comments/commentRss/139096.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaochengming/services/trackbacks/139096.html</trackback:ping><description><![CDATA[CREATE OR REPLACE FUNCTION update_datareporturl() returns void as<br>$$<br>DECLARE<br>recs RECORD;<br>p integer;<br>str text;<br>begin<br>FOR recs IN SELECT&nbsp; datareport_id AS id,CAST(datareport_url AS TEXT) AS url&nbsp; FROM tbl_datareport <br>LOOP<br>&nbsp;p = strpos(recs.url,'&amp;report=');<br>&nbsp;IF (p &gt; 0) then<br>&nbsp;&nbsp;str = substr(recs.url,p);<br>&nbsp;&nbsp;str = substr(str,9);<br>&nbsp;&nbsp;p = strpos(str,'&amp;');<br>&nbsp;&nbsp;if (p &gt; 0) THEN<br>&nbsp;&nbsp;&nbsp;str = substr(str,0,p);<br>&nbsp;&nbsp;END IF;<br>&nbsp;&nbsp;EXECUTE 'UPDATE tbl_datareport SET datareport_url='''||str||''' WHERE datareport_id='||recs.id||'';&nbsp;<br>&nbsp;end IF;<br>&nbsp;<br>END LOOP;<br>return;<br>end;<br>$$<br>LANGUAGE 'plpgsql' VOLATILE;<br>select * from update_datareporturl();<br>后面会研究一下存储过程中用正则表达式的使用
<img src ="http://www.blogjava.net/zhaochengming/aggbug/139096.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaochengming/" target="_blank">helloworld2008</a> 2007-08-24 14:11 <a href="http://www.blogjava.net/zhaochengming/archive/2007/08/24/139096.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pgsql的一个存储过程的例子</title><link>http://www.blogjava.net/zhaochengming/archive/2007/08/13/136485.html</link><dc:creator>helloworld2008</dc:creator><author>helloworld2008</author><pubDate>Mon, 13 Aug 2007 11:00:00 GMT</pubDate><guid>http://www.blogjava.net/zhaochengming/archive/2007/08/13/136485.html</guid><wfw:comment>http://www.blogjava.net/zhaochengming/comments/136485.html</wfw:comment><comments>http://www.blogjava.net/zhaochengming/archive/2007/08/13/136485.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaochengming/comments/commentRss/136485.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaochengming/services/trackbacks/136485.html</trackback:ping><description><![CDATA[<p>CREATE OR REPLACE FUNCTION fun2(bvalue float,con char(1), store_no int4, timeflag varchar )<br>&nbsp;&nbsp; RETURNS SETOF RECORD AS<br>$BODY$<br>DECLARE<br>temp RECORD;<br>temp2 RECORD;<br>BEGIN<br>IF (timeflag IS NOT NULL) THEN<br>&nbsp;&nbsp; FOR temp IN SELECT COALESCE(field23039,0)*COALESCE(field23234,0) AS v ,field23042||'' AS f ,field23035 AS n FROM tbl_3504 WHERE field23041 &lt;= timeflag AND field23039 &gt; 0 AND field23818 = 'Y' <br>&nbsp;&nbsp; LOOP<br>&nbsp;&nbsp;&nbsp; FOR temp2 IN SELECT r.x,r.b,r.c FROM fun2(temp.v,temp.f,temp.n,null) r(x float,b text,c int4)<br>&nbsp;&nbsp;&nbsp;&nbsp; LOOP<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return next temp2;<br>&nbsp;&nbsp;&nbsp;&nbsp; END LOOP;<br>&nbsp;&nbsp;&nbsp; RETURN next temp;<br>&nbsp;&nbsp; END LOOP;&nbsp;&nbsp;&nbsp;<br>ELSE <br>&nbsp;&nbsp; if (con = '1') THEN<br>&nbsp;&nbsp;&nbsp; FOR temp IN SELECT ((COALESCE(bvalue,0)+COALESCE(tbl_1525.field11329,0) ) * COALESCE(tbl_1526.field11210,0) + COALESCE(tbl_1526.field11211,0) ) AS v ,tbl_1526.field11212||'' AS f , field11207 AS n FROM&nbsp;&nbsp; tbl_1525,tbl_1526 where tbl_1525.field11201 = 'Y' AND tbl_1526.field11264='Y' AND tbl_1525.tbl_fldid=tbl_1526.tbl_fldid AND tbl_1525.field11202 = store_no<br>&nbsp;&nbsp;&nbsp; LOOP<br>&nbsp;&nbsp;&nbsp;&nbsp; FOR temp2 IN SELECT r.x,r.b,r.c FROM fun2(temp.v,temp.f,temp.n,null) r(x float,b text,c int4)<br>&nbsp;&nbsp;&nbsp;&nbsp; LOOP<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RETURN NEXT temp2;<br>&nbsp;&nbsp;&nbsp;&nbsp; END LOOP;<br>&nbsp;&nbsp;&nbsp; RETURN next temp;<br>&nbsp;&nbsp;&nbsp; end LOOP;<br>&nbsp;&nbsp; ELSEIF (con = '2') THEN<br>&nbsp;&nbsp;&nbsp; FOR temp IN SELECT ((bvalue+COALESCE(tbl_1513.field11118,0))*( (COALESCE(tbl_1514.field11127,0) / COALESCE(tbl_1513.field11119,1) ) +(COALESCE(tbl_1514.field11128,0)/100) )) AS v,tbl_1513.field23097||'' AS f,field23101 AS n FROM tbl_1513,tbl_1514 WHERE tbl_1513.field11122='Y' AND tbl_1514.field11263 = 'Y' AND tbl_1513.tbl_fldid = tbl_1514.tbl_fldid AND tbl_1513.field11113 = store_no<br>&nbsp;&nbsp;&nbsp; LOOP <br>&nbsp;&nbsp;&nbsp;&nbsp; FOR temp2 IN SELECT r.x,r.b,r.c FROM fun2(temp.v,temp.f,temp.n,null) r(x float,b text,c int4)<br>&nbsp;&nbsp;&nbsp;&nbsp; LOOP<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RETURN NEXT temp2;<br>&nbsp;&nbsp;&nbsp;&nbsp; END LOOP;<br>&nbsp;&nbsp;&nbsp; RETURN NEXT temp;<br>&nbsp;&nbsp;&nbsp; END LOOP;<br>&nbsp;&nbsp; END IF;<br>END IF;<br>RETURN;<br>END;<br>$BODY$<br>&nbsp;&nbsp; LANGUAGE 'plpgsql' VOLATILE;<br>&nbsp;&nbsp;<br>CREATE OR REPLACE FUNCTION fun1(timeflag varchar) RETURNS SETOF RECORD AS<br>$$<br>DECLARE <br>temp2 RECORD;<br>BEGIN<br>FOR temp2 IN SELECT tablename FROM pg_tables WHERE tablename='x1' <br>LOOP<br>EXECUTE 'DROP table x1';<br>END LOOP;<br>FOR temp2 IN SELECT tablename FROM pg_tables WHERE tablename='x2' <br>LOOP<br>EXECUTE 'DROP table x2';<br>END LOOP;<br>FOR temp2 IN SELECT tablename FROM pg_tables WHERE tablename='x3' <br>LOOP<br>EXECUTE 'DROP table x3';<br>END LOOP;<br>FOR temp2 IN SELECT tablename FROM pg_tables WHERE tablename='x4' <br>LOOP<br>EXECUTE 'DROP table x4';<br>END LOOP;<br>/** condition x1 **/<br>EXECUTE 'CREATE TEMP TABLE x1 AS SELECT material_no AS no,unproduct_number AS count FROM tbl_headstore WHERE unproduct_number &gt; 0 AND work_code&lt;&gt;''Q''' ;<br>/** condition x2 **/<br>EXECUTE 'CREATE TEMP TABLE x2 AS SELECT field20004 AS no, field20009 * COALESCE(field20007,0) AS count FROM tbl_3001 WHERE field20325 &lt;= ' ||timeflag|| ' AND field20009 &gt; 0 AND field20021 &lt;&gt; ''U'' AND field20021 &lt;&gt; ''K'' AND field20332 = ''Y''';<br>/** condition x3 **/<br>EXECUTE 'CREATE TEMP TABLE x3 AS SELECT field20031 AS no , field20036 * COALESCE(field20034,0) AS count&nbsp;&nbsp; FROM tbl_3002 WHERE field20331 &lt;= '||timeflag||' AND field20036 &gt; 0 AND field20030 &lt;&gt; ''M'' AND field20030 &lt;&gt; ''U'' AND field20352 = ''Y''';<br>/** condition x4 **/<br>EXECUTE 'CREATE TEMP table x4 as SELECT sum(store.count) AS count,store.no AS no from fun2(0,'''',0,'''||timeflag||''') store(count float,flag text,no int4)&nbsp;&nbsp; GROUP BY store.no';</p>
<p>FOR temp2 IN EXECUTE'SELECT CAST(x5.no AS varchar), tbl_headmaterial.material_name,tbl_headmaterial.material_unit,<br>CAST(round(COALESCE(CAST(x1.count AS numeric),0),3) AS varchar) ,<br>CAST(round(COALESCE(CAST(x2.count AS numeric),0),3) AS varchar) ,<br>CAST(round(COALESCE(CAST(x3.count AS numeric),0),3) AS varchar) , <br>CAST(round(COALESCE(CAST(x4.count AS numeric),0),3) AS varchar) , <br>CAST(round(COALESCE(CAST(x1.count AS numeric),0)+COALESCE(CAST(x2.count AS numeric),0)-COALESCE(CAST(x3.count AS numeric),0)-COALESCE(CAST(x4.count AS numeric),0),3) AS varchar) FROM <br>(SELECT DISTINCT no AS no FROM (SELECT CAST(no as int4) as no FROM x1 UNION SELECT CAST(no as int4) AS no FROM x2 UNION SELECT CAST(no as int4) as no FROM x3 UNION SELECT CAST(no as int4) as no FROM x4)AS x6) AS x5<br>LEFT JOIN x1 ON x5.no = x1.no LEFT JOIN x2 ON x5.no = x2.no LEFT JOIN x3 ON x5.no = x3.no LEFT JOIN x4 on x5.no = x4.no LEFT JOIN tbl_headmaterial on x5.no = tbl_headmaterial.material_no'<br>LOOP<br>RETURN NEXT temp2;<br>END LOOP;<br>EXECUTE 'DROP table x1';<br>EXECUTE 'DROP table x2';<br>EXECUTE 'DROP table x3';<br>EXECUTE 'DROP table x4';<br>RETURN;<br>END;<br>$$<br>language plpgsql;</p>
<p><br>select * from fun1('2007-12-30') store (no varchar,name varchar,unit varchar ,x1 varchar,x2 varchar,x3 varchar,x4 varchar,x5 varchar);</p>
<p>&nbsp;&nbsp;</p>
<img src ="http://www.blogjava.net/zhaochengming/aggbug/136485.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaochengming/" target="_blank">helloworld2008</a> 2007-08-13 19:00 <a href="http://www.blogjava.net/zhaochengming/archive/2007/08/13/136485.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多表连接的查询</title><link>http://www.blogjava.net/zhaochengming/archive/2007/08/13/136484.html</link><dc:creator>helloworld2008</dc:creator><author>helloworld2008</author><pubDate>Mon, 13 Aug 2007 10:59:00 GMT</pubDate><guid>http://www.blogjava.net/zhaochengming/archive/2007/08/13/136484.html</guid><wfw:comment>http://www.blogjava.net/zhaochengming/comments/136484.html</wfw:comment><comments>http://www.blogjava.net/zhaochengming/archive/2007/08/13/136484.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaochengming/comments/commentRss/136484.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaochengming/services/trackbacks/136484.html</trackback:ping><description><![CDATA[<p>表A1<br>id&nbsp;&nbsp; A<br>1&nbsp;&nbsp;&nbsp; 1<br>2&nbsp;&nbsp;&nbsp; 2<br>3&nbsp;&nbsp;&nbsp; 3</p>
<p>表A2<br>id&nbsp;&nbsp; B<br>2&nbsp;&nbsp;&nbsp; 22<br>3&nbsp;&nbsp;&nbsp; 33<br>5&nbsp;&nbsp;&nbsp; 55</p>
<p>表A3<br>id&nbsp;&nbsp; C<br>1&nbsp;&nbsp;&nbsp; 111<br>2&nbsp;&nbsp;&nbsp; 222<br>7&nbsp;&nbsp;&nbsp; 777</p>
<p>表A4<br>id&nbsp;&nbsp; D<br>5&nbsp;&nbsp;&nbsp; 5555<br>6&nbsp;&nbsp;&nbsp; 6666<br>7&nbsp;&nbsp;&nbsp; 7777</p>
<p>现在要写个查询，结果为，怎么写呢<br>id&nbsp;&nbsp; A&nbsp;&nbsp;&nbsp; B&nbsp;&nbsp;&nbsp; C&nbsp;&nbsp;&nbsp; D<br>1&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 111 0<br>2&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp; 22&nbsp;&nbsp; 222 0<br>3&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp; 33&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 0<br>5&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 55&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 5555<br>6&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 6666<br>7&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 777 7777<br></p>
<p>select a5.id,COALESCE(a1."A",0) as A,COALESCE(a2."B",0) as b,<br>COALESCE(a3."C",0) as c,COALESCE(a4."D",0) as d from <br>(select distinct id as id from (select id from a1 union <br>select id from a2 union select id from a3 <br>union select id from a4)as a6) as a5 left join a1 on a5.id = a1.id left join a2 on a5.id = a2.id left join a3 on a5.id = a3.id <br>left join a4 on a5.id = a4.id </p>
<img src ="http://www.blogjava.net/zhaochengming/aggbug/136484.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaochengming/" target="_blank">helloworld2008</a> 2007-08-13 18:59 <a href="http://www.blogjava.net/zhaochengming/archive/2007/08/13/136484.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pl/pgsql</title><link>http://www.blogjava.net/zhaochengming/archive/2007/08/13/136483.html</link><dc:creator>helloworld2008</dc:creator><author>helloworld2008</author><pubDate>Mon, 13 Aug 2007 10:59:00 GMT</pubDate><guid>http://www.blogjava.net/zhaochengming/archive/2007/08/13/136483.html</guid><wfw:comment>http://www.blogjava.net/zhaochengming/comments/136483.html</wfw:comment><comments>http://www.blogjava.net/zhaochengming/archive/2007/08/13/136483.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaochengming/comments/commentRss/136483.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaochengming/services/trackbacks/136483.html</trackback:ping><description><![CDATA[<p><a href="http://man.chinaunix.net/database/postgresql_8.0_CN/plpgsql-declarations.html" _fcksavedurl="http://man.chinaunix.net/database/postgresql_8.0_CN/plpgsql-declarations.html">http://man.chinaunix.net/database/postgresql_8.0_CN/plpgsql-declarations.html</a><br>创建plpgsql语言<br>create language plpgsql;</p>
<p><strong><font size=3>例子一</font></strong></p>
<p>CREATE OR REPLACE FUNCTION instr(character varying, integer)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RETURNS integer AS<br>$BODY$<br>declare <br>str alias for $1;<br>ind alias for $2;<br>begin<br>return ind+100;<br>end;<br>$BODY$<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LANGUAGE 'plpgsql' VOLATILE;<br>&gt; select instr('aaa',100) ;<br>&gt; 200<br><br><strong><font size=3>例子二</font></strong><br>如果一个 <span class=APPLICATION>PL/pgSQL</span> 函数的返回类型声明为一个多态类型 （<tt class=TYPE><font face=新宋体>anyelement</font></tt> 或者 <tt class=TYPE><font face=新宋体>anyarray</font></tt>），那么就会创建一个特殊的参数， <tt class=LITERAL><font face=新宋体>$0</font></tt>。它的数据类型是函数的实际返回类型，和从实际输入类型推导推导类型一样 （参阅 <a href="http://man.chinaunix.net/database/postgresql_8.0_CN/extend-type-system.html#EXTEND-TYPES-POLYMORPHIC" _fcksavedurl="http://man.chinaunix.net/database/postgresql_8.0_CN/extend-type-system.html#EXTEND-TYPES-POLYMORPHIC"><font color=#800080>Section 31.2.5</font></a>）。 这样就允许函数访问它的实际返回类型，像 <a href="http://man.chinaunix.net/database/postgresql_8.0_CN/plpgsql-declarations.html#PLPGSQL-DECLARATION-TYPE" _fcksavedurl="http://man.chinaunix.net/database/postgresql_8.0_CN/plpgsql-declarations.html#PLPGSQL-DECLARATION-TYPE"><font color=#800080>Section 35.4.2</font></a> 里显示的那样。 <tt class=LITERAL><font face=新宋体>$0</font></tt> 初始化为空，并且可以被函数修改，所以，如果需要，它可以用于保存返回值， 虽然这并非必须的。<tt class=LITERAL><font face=新宋体>$0</font></tt> 还可以给予一个别名。比如，这个函数可以在任何有 <tt class=LITERAL><font face=新宋体>+</font></tt> 操作符的数据类型上运转： <br>create or replace function addT (v1 anyelement, v2 anyelement, v3 anyelement)<br>returns anyelement as $$<br>declare <br>res alias for $0;<br>begin <br>res := v1+v2+v3;<br>return res;<br>end;<br>$$language plpgsql;<br>&gt; select addT(100,200,300)<br>&gt; 600<br><br><strong><font size=3>例子三</font></strong><br><tt class=REPLACEABLE><em>variable</em></tt>%TYPE</p>
<p><tt class=LITERAL><font face=新宋体>%TYPE</font></tt> 提供一个变量或者表字段的数据类型。 你可以用这个声明将要保存数据库数值的变量。比如，假如你在 <tt class=LITERAL><font face=新宋体>users</font></tt> 表里面有一个字段叫 <tt class=LITERAL><font face=新宋体>user_id</font></tt>。要声明一个和 <tt class=LITERAL><font face=新宋体>users.user_id</font></tt> 类型相同的变量，你可以写： </p>
<pre class=PROGRAMLISTING>user_id users.user_id%TYPE;</pre>
<p>&#160;</p>
<p>通过使用 <tt class=LITERAL><font face=新宋体>%TYPE</font></tt>，你必须知道你引用的结构的数据类型， 并且，最重要的是，如果被引用项的数据类型在将来变化了（比如：你把 <tt class=LITERAL><font face=新宋体>user_id</font></tt> 的类型从 <tt class=TYPE><font face=新宋体>integer</font></tt> 改成 <tt class=TYPE><font face=新宋体>real</font></tt>），你也不需要修改你的函数定义。 </p>
<p><tt class=LITERAL><font face=新宋体>%TYPE</font></tt> 对多态的函数特别有用，因为内部变量的数据类型可能在不同调用中是不一样的。 我们可以通过给函数的参数或者结果占位符附加 <tt class=LITERAL><font face=新宋体>%TYPE</font></tt> 的方法来创建合适的变量。</p>
<p><strong><font size=3>例子四</font></strong><br><br>行类型<br><tt class=REPLACEABLE><em>name</em></tt> <tt class=REPLACEABLE><em>table_name</em></tt><tt class=LITERAL>%ROWTYPE</tt>;<br><tt class=REPLACEABLE><em>name</em></tt> <tt class=REPLACEABLE><em>composite_type_name</em></tt>;</p>
<p>&#160;</p>
<p>一个复合类型变量叫做<em class=FIRSTTERM>行</em>变量（或者<em class=FIRSTTERM>row-type</em>变量）。 这样的一个变量可以保存一次<tt class=COMMAND><font face=新宋体>SELECT</font></tt>或者 <tt class=COMMAND><font face=新宋体>FOR</font></tt>命令结果的完整一行，只要命令的字段集匹配该变量声明的类型。 行数值的独立的字段是使用常用的点表示法访问的，比如 <tt class=LITERAL><font face=新宋体>rowvar.field</font></tt>。 </p>
<p>一个行变量可以声明为和一个现有的表或者视图的行类型相同，方法是使用 <font face=新宋体><tt class=REPLACEABLE><em>table_name</em></tt><tt class=LITERAL>%ROWTYPE</tt></font> 表示法； 或者你也可以声明它的类型是一个复合类型的名字。（因为每个表都有一个相关联的同名数据类型， 在 <span class=PRODUCTNAME>PostgreSQL</span> 里实在是无所谓你写不写 <tt class=LITERAL><font face=新宋体>%ROWTYPE</font></tt>。但是有 <tt class=LITERAL><font face=新宋体>%ROWTYPE</font></tt> 的形式移植性更好。） </p>
<p>函数的参数可以是复合类型（表的完整行）。这个时候， 对应的标识符 $n 将是一个行变量，并且可以从中选取字段，比如 <tt class=LITERAL><font face=新宋体>$1.user_id</font></tt>。 </p>
<p>在一个行类型的变量中，只可以访问用户定义的表中行的属性， 不包括 OID 或者其他系统属性（因为该行可能来自一个视图）。 该行类型的数据域继承表中象 <tt class=TYPE><font face=新宋体>char(<tt class=REPLACEABLE><em>n</em></tt>)</font></tt> 这种类型字段的尺寸和精度。 </p>
<p>这里是一个使用复合类型的例子：<br>CREATE TABLE tbl_store1<br>(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; store_no integer NOT NULL DEFAULT nextval('tbl_store1_sq'::regclass),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent_id integer,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "type" integer,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "values" real,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CONSTRAINT tbl_store1_pkey PRIMARY KEY (store_no)<br>) <br>插入植 1 1 1 1;<br><br>CREATE OR REPLACE FUNCTION merge(t_row tbl_store1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RETURNS text AS<br>$BODY$<br>declare <br>t2_row tbl_store1%rowtype;<br>begin<br>select * into t2_row from tbl_store1 ;<br>return t_row.values || t2_row.values;<br>end;<br>$BODY$<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LANGUAGE 'plpgsql' VOLATILE;<br>&gt; select merge(t.*) from tbl_store1 t ;<br>&gt; 11</p>
<p><strong><font size=3>例子五</font></strong><br>/**<br>create or replace function logfun1(log text) returns timestamp as $$<br>begin<br>insert into tbl_store1 values(3,1,1,1,'now');<br>return 'now';<br>end;<br>$$ language plpgsql;<br>select logfun1('test');<br>**/<br>create or replace function logfun2(log text) returns timestamp as $$<br>declare <br>ctime timestamp;<br>begin<br>ctime :='now';<br>insert into tbl_store1 values(6,2,1,1,ctime);<br>return ctime;<br>end;<br>$$ language plpgsql;<br>select logfun2('aaa');<br></p>
<p>在 <tt class=FUNCTION><font face=新宋体>logfunc1()</font></tt> 的实例里， <span class=PRODUCTNAME>PostgreSQL</span> 的主分析器在为 <tt class=COMMAND><font face=新宋体>INSERT</font></tt> 准备执行计划的时候知道字串 <tt class=LITERAL><font face=新宋体>'now'</font></tt> 应该解释成 <tt class=TYPE><font face=新宋体>timestamp</font></tt> 类型，因为 <tt class=CLASSNAME><font face=新宋体>logtable</font></tt> 的目标字段就是该类型。所以，它会在这个时候从这个字串中计算一个常量， 然后在该服务器的整个生存期中的所有 <tt class=FUNCTION><font face=新宋体>logfunc1</font></tt> 调用中使用这个常量。不消说，这可不是程序员想要的。 </p>
<p>在<tt class=FUNCTION><font face=新宋体>logfunc2</font></tt>里， <span class=PRODUCTNAME>PostgreSQL</span> 的主分析器并不知道 <tt class=LITERAL><font face=新宋体>now</font></tt> 应该转换成什么类型， 因此它返回一个包含字符串 <tt class=LITERAL><font face=新宋体>now</font></tt> 的类型为 <tt class=TYPE><font face=新宋体>text</font></tt> 的数据值。 在随后给局部变量<tt class=VARNAME><font face=新宋体>curtime</font></tt>赋值时， <span class=APPLICATION>PL/pgSQL</span>解释器通过调用 <tt class=FUNCTION><font face=新宋体>text_out</font></tt>和<tt class=FUNCTION><font face=新宋体>timestamp_in</font></tt> 把这个字符串转换成 <tt class=TYPE><font face=新宋体>timestamp</font></tt> 类型的变量。 因此，计算出的时戳就会按照程序员希望的那样在每次执行的时候都更新。 </p>
<p>记录变量的易变性天性在这种结合上提出了一个问题。 在一个记录变量在语句或者表达式中使用时， 该字段的数据类型在同一个表达式的不同调用期间不能修改， 因为该表达式准备使用的是运行第一次到达该表达式时出现的数据类型。 在写处理超过一个表的事件的触发器过程的时候一定要把这个记住。（必要时可以用<tt class=COMMAND><font face=新宋体>EXECUTE</font></tt>绕开这个问题。） </p>
<p><strong><font size=3>例子六</font></strong><br>create or replace function tSInto () returns varchar as <br>$$<br>declare rec record;<br>begin<br>select into rec * from tbl_store1 where values =1;<br>if not found then <br>return 'test';<br>else<br>return 'tttt';<br>end if;<br>end;<br>$$<br>language plpgsql;<br>select tSInto();</p>
<p>create or replace function tSInto () returns varchar as <br>$$<br>declare rec record;<br>begin<br>select into rec * from tbl_store1 where values =1;<br>if rec.values isNULL then<br>return 'okkkkkkk';<br>else return 'test';<br>end if ;<br>end;<br>$$<br>language plpgsql;<br>select tSInto();<br>例子七<br>create or replace function cur1 () returns text as<br>$$<br>declare <br>curs1 CURSOR for select * from tbl_store1;<br>res text :='';<br>a varchar;<br>b varchar;<br>c varchar;<br>d varchar;<br>e varchar;<br>begin<br>OPEN curs1;<br>loop<br>fetch curs1 into a,b,c,d,e;<br>if not found then <br>return 'error';<br>exit;<br>end if;<br>res = 'test'||res;<br>end loop;<br>close curs1;<br>return res;<br>end;<br>$$<br>language plpgsql;</p>
<p>CREATE OR REPLACE FUNCTION cur1()<br>&nbsp;&nbsp;&nbsp; RETURNS text AS<br>$BODY$<br>declare <br>curs1 CURSOR for select * from tbl_store1;<br>res text :='';<br>a varchar;<br>b varchar;<br>c varchar;<br>d varchar;<br>e varchar;<br>begin<br>OPEN curs1;<br>loop<br>fetch curs1 into a,b,c,d,e;<br>if (found) then<br>if (a is null) then<br>&nbsp;&nbsp;&nbsp; a = '';<br>end if ;<br>if (b is null) then<br>&nbsp;&nbsp;&nbsp; b = '';<br>end if ;<br>if (c is null) then<br>&nbsp;&nbsp;&nbsp; c = '';<br>end if ;<br>if (d is null) then<br>&nbsp;&nbsp;&nbsp; d = '';<br>end if ;<br>if (e is null) then<br>&nbsp;&nbsp;&nbsp; e = '';<br>end if ;<br>&nbsp;&nbsp;&nbsp; res = res || a || b || c || d || e;<br>else <br>exit;<br>end if;<br>end loop;<br>close curs1;<br>return res;<br>end;<br>$BODY$<br>&nbsp;&nbsp;&nbsp; LANGUAGE 'plpgsql' VOLATILE;<br>select cur1();</p>
<img src ="http://www.blogjava.net/zhaochengming/aggbug/136483.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaochengming/" target="_blank">helloworld2008</a> 2007-08-13 18:59 <a href="http://www.blogjava.net/zhaochengming/archive/2007/08/13/136483.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>