1) 时间转换函数中如果有时间变量yyyy-mm-dd两边需两''
to_date(''' || to_char(a_valid_date_end, 'yyyy-mm-dd') ||''', ''yyyy-mm-dd'')
2) select distinct(e.itemnum) bulk collect into v_itemnum
将字符串数组以分隔符分隔的字符串调用
pkg_maximo_common.get_string(v_itemnum, ',', '')
3) union只是将两个结果联结起来一起显示,并不是联结两个表并成一个新表.
4) 判断tbl_cad表是否有数据用where exists (select null from tbl_cad where c_id = cei_id)
5)当判断某一表中是够存在符合某一集合的一个值时使用下列语句:
for v_row in c_cursor loop
select count(*) into v_count from tmp_wrong_work_order where twwo_tmp_work_order = v_row.two_id;
6)函数substr(str,1,M)返回字符串str中从一开始的M长的字符串。
7)定义游标在过程名后面,并且可以附语句给cursor。
8)当需要连接两个表相同记录到一个表中时,用符号 连接(+)。
9)当需要只取一个选择集的一条记录,或者小于等于某条记录时,在选择语句后添加rownum.
10)把选择出来的几条记录存入一个数组时用bulk collect into.
11)考虑时间变量为空,并且与其他时间变量比较大小时不能用nvl()函数
12)LPAD(str,n,'0')如果字符串str不足n位,则在前面填充字符'0'。
13)select seq_work_plan_version.currval into v_version_id from dual
选择序列标记的当前最大值为变量v_version_id,dual是作为只选择一条记录。
14)select record_name bulk collect into record_array from table
选择表(table)中的字段(record_name)的记录成批的进入集合变量(record_array)中
15)if record_array.count > 0 then
forall v_index in record_array.first..record_array.last
按照集合(record_array)的顺序来处理集合(record_array)。
16)rownum并不一定是按照顺序排序的,有可能出现不排序的。
17)遍历数据集
FOR x IN (SELECT /*+ ALL_ROWS */ clm.CLM_BLL_NO,
MAX(TO_NUMBER(NVL(cld.CLD_FTR_PDT, '0'))) AS GDF
FROM CorrectionListMaster clm,
CorrectionListDetail cld
WHERE clm.CLM_ID = cld.CLM_ID
AND clm.CLM_CRT_RSN IS NULL
AND clm.CLM_ADT = p_PRT
AND clm.CLM_ST = 0
AND cld.CLD_NM = '改单费'
GROUP BY clm.CLM_BLL_NO)
LOOP
IF x.GDF = 0 THEN
l_SQL := 'UPDATE CorrectionListMaster clm '
|| 'SET clM.CLM_CHK = 0 '
|| 'WHERE clm.CLM_BLL_NO = :BLL_NO '
|| 'AND clm.CLM_ADT = :PRT '
|| 'AND clm.CLM_ST = 0';
EXECUTE IMMEDIATE l_SQL
USING x.CLM_BLL_NO, p_PRT;
l_SQL := 'INSERT INTO CorrectionListErrMsg '
|| 'VALUES(s_CorrectionListErrMsg_ID.NEXTVAL, '
|| '''运单号'' || :BLL_NO || ''更正原因为空,改单费不能为0!'', '
|| ':PRT)';
EXECUTE IMMEDIATE l_SQL
USING x.CLM_BLL_NO, p_PRT;
END IF;
END LOOP;
18).net调用oracle存储过程在返回dataset的时候字段名都是大写了,而javascript是大小写敏感的
19)跟踪sql
select * from v$session where Module='预配自动导入系统.exe'
select * from v$sqlarea where address =
( select sql_address from v$session where sid = 991 );
20) select max(ss.beginday) aa from nqexelog t,shipsailstateh ss,(select shipvoyage,voytype ';
from nq_shipdate_all group by shipvoyage,voytype) mm where rownum=1 and mm.shipvoyage=ss.shipvoyage;
rownum=1是取group by之前的第一条数据,而不是group by之后的第一条.
21)pl/sql看执行计划
explain plan for [你的sql语句]
比如: explain plan for select * from table1
然后 执行:select * from table(DBMS_XPLAN.DISPLAY)就可以看到它的执行计划了。
22)奇怪的SQL
select case when '1'<>' ' then 'ok' else 'no' end select case when '1'<>'' then 'ok' else 'no' end
在sql server中:
这两条语句的返回值都为OK
但是,在oracle中:
select case when '1'<>'' then 'ok' else 'no' end from dual; select case when '1'<>' ' then 'ok' else 'no' end from dual;
前面返回no,后面返回值为ok
解决:
(PL/SQL)null 或者''不能与任何值比较,只能用 is null 或 is not null 判断
23)rank()over(partition by
--加partition by 每个分区内重新从开始排名
SELECT ROW_NUMBER() over(partition by [type] order by col) id,* FROM TB
id col type
1 1 A
2 2 A
3 2 A
4 3 A
5 4 A
6 4 A
1 1 B
2 2 B
3 3 B
4 3 B
5 5 B
24)随机生成几位字符
--取得随机数的视图 CREATE VIEW v_RAND AS SELECT re=STUFF(RAND(),1,2,'') GO --生成随机编号的函数 CREATE FUNCTION f_RANDBH(@BHLen int) RETURNS varchar(50) AS BEGIN DECLARE @r varchar(50) IF NOT(ISNULL(@BHLen,0) BETWEEN 1 AND 50) SET @BHLen=10 SELECT @r=CHAR(65 +(SUBSTRING(re,1,1) +SUBSTRING(re,2,1) +SUBSTRING(re,3,1))%26) +CHAR(65 +(SUBSTRING(re,4,1) +SUBSTRING(re,5,1) +SUBSTRING(re,6,1))%26) FROM v_RAND WHILE LEN(@r)<@BHLen SELECT @r=@r+CHAR(65 +(SUBSTRING(re,1,1) +SUBSTRING(re,2,1) +SUBSTRING(re,3,1))%26) +CHAR(65 +(SUBSTRING(re,4,1) +SUBSTRING(re,5,1) +SUBSTRING(re,6,1))%26) FROM v_RAND RETURN(LEFT(@r,@BHLen)) END GO --调用 SELECT dbo.f_RANDBH(6),dbo.f_RANDBH(8) --结果: UJXIJD PAPGTQUX
24)字符串MD5
select SUBSTRING(sys.fn_VarBinToHexStr(hashbytes('MD5', CONVERT(varchar(100), '12345'))),3,32)