﻿<?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-无所惧，无所悔,为梦想执着的拼搏-文章分类-Oracle 技术文档</title><link>http://www.blogjava.net/DreamFight/category/37916.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 26 Feb 2009 08:15:49 GMT</lastBuildDate><pubDate>Thu, 26 Feb 2009 08:15:49 GMT</pubDate><ttl>60</ttl><item><title>Oracle自定义函数</title><link>http://www.blogjava.net/DreamFight/articles/256818.html</link><dc:creator>DreamFight</dc:creator><author>DreamFight</author><pubDate>Thu, 26 Feb 2009 06:57:00 GMT</pubDate><guid>http://www.blogjava.net/DreamFight/articles/256818.html</guid><wfw:comment>http://www.blogjava.net/DreamFight/comments/256818.html</wfw:comment><comments>http://www.blogjava.net/DreamFight/articles/256818.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/DreamFight/comments/commentRss/256818.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/DreamFight/services/trackbacks/256818.html</trackback:ping><description><![CDATA[<ol class="dp-sql">
    <li><span><span class="comment">--没有参数的函数 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">create</span><span>&nbsp;</span><span class="op">or</span><span>&nbsp;</span><span class="func">replace</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;get_user&nbsp;</span><span class="keyword">return</span><span>&nbsp;varchar2&nbsp;</span><span class="keyword">is</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;v_user&nbsp;varchar2(50); &nbsp;&nbsp;</span></li>
    <li><span class="keyword">begin</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span><span class="keyword">select</span><span>&nbsp;username&nbsp;</span><span class="keyword">into</span><span>&nbsp;v_user&nbsp;</span><span class="keyword">from</span><span>&nbsp;user_users; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;v_user; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">end</span><span>&nbsp;get_user; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="comment">--测试 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>方法一 &nbsp;&nbsp;</span></li>
    <li><span class="keyword">select</span><span>&nbsp;get_user&nbsp;</span><span class="keyword">from</span><span>&nbsp;dual; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>方法二 &nbsp;&nbsp;</span></li>
    <li><span>SQL&gt;&nbsp;var&nbsp;v_name&nbsp;varchar2(50) &nbsp;&nbsp;</span></li>
    <li><span>SQL&gt;&nbsp;</span><span class="keyword">exec</span><span>&nbsp;:v_name:=get_user; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>PL/SQL&nbsp;过程已成功完成。 &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>SQL&gt;&nbsp;print&nbsp;v_name &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>V_NAME &nbsp;&nbsp;</span></li>
    <li><span class="comment">------------------------------ </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>TEST &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>方法三 &nbsp;&nbsp;</span></li>
    <li><span>SQL&gt;&nbsp;</span><span class="keyword">exec</span><span>&nbsp;dbms_output.put_line(</span><span class="string">'当前数据库用户是：'</span><span>||get_user); &nbsp;&nbsp;</span></span></li>
    <li><span>当前数据库用户是：TEST &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>PL/SQL&nbsp;过程已成功完成。&nbsp;&nbsp;</span></li>
</ol>
<pre class="sql" style="display: none" name="code">--没有参数的函数
create or replace function get_user return varchar2 is
v_user varchar2(50);
begin
select username into v_user from user_users;
return v_user;
end get_user;
--测试
方法一
select get_user from dual;
方法二
SQL&gt; var v_name varchar2(50)
SQL&gt; exec :v_name:=get_user;
PL/SQL 过程已成功完成。
SQL&gt; print v_name
V_NAME
------------------------------
TEST
方法三
SQL&gt; exec dbms_output.put_line('当前数据库用户是：'||get_user);
当前数据库用户是：TEST
PL/SQL 过程已成功完成。
</pre>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Sql代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://junmail.javaeye.com/blog/256455#"><img alt="复制代码" src="http://junmail.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-sql">
    <li><span><span class="comment">--带有IN参数的函数 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">create</span><span>&nbsp;</span><span class="op">or</span><span>&nbsp;</span><span class="func">replace</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;get_empname(v_id&nbsp;</span><span class="op">in</span><span>&nbsp;number)&nbsp;</span><span class="keyword">return</span><span>&nbsp;varchar2&nbsp;</span><span class="keyword">as</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;v_name&nbsp;varchar2(50); &nbsp;&nbsp;</span></li>
    <li><span class="keyword">begin</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span><span class="keyword">select</span><span>&nbsp;</span><span class="keyword">name</span><span>&nbsp;</span><span class="keyword">into</span><span>&nbsp;v_name&nbsp;</span><span class="keyword">from</span><span>&nbsp;employee&nbsp;</span><span class="keyword">where</span><span>&nbsp;id&nbsp;=&nbsp;v_id; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;v_name; &nbsp;&nbsp;</span></span></li>
    <li><span>exception &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span><span class="keyword">when</span><span>&nbsp;no_data_found&nbsp;</span><span class="keyword">then</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;raise_application_error(-20001,&nbsp;</span><span class="string">'你输入的ID无效！'</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">end</span><span>&nbsp;get_empname;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre class="sql" style="display: none" name="code">--带有IN参数的函数
create or replace function get_empname(v_id in number) return varchar2 as
v_name varchar2(50);
begin
select name into v_name from employee where id = v_id;
return v_name;
exception
when no_data_found then
raise_application_error(-20001, '你输入的ID无效！');
end get_empname;
</pre>
<p>&nbsp;</p>
<p>附：</p>
<p><span style="color: #ff0000">函数调用限制</span><br />
1、SQL语句中只能调用存储函数(服务器端),而不能调用客户端的函数<br />
2、SQL只能调用带有输入参数,不能带有输出,输入输出函数<br />
3、SQL不能使用PL/SQL的特有数据类型(boolean,table,record等)<br />
4、SQL语句中调用的函数不能包含INSERT,UPDATE和DELETE语句</p>
<p>&nbsp;</p>
<p><span style="color: #ff0000">查看函数院源代码</span><br />
<span class="hilite1">oracle</span>会将函数名及其源代码信息存放到数据字典中user_source <br />
select text from user_source where name='GET_EMPNAME';</p>
<p><br />
<span style="color: #ff0000">删除函数<br />
</span>drop function get_empname</p>
<img src ="http://www.blogjava.net/DreamFight/aggbug/256818.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/DreamFight/" target="_blank">DreamFight</a> 2009-02-26 14:57 <a href="http://www.blogjava.net/DreamFight/articles/256818.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>