﻿<?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-程序人生</title><link>http://www.blogjava.net/zhaonp/</link><description>记录编程中的点点滴滴</description><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 06:05:22 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 06:05:22 GMT</pubDate><ttl>60</ttl><item><title>JAVA公式解析示例</title><link>http://www.blogjava.net/zhaonp/archive/2014/04/02/411856.html</link><dc:creator>zhaonp</dc:creator><author>zhaonp</author><pubDate>Wed, 02 Apr 2014 09:07:00 GMT</pubDate><guid>http://www.blogjava.net/zhaonp/archive/2014/04/02/411856.html</guid><wfw:comment>http://www.blogjava.net/zhaonp/comments/411856.html</wfw:comment><comments>http://www.blogjava.net/zhaonp/archive/2014/04/02/411856.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaonp/comments/commentRss/411856.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaonp/services/trackbacks/411856.html</trackback:ping><description><![CDATA[<div>// 数值型<br />Expression exp = new Expression("(x + y)/2");<br />Map&lt;String, BigDecimal&gt; variables = new HashMap&lt;String, BigDecimal&gt;();<br />variables.put("x", new BigDecimal("4.32"));<br />variables.put("y", new BigDecimal("342.1"));<br />BigDecimal result = exp.eval(variables);<br />System.out.println(result);<br />// 布尔型<br />Expression ww = new Expression("( A &amp;&amp; B ) || C ");<br />Map&lt;String, BigDecimal&gt; vs = new HashMap&lt;String, BigDecimal&gt;();<br />vs.put("A", new BigDecimal("0"));<br />vs.put("B", new BigDecimal("1"));<br />vs.put("C", new BigDecimal("1"));<br />System.out.println(ww.eval(vs));<br />// 布尔型 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />Expression dd = new Expression(" A &gt; 200 ");<br />Map&lt;String, BigDecimal&gt; as = new HashMap&lt;String, BigDecimal&gt;();<br />as.put("A", new BigDecimal("12000"));<br />System.out.println(dd.eval(as));</div><br />需要eval.jar<br /><img src ="http://www.blogjava.net/zhaonp/aggbug/411856.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaonp/" target="_blank">zhaonp</a> 2014-04-02 17:07 <a href="http://www.blogjava.net/zhaonp/archive/2014/04/02/411856.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle的基于MODEL 子句的行级查询</title><link>http://www.blogjava.net/zhaonp/archive/2011/01/01/342114.html</link><dc:creator>zhaonp</dc:creator><author>zhaonp</author><pubDate>Sat, 01 Jan 2011 04:50:00 GMT</pubDate><guid>http://www.blogjava.net/zhaonp/archive/2011/01/01/342114.html</guid><wfw:comment>http://www.blogjava.net/zhaonp/comments/342114.html</wfw:comment><comments>http://www.blogjava.net/zhaonp/archive/2011/01/01/342114.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaonp/comments/commentRss/342114.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaonp/services/trackbacks/342114.html</trackback:ping><description><![CDATA[操作环境 <br />
<br />
服务端Oracle 11g<br />
<br />
客户端Oracle 10g<br />
<br />
--准备脚本<br />
<br />
DROP TABLE EMPLOYEE_SALARY_T;<br />
CREATE TABLE EMPLOYEE_SALARY_T(<br />
EMPLOYEE_ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(20),<br />
EMPLOYEE_NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(20),<br />
DEPARTMENT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(10),<br />
COMPANY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(10),<br />
SALARY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER(6),<br />
SALARY_YEAR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(10)<br />
);<br />
<br />
INSERT INTO EMPLOYEE_SALARY_T VALUES('001','znp','dep001','VisSoft',30000,'2005');<br />
INSERT INTO EMPLOYEE_SALARY_T VALUES('001','znp','dep001','VisSoft',40000,'2006');<br />
INSERT INTO EMPLOYEE_SALARY_T VALUES('001','znp','dep001','VisSoft',50000,'2007');<br />
INSERT INTO EMPLOYEE_SALARY_T VALUES('001','znp','dep001','VisSoft',60000,'2008');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
INSERT INTO EMPLOYEE_SALARY_T VALUES('002','zsj','dep001','AvsSoft',3000,'2005');<br />
INSERT INTO EMPLOYEE_SALARY_T VALUES('002','zsj','dep001','AvsSoft',4000,'2006');<br />
INSERT INTO EMPLOYEE_SALARY_T VALUES('002','zsj','dep001','AvsSoft',5000,'2007');<br />
INSERT INTO EMPLOYEE_SALARY_T VALUES('002','zsj','dep001','AvsSoft',6000,'2008');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
INSERT INTO EMPLOYEE_SALARY_T VALUES('003','ts1','dep002','VisSoft',30000,'2005');<br />
INSERT INTO EMPLOYEE_SALARY_T VALUES('003','ts1','dep002','VisSoft',40000,'2006');<br />
INSERT INTO EMPLOYEE_SALARY_T VALUES('003','ts1','dep002','VisSoft',50000,'2007');<br />
INSERT INTO EMPLOYEE_SALARY_T VALUES('003','ts1','dep002','VisSoft',60000,'2008');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
INSERT INTO EMPLOYEE_SALARY_T VALUES('004','ts2','dep002','AvsSoft',3000,'2005');<br />
INSERT INTO EMPLOYEE_SALARY_T VALUES('004','ts2','dep002','AvsSoft',4000,'2006');<br />
INSERT INTO EMPLOYEE_SALARY_T VALUES('004','ts2','dep002','AvsSoft',5000,'2007');<br />
INSERT INTO EMPLOYEE_SALARY_T VALUES('004','ts2','dep002','AvsSoft',6000,'2008');<br />
<br />
COMMIT;<br />
<br />
--行级查询实现脚本<br />
--查询含义为将09年dep001部门的salary预定为该部门05年、06年与08年的总和<br />
--而dep002部门09年的salary预定为该部门06年、07年与08年的总和<br />
<br />
SELECT COMPANY,DEPARTMENT,SALARYS FROM EMPLOYEE_SALARY_T<br />
MODEL <br />
&nbsp;&nbsp;&nbsp;&nbsp; RETURN UPDATED ROWS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --是否显示基本查询行,如果有该行则不显示基本查询行，只显示查询计算结果行<br />
&nbsp;&nbsp;&nbsp;&nbsp; PARTITION BY (COMPANY)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --分区，对行计算结果的分区，本例中以company列做为分区项<br />
&nbsp;&nbsp;&nbsp;&nbsp; DIMENSION BY (DEPARTMENT,SALARY_YEAR )&nbsp;&nbsp; --决定两个计算的维度，当前表示第一维度为部门，第二维度为薪资年度<br />
&nbsp;&nbsp;&nbsp;&nbsp; MEASURES (SALARY SALARYS)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --我的理解是规则指向列，即对哪一列进行规则计算或规则改变<br />
&nbsp;&nbsp;&nbsp;&nbsp; RULES (<br />
SALARYS['dep001', '2009'] = SALARYS['dep001', '2005'] + SALARYS['dep001', '2006']+ SALARYS['dep001', '2008'],<br />
SALARYS['dep002', '2009'] = SALARYS['dep002', '2006'] + SALARYS['dep002', '2007']+ SALARYS['dep002', '2008']<br />
);<br />
<br />
想想如果用列级查询时实现的效果（^_^ 是不是比较地不麻烦）<br />
<br />
PS:把COMPANY的值与DEPARTMENT的值调成同步，即DEPARTMENT为001时公司全部为AvsSoft,DEPARTMENT为002时公司全部为VisSoft。看看结果如何？<br />
<br />
元旦快乐<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/zhaonp/aggbug/342114.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaonp/" target="_blank">zhaonp</a> 2011-01-01 12:50 <a href="http://www.blogjava.net/zhaonp/archive/2011/01/01/342114.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于自治事务</title><link>http://www.blogjava.net/zhaonp/archive/2010/12/31/342055.html</link><dc:creator>zhaonp</dc:creator><author>zhaonp</author><pubDate>Fri, 31 Dec 2010 04:00:00 GMT</pubDate><guid>http://www.blogjava.net/zhaonp/archive/2010/12/31/342055.html</guid><wfw:comment>http://www.blogjava.net/zhaonp/comments/342055.html</wfw:comment><comments>http://www.blogjava.net/zhaonp/archive/2010/12/31/342055.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaonp/comments/commentRss/342055.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaonp/services/trackbacks/342055.html</trackback:ping><description><![CDATA[操作环境 oracle11g<br />
<br />
CREATE TABLE EMPLOYEE_T<br />
(<br />
EMPLOYEE_ID VARCHAR2(20),<br />
EMPLOYEE_NAME VARCHAR2(20)<br />
);<br />
<br />
在存储过程中，尤其是一组相互调用的存储过程中如果要为其中的每个存储过程记录执行日志时会存在比较麻烦的问题。即在操作出现异常时如何记录相关异常日志(这个时候的日志应该才是最重要的吧&gt;_&lt;!!!)，此时如果调用一般的事务方式进行commit以保存日志则脚本编写会相当烦琐且维护性差。此时可以考虑采用自治事务的方式来提交执行日志<br />
<br />
自治事务相当于与当前事务并行的另一个事务，其提交与否并不影响当前主要事务的提交与回滚，通常定义在函数与存储过程之中方式如下<br />
<br />
<p>CREATE OR REPLACE PROCEDURE SP_EMPLOYEE_AUTONOMOUS<br />
IS</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; PRAGMA AUTONOMOUS_TRANSACTION;<br />
<br />
BEGIN&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INSERT INTO EMPLOYEE_T(EMPLOYEE_ID,EMPLOYEE_NAME)VALUES('007','TS5');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INSERT INTO EMPLOYEE_T(EMPLOYEE_ID,EMPLOYEE_NAME)VALUES('008','TS6');<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMMIT;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp; <br />
END SP_EMPLOYEE_AUTONOMOUS;<br />
<br />
配合实现方式为<br />
<br />
</p>
<p>CREATE OR REPLACE PROCEDURE SP_EMPLOYEE<br />
IS</p>
<p>BEGIN</p>
<p>&nbsp;&nbsp;&nbsp; INSERT INTO EMPLOYEE_T(EMPLOYEE_ID,EMPLOYEE_NAME)VALUES('003','TS1');<br />
&nbsp;&nbsp;&nbsp; INSERT INTO EMPLOYEE_T(EMPLOYEE_ID,EMPLOYEE_NAME)VALUES('004','TS2');<br />
&nbsp;&nbsp;&nbsp; INSERT INTO EMPLOYEE_T(EMPLOYEE_ID,EMPLOYEE_NAME)VALUES('005','TS3');<br />
&nbsp;&nbsp;&nbsp; INSERT INTO EMPLOYEE_T(EMPLOYEE_ID,EMPLOYEE_NAME)VALUES('006','TS4');<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; SP_EMPLOYEE_AUTONOMOUS();<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; INSERT INTO EMPLOYEE_T(EMPLOYEE_ID,EMPLOYEE_NAME)VALUES('009','TS7');<br />
&nbsp;&nbsp;&nbsp; INSERT INTO EMPLOYEE_T(EMPLOYEE_ID,EMPLOYEE_NAME)VALUES('0010','TS8');<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; ROLLBACK;<br />
&nbsp; <br />
END SP_EMPLOYEE;<br />
<br />
则执行的结果则只插入007与008两条记录<br />
<br />
PS:一种错误的实现方式，如下<br />
</p>
<p>CREATE OR REPLACE PROCEDURE SP_EMPLOYEE_AUTONOMOUS<br />
IS</p>
<p><br />
BEGIN</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INSERT INTO EMPLOYEE_T(EMPLOYEE_ID,EMPLOYEE_NAME)VALUES('001','TS1');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INSERT INTO EMPLOYEE_T(EMPLOYEE_ID,EMPLOYEE_NAME)VALUES('002','TS2');</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PRAGMA AUTONOMOUS_TRANSACTION;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INSERT INTO EMPLOYEE_T(EMPLOYEE_ID,EMPLOYEE_NAME)VALUES('007','TS5');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INSERT INTO EMPLOYEE_T(EMPLOYEE_ID,EMPLOYEE_NAME)VALUES('008','TS6');<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMMIT;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INSERT INTO EMPLOYEE_T(EMPLOYEE_ID,EMPLOYEE_NAME)VALUES('003','TS7');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INSERT INTO EMPLOYEE_T(EMPLOYEE_ID,EMPLOYEE_NAME)VALUES('004','TS8');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ROLLBACK;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp; <br />
END SP_EMPLOYEE_AUTONOMOUS;</p>
<p><br />
此时编译与执行SP_EMPLOYEE_AUTONOMOUS且不报错，但是执行的结果就~~~~~~~~~~~~~~~~~&nbsp; ^_^<br />
<br />
</p>
<img src ="http://www.blogjava.net/zhaonp/aggbug/342055.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaonp/" target="_blank">zhaonp</a> 2010-12-31 12:00 <a href="http://www.blogjava.net/zhaonp/archive/2010/12/31/342055.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>动态SQL的几种常用形式</title><link>http://www.blogjava.net/zhaonp/archive/2010/12/31/342035.html</link><dc:creator>zhaonp</dc:creator><author>zhaonp</author><pubDate>Fri, 31 Dec 2010 01:51:00 GMT</pubDate><guid>http://www.blogjava.net/zhaonp/archive/2010/12/31/342035.html</guid><wfw:comment>http://www.blogjava.net/zhaonp/comments/342035.html</wfw:comment><comments>http://www.blogjava.net/zhaonp/archive/2010/12/31/342035.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaonp/comments/commentRss/342035.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaonp/services/trackbacks/342035.html</trackback:ping><description><![CDATA[执行环境 Oracle11g<br />
<br />
动态SQL是存储过程及函数中常用的实现查询操作手段，以下记录几种常用形式以供自查<br />
<br />
CREATE TABLE EMPLOYEE_T(<br />
EMPLOYEE_ID VARCHAR2(20) NOT NULL,<br />
EMPLOYEE_NAME VARCHAR2(20)<br />
);<br />
<br />
<p>1、直接执行动态SQL<br />
CREATE OR REPLACE PROCEDURE SP_DEAL<br />
IS</p>
<p>&nbsp; vs_sql&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(4000);</p>
<p>BEGIN</p>
<p>&nbsp;&nbsp;&nbsp; vs_sql := 'UPDATE EMPLOYEE_T SET EMPLOYEE_NAME='||CHR(39)||'zsj'||CHR(39)||' WHERE EMPLOYEE_ID = 001';<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; EXECUTE IMMEDIATE vs_sql;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; COMMIT;<br />
&nbsp;&nbsp;&nbsp; <br />
EXCEPTION </p>
<p>&nbsp;&nbsp;&nbsp; WHEN OTHERS THEN<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ROLLBACK;</p>
<p>end SP_DEAL;</p>
<p>2、执行有输出结果的动态SQL<br />
CREATE OR REPLACE PROCEDURE SP_DEAL_OUT<br />
IS</p>
<p>&nbsp; vn_num&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER(2);<br />
&nbsp; vs_sql&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(4000);</p>
<p>BEGIN</p>
<p>&nbsp;&nbsp;&nbsp; vs_sql := 'SELECT COUNT(EMPLOYEE_ID) FROM EMPLOYEE_T';<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; EXECUTE IMMEDIATE vs_sql INTO&nbsp; vn_num;<br />
&nbsp;&nbsp;&nbsp; <br />
EXCEPTION </p>
<p>&nbsp;&nbsp;&nbsp; WHEN OTHERS THEN<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ROLLBACK;</p>
<p>end SP_DEAL_OUT;</p>
<p>3、执行有输入参数与输出结果的动态SQL&nbsp; --select时使用<br />
CREATE OR REPLACE PROCEDURE SP_DEAL_IN_OUT<br />
IS</p>
<p>&nbsp; vn_num&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER(2);<br />
&nbsp; vs_sql&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(4000);<br />
&nbsp; vs_employee_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EMPLOYEE_T.EMPLOYEE_ID%TYPE;<br />
&nbsp; vs_employee_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EMPLOYEE_T.EMPLOYEE_NAME%TYPE;<br />
&nbsp; vs_out_employee_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EMPLOYEE_T.EMPLOYEE_ID%TYPE;<br />
&nbsp; vs_msg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(4000);</p>
<p>BEGIN</p>
<p>&nbsp;&nbsp;&nbsp; vs_employee_id := '001';<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; vs_employee_name := 'znp';</p>
<p>&nbsp;&nbsp;&nbsp; vs_sql := 'INSERT INTO EMPLOYEE_T(EMPLOYEE_ID,EMPLOYEE_NAME) VALUES (:1,:2) RETURNING EMPLOYEE_ID INTO :3';<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; EXECUTE IMMEDIATE vs_sql USING vs_employee_id,vs_employee_name RETURN INTO vs_out_employee_id ;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; COMMIT;<br />
&nbsp;&nbsp;&nbsp; <br />
EXCEPTION </p>
<p>&nbsp;&nbsp;&nbsp; WHEN OTHERS THEN<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vs_msg :=SQLERRM;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ROLLBACK;</p>
<p>end SP_DEAL_IN_OUT;</p>
<p><br />
1、通过动态SQL直接提取查询结果,返回查询结果集</p>
<p>CREATE OR REPLACE PROCEDURE SP_EMPLOYEE(<br />
cur&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OUT&nbsp;&nbsp; SYS_REFCURSOR<br />
)<br />
IS</p>
<p>&nbsp; vs_sql&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(4000);</p>
<p>BEGIN</p>
<p>&nbsp;&nbsp;&nbsp; vs_sql := 'SELECT EMPLOYEE_ID,EMPLOYEE_NAME FROM EMPLOYEE_T ';<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; OPEN cur FOR vs_sql;</p>
<p>end SP_EMPLOYEE;</p>
<p><br />
2、通过动态SQL提取查询结果集,通过显式游标方式进行处理<br />
CREATE OR REPLACE PROCEDURE SP_EMPLOYEE<br />
IS<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; vs_sql&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(4000);<br />
&nbsp;&nbsp; vs_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EMPLOYEE_T.EMPLOYEE_ID%TYPE;<br />
&nbsp;&nbsp; vs_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EMPLOYEE_T.EMPLOYEE_NAME%TYPE;<br />
&nbsp; <br />
&nbsp;&nbsp; TYPE cur_cursor IS REF CURSOR;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; cur&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cur_cursor;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>BEGIN</p>
<p>&nbsp;&nbsp;&nbsp; vs_sql := 'SELECT EMPLOYEE_ID,EMPLOYEE_NAME FROM EMPLOYEE_T ';<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; OPEN cur FOR vs_sql;</p>
<p>&nbsp;&nbsp;&nbsp; LOOP <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FETCH cur INTO vs_id,vs_name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UPDATE EMPLOYEE_T<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET EMPLOYEE_NAME = vs_name<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE&nbsp; EMPLOYEE_ID = vs_id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EXIT WHEN cur%NOTFOUND;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; END LOOP;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; CLOSE cur;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; COMMIT;<br />
&nbsp;&nbsp;&nbsp; <br />
EXCEPTION </p>
<p>&nbsp;&nbsp;&nbsp; WHEN OTHERS THEN<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ROLLBACK;</p>
<p>end SP_EMPLOYEE;</p>
<p><br />
3、通过动态SQL直接调用存储过程<br />
CREATE OR REPLACE PROCEDURE SP_DEAL(<br />
is_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2<br />
)<br />
IS</p>
<p>vs_sql&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(1000);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --动态SQL描述</p>
<p>BEGIN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; --拼接动态调用哪一个存储过程(指定三个调用形参)<br />
&nbsp;&nbsp;&nbsp; vs_sql := 'BEGIN SP_'||is_name||'_BACKUP(:V1,:V2,:V3,:v4); END;';<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; --执行动态SQL,同时指定一个入参与两个出差<br />
&nbsp;&nbsp;&nbsp; EXECUTE IMMEDIATE vs_sql USING IN is_id, IN is_para,OUT on_flag,OUT os_msg;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
EXCEPTION</p>
<p>&nbsp;&nbsp;&nbsp; WHEN OTHERS THEN<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; on_flag := -1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; os_msg := 'SP_'||is_name||':'||SUBSTR(SQLERRM,0,200); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
END SP_DOUBT_BACKUP;</p>
<p><br />
4、为动态SQL指定入参<br />
</p>
<img src ="http://www.blogjava.net/zhaonp/aggbug/342035.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaonp/" target="_blank">zhaonp</a> 2010-12-31 09:51 <a href="http://www.blogjava.net/zhaonp/archive/2010/12/31/342035.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解析IN函数使用的字符串</title><link>http://www.blogjava.net/zhaonp/archive/2010/12/30/342001.html</link><dc:creator>zhaonp</dc:creator><author>zhaonp</author><pubDate>Thu, 30 Dec 2010 08:12:00 GMT</pubDate><guid>http://www.blogjava.net/zhaonp/archive/2010/12/30/342001.html</guid><wfw:comment>http://www.blogjava.net/zhaonp/comments/342001.html</wfw:comment><comments>http://www.blogjava.net/zhaonp/archive/2010/12/30/342001.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaonp/comments/commentRss/342001.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaonp/services/trackbacks/342001.html</trackback:ping><description><![CDATA[<p>操作环境<br />
Server&nbsp;&nbsp; Oracle&nbsp; 11g<br />
Client&nbsp;&nbsp;&nbsp; Oracle&nbsp; 10g<br />
<br />
vs_string&nbsp; 输入参数格式如'info1,info22,info333,info4444',以","做间隔符,每变量长度不确定 </p>
<p>vn_num&nbsp;&nbsp;&nbsp;&nbsp; vs_string 中合并拼接的变量数量</p>
<p>SELECT SUBSTR(vs_string,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DECODE(LEVEL,1,0,(INSTR(vs_string,',',1,LEVEL-1)))+1,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DECODE(LEVEL,vn_num,LENGTH(vs_string),INSTR(vs_string,',',1,DECODE(LEVEL,1,1,LEVEL))-1)-<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (DECODE(LEVEL,1,0,(INSTR(vs_string,',',1,LEVEL-1)))+1)+1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM DUAL <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CONNECT BY LEVEL &lt;= (SELECT REGEXP_COUNT(vs_string,',',1,'i')+1 FROM DUAL);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>在oracle 中 IN 函数只能对查询的结果集或明确的参数集合进行多行查询，对于一个参数无论其表现形式只能进行一个参数的判断查询</p>
<p>如</p>
<p>EMPLOYEE_T 表中存在如下数据</p>
<p>EMPLOYEE_ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EMPLOYEE_NAME<br />
--------------------------------<br />
001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; znp<br />
002&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zsj<br />
003&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zhsj</p>
<p>SELECT EMPLOYEE_ID,EMPLOYEE_NAME FROM EMPLOYEE_T WHERE EMPLOYEE_ID IN ('001','002')的查询结果如下</p>
<p>EMPLOYEE_ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EMPLOYEE_NAME<br />
--------------------------------<br />
001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; znp<br />
002&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zsj</p>
<p>SELECT EMPLOYEE_ID,EMPLOYEE_NAME FROM EMPLOYEE_T WHERE EMPLOYEE_ID IN ('001,002')的查询结果如下</p>
<p>EMPLOYEE_ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EMPLOYEE_NAME<br />
--------------------------------</p>
<p>在 SELECT * FROM EMPLOYEE_T WHERE EMPLOYEE_ID IN ('001,002') 中 "'001,002'" 只能做为一个入参而不是两个入参,参数值为<br />
'001,002' ,故查不到合适的记录</p>
<p>在存储过程中对于以上的入参可以采取两种办法进行</p>
<p>1、通过拼接动态SQL进行查询</p>
<p>vs_sql := 'SELECT EMPLOYEE_ID,EMPLOYEE_NAME FROM EMPLOYEE_T WHERE EMPLOYEE_ID IN ('||CHR(39)||'001'||CHR(39)||','||CHR(39)||'002'||CHR(39)||');</p>
<p>OPEN _cur FOR vs_sql;</p>
<p>2、将拼接串转为结果集输出至IN函数中,使用如下脚本</p>
<p>vs_string&nbsp; 输入参数格式如'info1,info22,info333,info4444',以","做间隔符,每变量长度不确定 </p>
<p>vn_num&nbsp;&nbsp;&nbsp;&nbsp; vs_string 中合并拼接的变量数量</p>
<p>SELECT SUBSTR(vs_string,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DECODE(LEVEL,1,0,(INSTR(vs_string,',',1,LEVEL-1)))+1,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DECODE(LEVEL,vn_num,LENGTH(vs_string),INSTR(vs_string,',',1,DECODE(LEVEL,1,1,LEVEL))-1)-<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (DECODE(LEVEL,1,0,(INSTR(vs_string,',',1,LEVEL-1)))+1)+1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM DUAL <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CONNECT BY LEVEL &lt;= (SELECT REGEXP_COUNT(vs_string,',',1,'i')+1 FROM DUAL);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
照办上例,即为</p>
<p>SELECT EMPLOYEE_ID,EMPLOYEE_NAME FROM EMPLOYEE_T <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE EMPLOYEE_ID IN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT SUBSTR(vs_string,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DECODE(LEVEL,1,0,(INSTR(vs_string,',',1,LEVEL-1)))+1,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DECODE(LEVEL,vn_num,LENGTH(vs_string),INSTR(vs_string,',',1,DECODE(LEVEL,1,1,LEVEL))-1)-<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (DECODE(LEVEL,1,0,(INSTR(vs_string,',',1,LEVEL-1)))+1)+1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM DUAL <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CONNECT BY LEVEL &lt;= (SELECT REGEXP_COUNT(vs_string,',',1,'i')+1 FROM DUAL)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );<br />
</p>
<img src ="http://www.blogjava.net/zhaonp/aggbug/342001.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaonp/" target="_blank">zhaonp</a> 2010-12-30 16:12 <a href="http://www.blogjava.net/zhaonp/archive/2010/12/30/342001.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle sqllder 数据导入</title><link>http://www.blogjava.net/zhaonp/archive/2010/12/24/341431.html</link><dc:creator>zhaonp</dc:creator><author>zhaonp</author><pubDate>Fri, 24 Dec 2010 01:49:00 GMT</pubDate><guid>http://www.blogjava.net/zhaonp/archive/2010/12/24/341431.html</guid><wfw:comment>http://www.blogjava.net/zhaonp/comments/341431.html</wfw:comment><comments>http://www.blogjava.net/zhaonp/archive/2010/12/24/341431.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaonp/comments/commentRss/341431.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaonp/services/trackbacks/341431.html</trackback:ping><description><![CDATA[<p>操作环境 <br />
<br />
客户端 Oracle 10g<br />
<br />
服务端 Oracle 11g<br />
<br />
1、数据准备<br />
<br />
1.1、在sqlplus下将相关表将相关待导入数据导出为txt文件<br />
<br />
--sqlplus脚本<br />
Set linesize 3000&nbsp;&nbsp;&nbsp; --每行长3000<br />
Set pagesize 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --指定不分页<br />
Set heading off&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --不输出标题行<br />
Set feedback off&nbsp;&nbsp;&nbsp;&nbsp; --不输出反馈信息<br />
Set echo off&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --不显示命令本身<br />
Set termout off&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --不显示终端信息<br />
Set trimout On&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --截断终端显示空格<br />
Set trimspool On&nbsp;&nbsp;&nbsp;&nbsp; --截断输出至日志空格<br />
spool c:\a.txt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --指定屏幕输出到相关文件<br />
spool off&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --关闭指定输出<br />
<br />
以上脚本控制sqlplus控制台输出打印效果,&nbsp;同时指定屏幕的打印输出将转录入到何文件中<br />
<br />
实际脚本<br />
<br />
sqlplus <a href="mailto:zhsj/zhsj@zhsj">zhsj/zhsj@zhsj</a><br />
Set linesize 3000&nbsp;&nbsp;&nbsp; <br />
Set pagesize 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
Set heading off&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
Set feedback off&nbsp;&nbsp;&nbsp;&nbsp; <br />
Set echo off&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
Set termout off&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
Set trimout On&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
Set trimspool On&nbsp;&nbsp;&nbsp;&nbsp; <br />
spool c:\a.txt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
select employee_id||'|'||employee_name||'|'||employee_salary from t_employee;<br />
spool off&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<br />
以上会将t_employee表中的&nbsp;employee_id、employee_name、employee_salary 三列数据以如下形式写入c:\a.txt&nbsp;文件中<br />
<br />
1|znp|80000.00<br />
2|zhsj|40000.00<br />
3|xxx|30000.00<br />
<br />
数据准备完成后编写sqlldr要用到的ctl文件，用于将txt文件中的数据导入到数据库中，脚本如下 （--部分实际脚本中须删险)</p>
<p>-- a.ctl<br />
Load data&nbsp;&nbsp; --加载数据<br />
infile a.txt&nbsp;&nbsp;&nbsp; --加载数据文件名称(现在是相对路径,可以写成绝对路径c:\bak.txt)<br />
badfile a.bad&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --失败数据写入文件<br />
append&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- append 追加&nbsp; truncate truncate delete 删除<br />
into table&nbsp;t_employee_bak&nbsp;&nbsp;&nbsp; --插入操作表<br />
FIELDS TERMINATED BY '|'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --根据指定标识符隔断各字段值 OPTIONALLY ENCLOSED BY '"'&nbsp; 过滤掉指定的标识符,如"等<br />
(employee_id,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --指定插入字段及数据<br />
employee_name,<br />
employee_salary)<br />
<br />
准备完成后，在cmd下输入<br />
<br />
sqlldr -userid <a href="mailto:zhsj/zhsj@zhsj">zhsj/zhsj@zhsj</a>&nbsp;control=c:\a.ctl&nbsp;&nbsp;<br />
<br />
执行，在t_employee_bak表中可以见到a.txt中的数据已导入<br />
<br />
在执行过程如果出现数据没有导入的情况，可能原因会有以下几种情况<br />
<br />
1、在导出的数据文件中存在同时打印输出的命令行，将命令行删除后重新保存文件即可将数据正常插入到数据库中<br />
2、虽然文本中已是正确的数据但仍然无法导入,此时在执行的SQL脚本中增加一个间隔符的输出，即<br />
<br />
select employee_id||'|'||employee_name||'|'||employee_salary from t_employee;<br />
<br />
改为<br />
<br />
select employee_id||'|'||employee_name||'|'||employee_salary||'|' from t_employee;<br />
<br />
此时将会正常导入，这是因为列值存在空数据导致间隔计算问题<br />
<br />
以上为txt格式数据文件导出<br />
<br />
对于异质数据库，可以采用sqldeveloper等工具将相关数据库中数据以csv格式导出，此时在编写执行脚本时须变更如下<br />
<br />
-- a.ctl<br />
Load data&nbsp;&nbsp; --加载数据<br />
infile a.txt&nbsp;&nbsp;&nbsp; --加载数据文件名称(现在是相对路径,可以写成绝对路径c:\bak.txt)<br />
badfile a.bad&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --失败数据写入文件<br />
append&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- append 追加&nbsp; truncate truncate delete 删除<br />
into table&nbsp;t_employee_bak&nbsp;&nbsp;&nbsp; --插入操作表<br />
FIELDS TERMINATED BY ','&nbsp;&nbsp;&nbsp;OPTIONALLY ENCLOSED BY '"'&nbsp;&nbsp;&nbsp;--根据指定标识符隔断各字段值 OPTIONALLY ENCLOSED BY '"'&nbsp; 过滤掉指定的标识符,如"等<br />
(employee_id,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --指定插入字段及数据<br />
employee_name,<br />
employee_salary)<br />
<br />
因为csv格式文件在用txt打开可以看到数据文件格式为"1","znp","80000.00"，需要将' " '标识符去掉，才可以正常导入<br />
<br />
大数据量时csv格式文件会比txt格式文件大3倍左右，且导入时可能出现问题，所以尽量采用txt文件方式导入<br />
<br />
<br />
<br />
</p>
 <img src ="http://www.blogjava.net/zhaonp/aggbug/341431.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaonp/" target="_blank">zhaonp</a> 2010-12-24 09:49 <a href="http://www.blogjava.net/zhaonp/archive/2010/12/24/341431.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>