<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>小熊 &#187; Oracle</title>
	<atom:link href="http://ringtail.xmulib.org/tag/oracle/feed/" rel="self" type="application/rss+xml" />
	<link>http://ringtail.xmulib.org</link>
	<description>爱睡懒觉的小熊</description>
	<lastBuildDate>Sun, 04 Jul 2010 03:00:00 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Zend Framework中对oracle数据库操作总结</title>
		<link>http://ringtail.xmulib.org/2007/12/18/zend-framework%e4%b8%ad%e5%af%b9oracle%e6%95%b0%e6%8d%ae%e5%ba%93%e6%93%8d%e4%bd%9c%e6%80%bb%e7%bb%93/</link>
		<comments>http://ringtail.xmulib.org/2007/12/18/zend-framework%e4%b8%ad%e5%af%b9oracle%e6%95%b0%e6%8d%ae%e5%ba%93%e6%93%8d%e4%bd%9c%e6%80%bb%e7%bb%93/#comments</comments>
		<pubDate>Tue, 18 Dec 2007 01:47:37 +0000</pubDate>
		<dc:creator>ringtail</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[zendframework]]></category>

		<guid isPermaLink="false">http://ringtail.xmulib.org/2007/12/18/zend-framework%e4%b8%ad%e5%af%b9oracle%e6%95%b0%e6%8d%ae%e5%ba%93%e6%93%8d%e4%bd%9c%e6%80%bb%e7%bb%93/</guid>
		<description><![CDATA[ZF中对Oracle的简单操作总结，仅结合自身经验
]]></description>
			<content:encoded><![CDATA[<p>说明： 摘自<a href="http://www.phpeye.com/zf/zend.db.html"><b>ZF手册中文版</b> </a><br />1.执行查询并返回结果<br /><a href="#next">跳过废话</a><br />1.1 使用 <code>Zend_Db_Adapter</code><br />&nbsp;一旦你得到了一个<code>Zend_Db_Adapter</code> 实例, 你可以直接<br />
执行sql语句进行查询.  <code>Zend_Db_Adapter</code> 传送这些sql语<br />
句到底层的PDO对象，由PDO对象组合并执行他们，在有查询结果的情况<br />
下，返回一个PDOStatement对象以便对结果进行处理。<br /><code></code></p>
<pre>&lt;?php

// 创建一个$db对象,然后查询数据库// 使用完整的sql语句直接进行查询.$sql = $db-&gt;quoteInto(    'SELECT * FROM example WHERE date &gt; ?',    '2006-01-01');$result = $db-&gt;query($sql);

// 使用PDOStatement对象$result将所有结果数据放到一个数组中$rows = $result-&gt;fetchAll();

?&gt;</pre>
<p>或者使用fetch开头系列方法获得结果集：
<p>对于每一种 <code>fetch系列 </code>的方法来说，你需<br />
要传送一个select的sql语句；假如你在操作语句中使用指定的占位符，你也可以<br />
传送一个绑定数据的数组对你的操作语句进行处理和替换。 <code>Fetch系列 </code><br />
的方法包括：
</p>
<div class="itemizedlist">
<ul type="disc">
<li>
<p><code>fetchAll()</code></p>
</li>
<li>
<p><code>fetchAssoc()</code></p>
</li>
<li>
<p><code>fetchCol()</code></p>
</li>
<li>
<p><code>fetchOne()</code></p>
</li>
<li>
<p><code>fetchPairs()</code></p>
</li>
<li>
<p><code>fetchRow()</code></p>
</li>
</ul>
<p>
<pre>&lt;?php

// 创建一个 $db对象, 然后...

// 取回结果集中所有字段的值,作为连续数组返回$result = $db-&gt;fetchAll(    "SELECT * FROM round_table WHERE noble_title = :title",    array('title' =&gt; 'Sir'));

// 取回结果集中所有字段的值,作为关联数组返回// 第一个字段作为码$result = $db-&gt;fetchAssoc(    "SELECT * FROM round_table WHERE noble_title = :title",    array('title' =&gt; 'Sir'));

// 取回所有结果行的第一个字段名$result = $db-&gt;fetchCol(    "SELECT first_name FROM round_table WHERE noble_title = :title",    array('title' =&gt; 'Sir'));

// 只取回第一个字段值$result = $db-&gt;fetchOne(    "SELECT COUNT(*) FROM round_table WHERE noble_title = :title",    array('title' =&gt; 'Sir'));

// 取回一个相关数组,第一个字段值为码// 第二个字段为值$result = $db-&gt;fetchPairs(    "SELECT first_name, favorite_color FROM round_table WHERE noble_title = :title",    array('title' =&gt; 'Sir'));

// 只取回结果集的第一行$result = $db-&gt;fetchRow(    "SELECT * FROM round_table WHERE first_name = :name",    array('name' =&gt; 'Lancelot'));

?&gt;</pre>
</div>
<p>1.2 使用Zend_Db_Select方法
<p>
使用Zend_Db_Select方法是一种不受数据库约束构建select的sql语句的工具<br />
（ares注：用户可以使用该方法生成查询的sql语句，而不需要考虑各种数据<br />
库sql语句的差别）。虽然该方法明显还不完善，但是的确为我们提供一种方<br />
法，帮助我们在不同的后台数据库进行相同的查询工作。除此之外，它还可<br />
以避免sql语句攻击。
</p>
<p>
创建一个zend_db_select实例最简单的方法就是使用zend_db_adapter::select()方法 </p>
<p></p>
<pre>&lt;? php

//在model中取得连接，并进行相应数据库操作

$this-&gt;db = Zend_Registry::get('db');&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 

$select = $this-&gt;db-&gt;select(); $select-&gt;from('link_info', 'link_info.*') &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; -&gt;join('link_tag_collect', 'link_info.linkid=link_tag_collect.linkid') &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; -&gt;where('user_friend.userid=?',$userid)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt;distinct(link_info.linkid)&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; -&gt;order('link_tag_collect.addtime DESC') &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; -2007-12-18&gt;limit(10,0); $sql = $select-&gt;__toString(); &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;  $result = $this-&gt;db-&gt;fetchALL($sql); 

?&gt;</pre>
<p>1.3 使用 Zend_Db_Table<br />Zend_Db_Table 是Zend Framework的表模块.它通过zend_db_adapter连接到数据库,为数据库模式检查表对象,<br />并对该表进行操作和查询.
<pre>&lt;?phpclass RoundTable extends Zend_Db_Table {}

$table = new RoundTable();$db = $table-&gt;getAdapter();

// SELECT * FROM round_table//     WHERE noble_title = "Sir"//     ORDER BY first_name//     LIMIT 10 OFFSET 20

$where = $db-&gt;quoteInto('noble_title = ?', 'Sir');$order = 'first_name';$count = 10;$offset = 20;

$rowset = $table-&gt;fetchAll($where, $order, $count, $offset);?&gt;</pre>
<p>以上都为废话，从ZF手册中皆能得到。
<div id="next">在实际中，我最常使用的是</div>
<p>
<ul>
<li>从model中获得数据库连接，然后使用ZEND_DB_SELECT。</li>
</ul>
<p>在tag.php中
<pre>&lt;?php&nbsp;public function getTopTag(){&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $select = $this-&gt;db-&gt;select();&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $select-&gt;from($this-&gt;_name, '*')&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; -&gt;order('TAGTOTAL DESC')&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; -&gt;limit(10,0);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $sql = $select-&gt;__toString();&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $result = $this-&gt;db-&gt;fetchALL($sql);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return $result;&nbsp;&nbsp;&nbsp; }?&gt;</pre>
<p>在TagController.php中
<pre>&lt;?phpclass TagController extends Zend_Controller_Action	private $tag;	function init() {		parent::init();		Zend_Loader::loadClass('Tag');				$this-&gt;tag = new Tag();			}	function topAction(){		$thi-&gt;tag-&gt;getTopTag();		...	}?&gt;</pre>
<p>
<ul>
<li>使用ZEND_DB_TABLE</li>
</ul>
<p>在Tag.php中</p>
<pre>&lt;?phpclass Tag extends Zend_Db_Table{    protected $_name = "TAG_INFO";    protected $_primary = 'TAGID';}?&gt;在TagController.php中&lt;?phpclass TagController extends Zend_Controller_Action	private $tag;	function init() {		parent::init();		Zend_Loader::loadClass('Tag');				$this-&gt;tag = new Tag();			}	function topAction(){		$order = 'TAGTOTAL';			$count = 10;		$offset = 0;&nbsp;		$thi-&gt;tag-&gt;fetchAll( $order, $count, $offset);		...	}?&gt;</pre>
<p>最好还是选用方法一，能够将对数据的操作都封装在model中。<br />2.插入数据<br />无论是DB还是Table类，都使用insert()方法。<br />对于Oracle来说，如果要使用sequence作为自增的主键的话，需要使用trigger。<br />比如，有tag表，主键为tagid，其对应的sequence为tag_seq,要插入数据时，需要先新建trigger：</p>
<p>create or replace trigger tag_tri<br />before insert on tag<br />for each row<br />declare<br />nextid number;<br />begin<br />IF :new.tagid IS NULL or :new.tagid=0 THEN<br />select tag_seq.nextval<br />into nextid<br />from sys.dual;<br />:new.tagid:=nextid;<br />end if;<br />end tag_tri;</p>
<p>其余部分和插入其它数据库相同
<pre>&lt;?php$table_name='TAG';$row = array (		'TAGNAME'   =&gt; $tagname,		'TAGTOTAL'  =&gt; '1'	);$this-&gt;db-&gt;insert($table_name,$row);?&gt;</pre>
<p>3.更新数据<br />3.1直接执行update语句，参见文档。<br />3.2如果update语句中，有包含数据库的特殊关键字时，需要先将数据选出，然后再更新
<pre>&lt;?php	$where = $this-&gt;db-&gt;quoteInto('tagname = ?',$tagname);	$rowset = $this-&gt;tag-&gt;fetchAll($where);	$count=$rowset-&gt;count();	$tag = $rowset-&gt;current();						if($count!=0){		$tagid=$tag-&gt;TAGID;		//tagtotal+1

		$tag-&gt;TAGTOTAL ++;  //应判断一下当前用户是否		$tag-&gt;save();		}?&gt;</pre>
<p>4.删除数据
<pre>&lt;?php	//删除已有的collect表中记录	// where条件语句	$where = $this-&gt;db-&gt;quoteInto('USERID = ?', $userid)		.$this-&gt;db-&gt;quoteInto('AND LINKID = ?', $linkid);

	// 删除数据并得到影响的行数	$rows_affected =  $this-&gt;collect-&gt;delete($where);?&gt;</pre>
<p>总结完毕：<br />tips：<br />注意表名、字段名等的大小写！</p>
]]></content:encoded>
			<wfw:commentRss>http://ringtail.xmulib.org/2007/12/18/zend-framework%e4%b8%ad%e5%af%b9oracle%e6%95%b0%e6%8d%ae%e5%ba%93%e6%93%8d%e4%bd%9c%e6%80%bb%e7%bb%93/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
