数据库(Oracle开发)
May 20

--begin by itlife365
如何读取oracle的大字段数据clob
首先,CLOB里存的是2进制
判定长度DBMS_LOB.GETLENGTH(col1)
获取文本DBMS_LOB.SUBSTR(col1,n,pos)
DBMS_LOB.SUBSTR(col1,10,1)表示从第1个字节开始取出10个字节
DBMS_LOB.SUBSTR(CLOB_VAR,32767)表示截取CLOB变量保存的全部数据
DBMS_LOB.FILECLOSE(IMG_BFILE)关闭文件
使用dbms_lob.substr时只能转化一部分,再多的时候就提示缓存不够。
dbms_lob.substr(test.clob_content,3500,1)
select dbms_lob.substr(student.name,3500,1) from student;

clob转化为字符串,SELECT  UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(col1,10,1))  FROM   tab1;
如果clob中包含空格则不能使用。

将clob类型转化成字符串
create  or  replace  function   getclob(
         table_name            in   varchar2,
         field_id              in   varchar2,
         field_name            in   varchar2,
         v_id                  in   number,
         v_pos                 in  number)  return   varchar2
is
         lobloc                clob;
         buffer                varchar2(32767);
         amount                number  :=   2000;
         offset                number  :=   1;
         query_str             varchar2(1000);
begin
     query_str   :='select   '||field_name||'  from   '||table_name||'  where   '||field_id||'=  :id   ';
     EXECUTE  IMMEDIATE  query_str  INTO  lobloc  USING   v_id;
     offset:=offset+(v_pos-1)*2000;
     dbms_lob.read(lobloc,amount,offset,buffer);
              return   buffer;
exception
       when  no_data_found   then
              return   buffer;
end;
--end by itlife365

Tags: ,
Aug 29
from itlife365 begin
学习ROW_NUMBER() OVER的时候
select *,row_number() over(order by productname) as rownumber from products --上面是正确的,然后我想的是从这个结果集在取10-20之间的数据,然后我书写如下:
 select *,row_number() over(order by productname) as rownumber from 
products where rownumber between 10 and 20 --这样报错.
然后又找资料看,找不个例子.然后我照那个例子改进
 select* from (select *,row_number() over(order by productname) as rownumber from products) as temp where rownumber between 10 and 20 --这样就对了.

我想问,为什么非要在用子查询才能指定返回的范围呢?我第一种方法直接在取出来的结果集里取为什么不行呢?

因为你直接where的时候,还不能用别名。。。 order by 就可以用。 from itlife365

,这个select语句在这里是先执行from再执行where最后select..所以当执行到where的时候from出来的结果集里并没有rownumber这个东西

from itlife365 end---

Mar 16

Oracle行转列函数WMSYS.WM_CONCAT的使用实例demo
select *  from itlife365_course a  where name= '张三';
name   课程  score
张三   数学   99
张三   语文   89
张三   英语   93

上面的场景可用WMSYS.WM_CONCAT(a.name)把二行中的[课程]字段的值用","连接起来

如:
select name, to_char(WMSYS.WM_CONCAT(a.课程))
  from itlife365_course a
 where name= '张三'
 group by a.name

注意:因为用WMSYS.WM_CONCAT转出的类型是clob的,所以我这用了to_char转了一下。
使用wmsys.wm_concat多列合成一列遇到问题
ORA-22813: 操作数值超出系统的限制
官方文档解释是总长度超过30k
请使用其他方法替代。

Nov 16

 1、查询要导出的目录在哪里:select * from dba_directories;
/archivelog/itlife365dbbak/

2、使用expdp 命令导出,主要include=job 只是导出job ,其他的没有进行导出。目前我测试是这样的结果。

itlife365$ expdp itlife365/com directory=EXPDIR dumpfile=itlife365_job.dp include=job 

Export: Release 11.1.0.7.0 - 64bit Production on Friday, 15 November, 2013 17:48:19

Copyright (c) 2003, 2007, Oracle.  All rights reserved.

Connected to: Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Starting "ITLIFE365"."SYS_EXPORT_SCHEMA_02":  itlife365/******** directory=EXPDIR dumpfile=itlife365_job.dp include=job
Estimate in progress using BLOCKS method...
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
Total estimation using BLOCKS method: 0 KB
Processing object type SCHEMA_EXPORT/JOB
Master table "ITLIFE365"."SYS_EXPORT_SCHEMA_02" successfully loaded/unloaded
******************************************************************************
Dump file set for ITLIFE365.SYS_EXPORT_SCHEMA_02 is:
  /archivelog/itlife365dbbak/itlife365_job.dp
Job "ITLIFE365"."SYS_EXPORT_SCHEMA_02" successfully completed at 17:48:42

Tags:
Dec 29
在ORACLE的存储过程中如何判断插入或更新语句影响的记录条数
how_to_get_oracle_procedures_dml_update_or_insert_row
具体例子如下:
create or replace procedure pro_test_insert is
--declare
i_count integer;
begin
  --insert into  scott.dept values (70,'itlife365.com','xiamen');
  execute immediate 'update scott.dept set dname=''itlife365.com'' where deptno=''60''';
  --update scott.dept set dname='itlife365.com' where deptno='60';
  dbms_output.put_line('影响行数:'||to_char(sql%rowcount)); --直接打印改变行数的参数sql%rowcount 
  
  commit;
end pro_test_insert;

执行结果
Connected to Oracle Database 11g Enterprise Edition Release 11.1.0.6.0
Connected as SYS
 
SQL> set time on
12:30:52 SQL> set serveroutput on
12:31:00 SQL> exec pro_test_insert;
影响行数:1
PL/SQL procedure successfully completed
12:31:55 SQL>

关于sql%rowcount的用法参考
http://itlife365.com/blog/post/oracle_cursor_sql_found_notfound_rowcount.php
分页: 1/4 第一页 1 2 3 4 下页 最后页