经验积累

一、java

1.
Debug.debug(this.getClass().getName() + ".get(long oid, User user): sql=" + sql);
在dubug时,输出类名,方法名和sql语句。

 

2.java编程中,throws Exception{ }和try{……}catch(){……},这些有什么区别?

throws Exception是方法后面接的 意思是向上级抛出异常

try{}里面的异常会被外面的catch捕捉到
抛出异常是throw new Exception("异常");
用法如下
public static void main(String args[]){
try{
A();
}catch(Exception e){
System.out.println(e.getmessage());
}
}

public static void A() throws Exception{
throw new Exception("A方法抛出了一个异常");
}


3.logic:iterate 奇偶不同颜色
<%int i=0;%>
<logic:iterate id="mb" name="ManagerHrDateForm" property="managerHrDateBo.managerHrDateBoList" indexId="index">
<%i++;%>
<tr <%if(i%2 == 0 ){%> class="even" <%}%>>
html代码
</logic:iterate>

4.方法尽量通用化,参数尽量用BO传递(便于更改参数)

5.大数字尽量用BigDecimal类型作比较,可以用String类型传递,也可以用BigDecimal类型传递
String与BigDecimal的转换
String str = "123.525566";
BigDecimal bd = new BigDecimal(str);

String str1 = bd.toString();

6.从数据库里读取出来的实体(列如:VO),继承java序列化,对数据比较多时,java序列化会把读取到的数据写在硬盘,
有利于系统性能。

7.代码
System.out.println(Double.parseDouble("983156397.3154")));
打印出来:9.831563973154E8,
代表科学计算法,9.831563973154 乘以 10 的8次方
如果不想要科学计数法时,
java.text.DecimalFormat df=new java.text.DecimalFormat("#,###,###.##");
System.out.println(df.format(Double.parseDouble("983156397.3154")));
打印:983156397.32

8.jsp文件过大报错
1.web.xml文件(在tomcat下位于conf目录下,在jboss下位于server\default\deploy\jbossweb.sar目录下 )
<init-param>
<param-name>mappedfile</param-name>
<param-value>false</param-value>
</init-param>

2.java类文件不允许超过65K,如果遇到类似情况,还有几个方法可以考虑:
2.1、将JSP里面的代码按逻辑分割写成java类的方法调用。
2.2、拆分JSP文件。
2.3、使用<jsp:include page="a.jsp"/>替换< %@include file="a.jsp" % >

 

9.一直报这个错“No getter method for property xxx of bean”

思路:这个属性在bean里没有getter方法,其实我在bean里已经设置了getter方法,
解决方案:我的属性名为:”iFSubCanView“,第二字母大写了,getter方法就变成了
GetIFSubCanView(),只要把属性名改为”ifSubCanView“即可正常。

10.插入时报错
报错信息:"ORA-00947: not enough values"
解决方案:最终发现是少了两个“?”号导致的。插入数据库时忘了加?号。
解决方法:新开发的的插入语句数?与值是否一样多;如果修改功能,直接跟新版本对照

11.jdbc

1.经典模板
/**
* 获取一个最新无效的执行项目经理
* @param projectId 项目ID
* @return String 执行项目经理编号
* @throws Exception
*/
public String getInvalidProjectMgr(String projectId) throws Exception {
String projectMgr="";
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
StringBuilder sb = new StringBuilder();
sb.append("select g.group_id as projectMrg from ecc_epm.gapm_project_group g ");
sb.append("where g.role= 'ContractDeliveryPrincipal' and g.enable_flag = 'F' and g.project_id=? and rownum = 1 ");
sb.append("order by g.last_update_date desc ");
con = BaseDAO.getConnection();
Debug.debug(this.getClass().getName()+String.format(".getInvalidProjectMgr() sql = %s \n parameter:projectId=%s",sb.toString(),projectId));
pstmt = con.prepareStatement(sb.toString());
pstmt.setString(1, projectId);
rs = pstmt.executeQuery();
while(rs.next()) {
projectMgr = rs.getString("projectMrg");
}
rs.close();
pstmt.close();
con.close();
return projectMgr;
}

12.以下是java 判断字符串是否为空的四种方法:
方法一: 最多人使用的一个方法, 直观, 方便, 但效率很低:
if(s == null ||"".equals(s));
方法二: 比较字符串长度, 效率高, 是我知道的最好一个方法:
if(s == null || s.length() <= 0);
方法三: Java SE 6.0 才开始提供的方法, 效率和方法二几乎相等, 但出于兼容性考虑, 推荐使用方法二.
if(s == null || s.isEmpty());
方法四: 这是一种比较直观,简便的方法,而且效率也非常的高,与方法二、三的效率差不多:
if (s == null || s == "");
方法五:

注意:s == null 是有必要存在的.
  如果 String 类型为null, 而去进行 equals(String) 或 length() 等操作会抛出java.lang.NullPointerException.
  并且s==null 的顺序必须出现在前面,不然同样会抛出java.lang.NullPointerException.
  如下Java代码:
  String str = null;
  if(str.equals("") || str= == null){//会抛出异常
   System.out.println("success");
  }
  // "".equals(str);后置确保不会遇null报错。

二、java web

1.service与doPost与doGet关系?
在service默认情况下,无论你是get提价过来还是post提交过来都会先执行service方法,然后再根据具体的请求方式调用doGet与doPost方法,
如果重写了service方法,则不会不处理doGet与doPost方法(除非自己调用)。

 

jstl 

1.标签申明
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!-- 核心标准库 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> <!-- I18N格式标准库 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %> <!-- SQL标准库 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="xml" %> <!-- XML标准库 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> <!-- 函数标准库 -->

2.EL表达式运算符
<c:if test="${BidProjectApplyForm.applyModel.interFlag != 'T' || BidProjectApplyForm.applyModel.isNewDocument != 'T'}">

3.表达式易错点
<c:if test="${BidProjectApplyForm.applyModel.interFlag != 'T' || BidProjectApplyForm.applyModel.isNewDocument != 'T'} ">
在 'T'} ,EL表达式的后面加上了空格的化,整个表达式就会出现成:
<c:if test="true ">,所以不会判断成true。

 

servlet

1.service与doPost与doGet关系?
在service默认情况下,无论你是get提价过来还是post提交过来都会先执行service方法,然后再根据具体的请求方式调用doGet与doPost方法,
如果重写了service方法,则不会不处理doGet与doPost方法(除非自己调用)。

 

 

三、spring

1.一个service调用另一个service时,spring获取bean方法。

1.1 java代码:
//(ProjectApplicationAwardService代码)
Common common = (Common)SpringServiceFactory.getInstance().getServiceObject("myCommon"); //myCommon为bean的名称
boolean flag = common.isStipulateState("692",com.zte.ecc.epm.awards.util.StateUtil.AWARDS_CREATED); //调用Common的isStipulateState方法

//(Common代码)
private IProjectMyTaskDAO myProjectMyTaskDAO;

public IProjectMyTaskDAO getMyProjectMyTaskDAO() {
return myProjectMyTaskDAO;
}

public void setMyProjectMyTaskDAO(IProjectMyTaskDAO myProjectMyTaskDAO) {
this.myProjectMyTaskDAO = myProjectMyTaskDAO;
}

1.2 spring配置文件

<!-- 申明一个bean -->
<bean id="idmyProjectMyTaskDAO" class="com.zte.ecc.epm.awards.dao.ProjectMyTaskDAO">
<property name="dataSource" ref="dataSource"/>
<property name="sqlMapClient" ref="sqlMapClient"/>
</bean>

<!-- 申明一个bean -->
<bean id="idprojectApplicationAwardDAO" class="com.zte.ecc.epm.awards.dao.ProjectApplicationAwardDAO">
<property name="dataSource" ref="dataSource"/>
<property name="sqlMapClient" ref="sqlMapClient"/>
</bean>

<!-- 使用set注入,两个属性 myProjectMyTaskDAO 和 projectApplicationAwardDAO-->
<bean id="myCommon" parent="baseTxProxy">
<property name="target">
<bean class="com.zte.ecc.epm.awards.util.Common">
<property name="myProjectMyTaskDAO">
<ref local="idmyProjectMyTaskDAO"/>
</property>
<property name="projectApplicationAwardDAO">
<ref local="idprojectApplicationAwardDAO"/>
</property>
</bean>
</property>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>

 

四、代码规范

/**
* Java编码格式个人推荐,参考JDK源码和Hyperic HQ源码(原spring旗下著名开源软件,现vmware)。
* @author lihzh(苦逼coder)
* 本文地址:http://mushiqianmeng.blog.51cto.com/3970029/737120
*/
public class CodeRule {

//声明变量,等号两边有空格。
private static int i = 1;

//方法声明,右括号和左大括号中间有空格。
public static void main(String[] args) {
//if语句,比较连接符(>)左右有空格,小括号和大括号中间有空格。
//if 与 左括号中间有空格
if (i > 0) {
System.out.println(i);
}
//两个条件的连接(&&),左右有空格。
if (i > 0 && i < 2) {
System.out.println(i);
}

//if..else 语句两种格式
//1.参考JDK,个人使用方式,else跟大括号,前后都有空格
if (i > 0 && i < 2) {
System.out.println(i);
} else if (i > 2) {
System.out.println(i + 1);
} else {
System.out.println(i);
}
//2.参考Hyperic HQ源码, else另起一行,后仍有空格
if (i == 1) {
System.out.println(i);
}
else {
System.out.println(i);
}

//while语句,与if语句类型,while与括号中间有空格,括号内格式与if相同
while (i > 0 && i < 2) {
System.out.println(i);
i++;
}

//for语句,两种格式
//1.参考Hyperic HQ,个人使用方式。分号后带空格,每个子语句中,连接符左右都带空格。
//for与括号中间带空格,大小括号中间带空格。
for (int j = 0; j < 10; j++) {
System.out.println(i);
}
//2.参考JDK,区别在于子语句中,连接符左右无空格。
for (int j=0; j<10; j++) {
System.out.println(i);
}

//+-*/,格式,四则运算符号前后有空格。
//在JDK的有些代码里,在方法调用的参传递或在判断语句中存在的四则运算中,四则运算符号前后无空格。
//为了不造成困扰和混淆,个人为均保留空格。
int a = 1 + 2;
int b = 1 - 2;
int c = 1 * 2;
int d = 1 / 2;

//三元表达式格式,每个符号中间均有空格
int j = i > 2 ? 1 : -1;

//方法声明和调用,用逗号分隔的参数,逗号后有空格。
sum(a, b);
sum(c + d, j);
}

//方法声明,多个参数,逗号后有空格
private static int sum(int i, int j) {
return i + j;
}
}

 

五、myeclipse

1.引入包
ECC --》 Properties --> java build path --> source --> Link source

2.查找页面方法
如:http://localhost:8080/epm/uiloader/index.html 里面的查找方法
页面源代码找到查找html,

3.Myelclipse 不能调试
解决方案:Window -> Preferences -> java -> Compiler
把“Add line nubver attributes to generated class files(used by the debugger)”勾上即可。
原因:报错提示不要乱隐藏。

4.加快项目编译配置
解决方案 -> 项目右键 -> Properties -> Builders
把“DeploymentDescriptorValudator”、"Valudation" 、"DeploymentBuilder"勾去掉即可。

 

六、正则表达式

JScript(正则表达式语法)

1.元字符
^ 在字符组外部,代表一行的开始。
$ 代表一行的结束。
列: ^cat : 匹配的是以c作为一行的第一个字符,紧接着一个a,紧接一个t的文本。 ($ 同理)
列: ^From|Subject|Date 和 ^(From|Subject|Date) 第一个代表匹配^From或者Subject或者Date;第二个匹配^From或者^Subject或者^Date。

2.字符组
[] 等同于 | 代表 或 。(注意 | 在字符组外部才表示 或 )
列: gr[ea]t : 首先匹配g,接下来匹配r,接下来匹配e或a,接下来匹配t。

- (连字符)在字符组内部,代表一个范围。 (注:- 放在在字符组内开头或者 [^ 之后都表示普通字符)
列:[0-9a-zA-Z] 匹配任意的数字或者大小写字母。
列:[0-9A-Z_!.?] 匹配任意数字大写字母和 _ 或 ! 或 . 或 ? 的字符。(注:在字符组内部,连字符才是元字符,不过 . 和 ? 在字符组内部是普通字符)
([] 里面表示字符组)

[^ ] 字符组内部,代表匹配任何未列出的字符。 (注:在字符组外部,^ 表示一个行描点代表一行的开始;但是在字符组内部,而且必须时紧接在字符组的第一个方括号之后,
就是一个元字符,代表排除。)

. 代表匹配任意字符。
列:19-20-79或19/20.79 正则为:19.20.79 或者 19[-./]20[-./]79 (注:后面这个 - . / 是普通字符)

3.单词分界符

\< \> 如果支持“元字符序列”,这两个风别表示匹配单词分界的位置,单词的开头与结束。

3.1 重复的元素
字符? (字符后面一个?)表示可选项,一个字符加上一个? ,表示此处容许出现这个字符,也可以不出现。

列:匹配color和colour , 则:colou?r 。
列:匹配4th和4 ,则:4(th)?

+ 表示之前紧邻的元素出现一次或者多次(至少要一次)。
* 表示之前紧邻的元素出现任意多次(一次没有也行)。

3.2 括号与反向引用
\ 表示转义符,他作用的元字符会失去特殊含义。
列:匹配ega.att.com 则:ega\.att\.com

4.位数
验证n位的数字:^\d{n}$
验证至少n位数字:^\d{n,}$
验证m-n位的数字:^\d{m,n}$


二. 实例(java)
1.匹配小数或数字
^-?\\d+(\\.\\d+)?$
^-?\\.\\d+$


三.实例
匹配负整数的正则表达式:
-[0-9]*[1-9][0-9]*
匹配整数的正则表达式:
-?\\d+
匹配非负浮点数(正浮点数 + 0)的正则表达式:
\\d+(\\.\\d+)?
匹配正浮点数的正则表达式:
(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))
匹配非正浮点数(负浮点数 + 0)的正则表达式:
((-\\d+(\\.\\d+)?)|(0+(\\.0+)?))
匹配负浮点数的正则表达式:
(-(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*)))
匹配浮点数的正则表达式:
(-?\\d+)(\\.\\d+)?
匹配26个英文字母组成字符串的正则表达式:
[A-Za-z]+
匹配26个英文字母的大写组成字符串的正则表达式:
[A-Z]+
匹配26个26个英文字母的小写组成字符串的正则表达式:
[a-z]+
匹配中文字符的正则表达式:
[\u4e00-\u9fa5]
匹配中文字符数限制的正则表达式:
[\u4e00-\u9fa5]{2,4}
匹配下划线和数字及字母的正则表达式:
[\w+]{6,12}
匹配中文字符及字母的正则表达式:
[^\W\x00-\xff]{6,16}
匹配双字节字符(包括汉字在内)表达式:
[^\x00-\xff]
匹配空行的正则表达式:
\n[\s| ]*\r
匹配HTML标记的正则表达式:
/<(.*)>.*<\/\1>|<(.*) \/>/
匹配首尾空格的正则表达式:
(^\s*)|(\s*$)(像vbscript那样的trim函数)
匹配Email地址的正则表达式:
\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
匹配网址URL的正则表达式:
http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?
匹配手机号码且以数字开头的正则表达式:
((\d3)|(\d{3}\-))?13\d{9}|15[89]\d{8} 或 [+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[]){1,12})+
匹配普通电话、传真号码,可以“+”开头,除数字外,可含有“-”的正则表达式:
\d{3,4}-?\d{7,8}-?\d{0,1} 或 [+]{0,1}(\d){1,3}[]?([-]?((\d)|[]){1,12})+
匹配特定形式数字及标识(如60~80)的正则表达式:
[1-9][0-9]?[0-9]?(~)[1-9][0-9]?[0-9]?
匹配百分数的正则表达式:
/^(([0-9](\.[0-9]*)?)|([1-9][0-9](\.[0-9]*)?)|(100))$/

专用字符包括:+,*,?
+:规定其前导字符必须在目标对象中连续出现一次或多次。
*:规定其前导字符必须在目标对象中出现零次或连续多次。
?:规定其前导对象必须在目标对象中连续出现零次或一次。

{n}匹配确定的 n 次。
{n,}至少匹配 n 次。
{n,m}n <= m,最少匹配 n 次且最多匹配 m 次。
\s:用于匹配单个空格符,包括tab键和换行符;
\S:用于匹配除单个空格符之外的所有字符;
\d:用于匹配从0到9的数字;
\w:用于匹配字母,数字或下划线字符;
\W:用于匹配所有与\w不匹配的字符;
. :用于匹配除换行符之外的所有字符。

较为常用的定位符包括:^, $, \b,\B
^:定位符规定匹配模式必须出现在目标字符串的开头
$:定位符规定匹配模式必须出现在目标对象的结尾
\b:定位符规定匹配模式必须出现在目标字符串的开头或结尾的两个边界之一
\B:定位符则规定匹配对象必须位于目标字符串的开头和结尾两个边界之内,即匹配对象既不能作为目标字符串的开头,也不能作为目标字符串的结尾。

使用座机号码(JS)范例:
(/^\d{3,4}[-]d{7,8}[-]\d{0,1}$/.test(value))


<script type="text/javascript">
function validate(){
var reg = new RegExp("^[0-9]*$");
var obj = document.getElementById("name");
if(!reg.test(obj.value)){
alert("请输入数字!");
}
if(!/^[0-9]*$/.test(obj.value)){
alert("请输入数字!");
}
}
</script>

七、oracle

1.oracle分页查询
1.1
oracle分页有通用写法,假设一页5行
select * from (
select t.*,rownum from (
select * from table1 where condition order by column) t )
where rownum>(pangeNow-1)*5 and rownum<=(pageNow)*5
1.2
如果基础查询不需要排序,可以省掉一层嵌套
select * from (
select t.*,rownum from table1 t where condition )
where rownum>(pangeNow-1)*5 and rownum<=(pageNow)*5

1.3 通过WITH AS分页
例一:耗费6,最优 (给查询语句去一个别名叫resultView,之后进行分页查找)
WITH resultView AS (
select *
from ecc_fnd.ecc_fnd_emplyees em
order by em.emplyee_id)
select k.*
from (select resultView.* , rownum as resultRow from resultView
where rownum <=10) k
where k.resultRow > 0


--====================================
例二:耗时30000,差
WITH resultView AS (
select *
from ecc_fnd.ecc_fnd_emplyees em
order by em.emplyee_id)
select k.*
from (select resultView.* , rownum as resultRow from resultView) k
where k.resultRow > 0
and k.resultRow <= 10

--=====================================
例三:耗费3000,差
WITH resultView AS (
select em.* , rownum as resultRow
from ecc_fnd.ecc_fnd_emplyees em
order by em.emplyee_id)
select k.*
from resultView k
where k.resultRow > 0
and k.resultRow <=10


2.ORACLE中,如果表中的字段名,正好跟sql中关键词重名,写sql语句时:

2.1.要将该字段名大写

2.2.字段名前后要加双引号(注:必须是双引号,单引号将无效)

比如:SELECT * FROM MYTABLE ORDER BY "ORDER"


3.update方法注意点
(摘抄)
========================================
在表的更新操作中,在很多情况下需要在表达式中引用要更新的表以外的数据。象sql server提供了update的from 子句,可以将要更新的表与其它的数据源连接起来。虽然只能对一个表进行更新,但是通过将要更新的表与其它的数据源连接起来,就可以在update的表达式中引用要更新的表以外的其它数据。
例如:

UPDATE Table2
SET Table2.ColB = Table2.ColB + Table1.ColB
FROM Table2
INNER JOIN Table1
ON (Table2.ColA = Table1.ColA);

实际更新的操作是在要更新的表上进行的,而不是在from子句所形成的新的结果集上进行的。


Oracle没有update from语法,可以通过两种写法实现同样的功能:
1:子查询UPDATE A SET A.NAME=(SELECT B.NAME FROM B WHERE B.ID=A.ID),本查询要根据具体情况看看是否变通成如下
(1)单列
UPDATE A

SET A.NAME=(SELECT B.NAME FROM B WHERE B.ID=A.ID)

WHERE A.ID IN (SELECT ID FROM B);

(2)多列
UPDATE order_rollup

SET(qty,price)=(SELECT SUM(qty),SUM(price) FROM order_lines WHERE customer_id='KOHL' )

WHERE cust_id='KOHL' AND order_period=TO_DATE('01-Oct-2000')


2:利用视图来做
UPDATE (SELECT A.NAME ANAME,B.NAME BNAME FROM A,B WHERE A.ID=B.ID)
SET ANAME=BNAME;

例如:

UPDATE tablea a
SET a.fieldforupdate = (SELECT b.fieldsource FROM tableb b WHERE a.keyfield = b.keyfield)
WHERE EXISTS (SELECT b.fieldsource FROM tableb b WHERE a.keyfield = b.keyfield)

有三点需要注意:
1. 对于一个给定的a.keyfield的值,SELECT b.fieldsource FROM tableb b WHERE a.keyfield = b.keyfield 的值只能是一个唯一值,不能是多值。
2. 在绝大多数情况下,最后面的where EXISTS子句是重要的,否则将得到错误的结果。
3. 对于视图更新的限制:
如果视图基于多个表的连接,那么用户更新(update)视图记录的能力将受到限制。除非update只涉及一个表且视图列中包含了被更新的表的整个主键,否则不能更新视图的基表。
===========================================
列:更新结论审核在途的单据到待提交
update ECC_EPM.EPM_TBL_SUBCONTRACT_PROAPPLY p
set p.state = '01created'
where p.request_id in
(
select rq.oid
from ECC_EPM.EPM_TBL_SUBCONTRACT_REQUEST rq
where rq.international = 'F'
and rq.out_service_buy = '1'
)
and p.conclusion_no is not null
and p.state <> '01created'
and p.state <> '03approved'
and p.state <> '04deleted'


4.row_number() over() 函数
4.1.row_number() over (order by col_1[,col_2 ...])
作用:按照col_1[,col_2 ...]排序,返回排序后的结果集。
4.2.row_number() over (partition by col_n[,col_m ...] order by col_1[,col_2 ...])
作用:先按照col_n[,col_m ...进行分组,
再在每个分组中按照col_1[,col_2 ...]进行排序(升序),
最后返回排好序后的结果集:

例子1:返回执行项目经理,如果有有效的执行项目经理就用有效的,否则,用无效的并且最近的执行项目经理。
(注意传值问题,Enable_Flag desc排序,使有效的总是排在第一条)
select distinct info1.PROJECT_FLAG,
info1.project_id,
info1.project_name,
info1.project_code,
K.group_id ProjectManger,
info1.international
from ecc_epm.GAPM_PROJECT_INFO info1
LEFT JOIN (SELECT G.group_id,
G.PROJECT_ID,
row_number() over(partition by G.Project_Id order by G.Enable_Flag desc, G.last_update_date desc) as sal_order
FROM ecc_epm.gapm_project_group G
where G.Role = 'ContractDeliveryPrincipal'
) K ON K.PROJECT_ID = info1.project_id and K.sal_order = 1


5. 根据条件合并行(只允许合并一行)应用到自定义函数

/*
根据条件合并行(只允许合并一行)
tab_name 表名
condition_row 条件列名
condition_row_val 条件列值
concat_row 需要合并的行
*/
CREATE OR REPLACE FUNCTION ECC_EPM.my_wm_concat(tab_name in varchar2,condition_row in varchar2, condition_row_val in varchar2,concat_row in varchar2 )
return varchar2
is
type typ_cursor is ref cursor;
v_cursor typ_cursor;
v_temp varchar2(20);
v_reslut varchar2(32767) :='';
v_sql varchar2(100);
BEGIN
v_sql := 'select '||concat_row||' from ' ||tab_name|| ' where '|| condition_row || ' = '|| condition_row_val ;
open v_cursor for v_sql;
FETCH v_cursor INTO v_temp;
LOOP
EXIT WHEN NOT v_cursor%FOUND;
v_reslut := v_reslut||','||v_temp;
FETCH v_cursor INTO v_temp;
END LOOP;
RETURN SUBSTR(v_reslut,2);
END;


6.not in 条件注意点
not in条件里面一般要排除掉null值,不然会查不到值

7.死锁与解锁
7.1所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。 由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。
7.2死锁的原理 :
当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提
交,另一条对于这一列数据做更新操作的语句在执行的时候就会处于等待状态,
此时的现象是这条语句一直在执行,但一直没有执行成功,也没有报错。
7.3 平常开发中出现的死锁是原因,在pl/sql软件里用了for updata

8.解决“按住Ctrl鼠标左键单击存储过程名称,只能看到存储过程的头,不能看到内容”
解决方案:用命令窗口输入“view 存储过程名称”,即可看到内容体
解决方案二:右键选择"编辑说明与体"

9.to_date()格式
不区分大小写,
yyyy-mm-dd hh:mi:ss => 2016-07-20 5:40:20 (十二小时制)
yyyy-mm-dd hh24:mi:ss => 2016-07-20 17:40:20 (二十四小时制)

 

10.类的别名
可以在列名和别名之间加入关键字‘AS’或者省略‘AS’,别名使用双引号,以便在别名中包含空格或特殊的字符并区分大小写

11.连接符
‘||’用来合成列
列:SELECT last_name||job_id AS "Employees" FROM employees;

12.回避特殊符号
使用转义符。例如:将[%]转为[\%]、[_]转为[\_],然后再加上[ESCAPE ‘\’] 即可。
列:SELECT job_id FROM jobs WHERE job_id LIKE ‘IT\_%‘ escape ‘\‘;

13.大小写控制函数
UPPER() 字符变大写
LOWER() 字符变小写
INITCAP() 字符首字母大写

14.字符控制函数
CONCAT() 连接字符 列:CONCAT('Hello', 'World') ==》 HelloWorld
SUBSTR() 截取字符 列:SUBSTR('HelloWorld',1,5) ==》 Hello
LENGTH() 取得字符串长度 列:LENGTH('HelloWorld') ==》 10
INSTR() 查找字符在字符串中的位置 列:INSTR('HelloWorld', 'W') ==》 6
LPAD() 从左边对字符串使用指定的字符进行填充。 列:LPAD(salary,10,'*') ==》 *****24000
RPAD() 从右边对字符串使用指定的字符进行填充。 列:RPAD(salary,10,'*') ==》 24000*****
TRIM() 去除字符串两头空格,也可以去除指定的字符在头和尾。 列:TRIM('H' FROM 'HelloWorld') ==》 elloWorld

15.oracle为了方便操作提供了一个伪表.因为他不存储主题数据,里面只有一个字段和一条数据。“dual”

16.数字函数
ROUND() 四舍五入
TRUNC() 截断
MOD() 求余

17.日期
sysdate 服务器当前时间。
a.在日期上加上或减去一个数字结果仍为日期。
b.两个日期相减返回日期之间相差的天数。
c.可以用数字除24来向日期中加上或减去小时。 列:select (sysdate + 1/24) from dual

MONTHS_BETWEEN() 两个日期相差的月数。 列:select MONTHS_BETWEEN(sysdate,LAST_DAY(to_date('2015-2-05','yyyy-mm-dd'))) from dual
ADD_MONTHS() 向指定日期中加上若干月数。
NEXT_DAY() 指定日期的下一个日期。
LAST_DAY() 本月的最后一天。
ROUND() 日期四舍五入。
TRUNC() 日期截断

列:--下一个星期五
select next_day(sysdate, '星期五') from dual

18.数据转换
9.1 TO_CHAR(date, 'format_model'):转成字符。
a.日期转字符时,date日期,format_model格式

YYYY 2004
YEAR TWO THOUSAND AND FOUR
MM 02
MONTH JULY
MON JUL
DY MON
DAY MONDAY
DD 02

例:select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual
select to_char(sysdate,'yyyy') as nowYear from dual; //获取时间的年
select to_char(sysdate,'mm') as nowMonth from dual; //获取时间的月
select to_char(sysdate,'dd') as nowDay from dual; //获取时间的日
select to_char(sysdate,'hh24') as nowHour from dual; //获取时间的时
select to_char(sysdate,'mi') as nowMinute from dual; //获取时间的分
select to_char(sysdate,'ss') as nowSecond from dual; //获取时间的秒
--显示为:2015年11月30日 星期一 02:43:42 下午
select to_char(sysdate, 'yyyy"年"MM"月"dd"日" day hh12:mi:ss am') as "date" from dual

b.数字转换成字符时
列:select to_char(TO_NUMBER('1221.12'),'$9,999.00') from dual ==》 $1,221.12

9.2 TO_NUMBER 函数将字符转换成数字
TO_NUMBER(char[, 'format_model'])

 

19. PL/SQL复习一 标识符命名规则

  变量 :v_作为前缀 例如:v_sal, v_job
  常量: c_作为前缀 例如:c_rate
  游标:_cursor作为后缀 例如:emp_cursor
  异常:e_作为前缀 例如:e_integrity_error
  plsql表类型:_table_type作为后缀 例如sal_table_type
  plsql表变量:_table作为后缀 例如:sal_table
  plsql记录类型:_record_type后缀 例如:emp_record_type
  plsql记录变量:_record后缀 例如:emp_record

posted @ 2016-10-21 15:28  飞翔.  阅读(307)  评论(0编辑  收藏  举报