知识小结(PL/SQL)

来源:互联网 发布:apache 报错 编辑:程序博客网 时间:2024/05/01 17:46

 

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

在sql server中:

这两条语句的返回值都为OK

但是,在oracle中:

前面返回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_RANDASSELECT re=STUFF(RAND(),1,2,'')GO--生成随机编号的函数CREATE FUNCTION f_RANDBH(@BHLen int)RETURNS varchar(50)ASBEGIN    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))ENDGO--调用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)