常见问题小结

--sqlplus打开输出
set serveroutput on


--随机生成字母和数字
begin
for i in 1..10 loop
DBMS_OUTPUT.PUT_LINE(sys_guid());
end loop;
end;


--expdp导出时排除某些表
EXCLUDE=TABLE:"IN ('TABLENAME1', 'TABLENAME2')"


--查看scott用户下各个表的数据量
declare
cnt number;
sqlstr varchar2(4000);
v_tablename varchar2(30);
cursor c_tablename is select table_name from all_tables where owner='SCOTT';
begin
open c_tablename;
loop
fetch c_tablename into v_tablename;
exit when c_tablename%notfound;
sqlstr:='select count(*) from '||v_tablename;
execute immediate sqlstr into cnt;
dbms_output.put_line('table_name: '||v_tablename||';  count: '||cnt);
end loop;
close c_tablename;
end;

 

 

 

--创建表空间
create tablespace test
logging
datafile 'D:/oracle/oradata/ypcost/test01.dbf'
size 10M
autoextend on
next 1M maxsize 20M
extent management local

 

--删除表空间 包括所有的数据对象和数据文件
drop tablespace tablesapcename including contents and datafiles;

--增加数据文件
alter tablespace tablespacename add
 datafile 'D:/oracle/oradata/ypcost/test01.dbf'
 size 10M
 autoextend on
 next 1M maxsize 20M

--修改表空间为自动增长
alter database datafile 'D:/oracle/oradata/aa/test01.dbf' autoextend on;


--各个表空间的使用率、

select Total.Tname "表空间名称",
       Total.Total_Size "表空间大小",
       Total.Total_Size - Used.free_size as "已使用大小",
       Used.Free_size as 表空间剩余大小,
       Round((Total.Total_Size - Used.free_size) / Total.Total_Size,4)* 100 || '%' as 表空间使用率
from
 (
 -- 表空间数据文件的大小
 select tablespace_name as TName,
        round(sum(user_bytes)/(1024*1024),1) as Total_size
 from dba_data_files
 group by tablespace_name
 )  Total,
(
 -- 表空间剩余的大小
select tablespace_name as TName,
      round(sum(bytes)/(1024*1024),1) as Free_size
from dba_free_space
group by tablespace_name
) Used
where Total.TName = Used.TName(+)

 

 

 


--oracle分页的存储过程
create or replace procedure fenye_pro(
v_tablename varchar2, --表名
v_ordercol varchar2,--要排序的字段 如果有多个用,隔开
v_pagesize  int,  --一页显示的记录数
v_pagenow int,--要显示第几页
v_pagerows out number,--总页数
v_counts   out number,--总记录数
recode_cursor out sys_refcursor,
v_order varchar2 default 'asc') --降序还是升序 默认是升序
as
v_begin number:=1+(v_pagenow-1)*v_pagesize;
v_end number:=v_pagenow*v_pagesize;
v_sqlstr varchar2(4000);
v_flag number:=0;
begin
select count(*) into v_flag from user_tables where table_name=upper(v_tablename);
if v_flag=0 then
dbms_output.put_line('输入的表'||v_tablename||'不存在');
else
v_sqlstr:='select count(*) from '||v_tablename;
execute immediate v_sqlstr into v_counts;
v_pagerows:=ceil(v_counts/v_pagesize);
v_sqlstr:='select * from (select rownum rn,t.* from (select * from '||v_tablename||
           ' order by '||v_ordercol||' '||v_order||') t where rownum<='||v_end||') where rn>='||v_begin;
open recode_cursor for v_sqlstr;
--dbms_output.put_line(v_sqlstr);
end if;
exception
when others then
dbms_output.put_line('参数输入格式或类型不符');
end;

 

--调用分页过程

var cnt number;
var pagerow number;
var r_c refcursor;
exec fenye_pro('emp','sal desc,hiredate',4,1,:cnt,:pagerow,:r_c); 

print r_c;


      RN      EMPNO ENAME      JOB              MGR HIREDATE          SAL       COMM     DEPTNO
-------- ---------- ---------- --------- ---------- ---------- ---------- ---------- ----------
       1       7777 aspen      SALESMAN                                                      10
       2       7839 KING       PRESIDENT            1981-11-17       5000                    10
       3       7902 FORD       ANALYST         7566 1981-12-03       3000        900         20
       4       7788 SCOTT      ANALYST         7566 1987-04-19       3000        900         20
 

 

--修改序列
Alter sequence seq
[increment by n]
[{maxcalue n/nomaxalue}]
[{minvalue n/nominvalue}]
[{cycle/nocycle}]
[{cache n/nocache}];


--merge into的使用
merge into fzq1  aa     --fzq1表是需要更新的表
using fzq bb            -- 关联表
on (aa.id=bb.id)        --关联条件
when matched then       --匹配关联条件,作更新处理
update set
aa.chengji=bb.chengji+1,  --不能更新on中包含的字段
aa.name=bb.name         --此处只是说明可以同时更新多个字段。
when not matched then    --不匹配关联条件,作插入处理。如果只是作更新,下面的语句可以省略。
insert values( bb.id, bb.name, bb.sex,bb.kecheng,bb.chengji);


--修改连接数
show parameter processes;
show parameter sessions;
alter system set processes=300 scope=spfile;
alter system set sessions=300 scope=spfile;
shutdown immediate;--修改完后要重启数据库
startup

 

 

 


--数字金额转化为中文大写
CREATE OR REPLACE FUNCTION money_to_chinese (money IN number)  
   RETURN VARCHAR2  
IS 
   c_money    VARCHAR2 (12);  
   m_string   VARCHAR2 (60) := '分角圆拾佰仟万拾佰仟亿';  
   n_string   VARCHAR2 (40) := '壹贰叁肆伍陆柒捌玖';  
   b_string   VARCHAR2 (80);  
   n          CHAR;  
   len        NUMBER (3);  
   i          NUMBER (3);  
   tmp        NUMBER (12);  
   is_zero    BOOLEAN;        --标记当前的前一个数值是否为0
   z_count    NUMBER (3);     --万位、各位和最后尾数前连续0的个数
   l_money    NUMBER;  
   l_sign     VARCHAR2 (10);  
BEGIN 
   l_money := ABS (money);   --得到传入阿拉伯数值的绝对值
 
   --判断传入的数值是正还是负,如果是负则加上'负'
   IF money < 0  
   THEN 
      l_sign := '负';  
   ELSE 
      l_sign := '';  
   END IF;  
 
   tmp := ROUND (l_money, 2) * 100;  
   c_money := TRIM (TO_CHAR (tmp, '999999999999'));  
   len := LENGTH (c_money);  
   is_zero := TRUE;  
   z_count := 0;     
   i := 0;  
 
   WHILE i < len  
   LOOP  
      i := i + 1;  
      n := SUBSTR (c_money,  
                   i,  
                   1  
                  );  
 
      IF n = '0' 
      THEN 
         IF len - i = 6 OR len - i = 2 OR len = i   --判断是否到万位、各位和最后位
         THEN 
            IF is_zero   --如果前一位为0把拼接成的 '零' 删除掉
            THEN 
               b_string := SUBSTR (b_string,  
                                   1,  
                                   LENGTH (b_string) - 1  
                                  );  
               is_zero := FALSE;  
            END IF;  
 
            IF len - i = 6  
            THEN 
               b_string := b_string || '万';  
            END IF;  
 
            IF len - i = 2  
            THEN 
               b_string := b_string || '圆';  
            END IF;  
 
            IF len = i  
            THEN 
               b_string := b_string || '整';  
            END IF;  
 
            z_count := 0;  
         ELSE 
            IF z_count = 0  
            THEN 
               b_string := b_string || '零';  
               is_zero := TRUE;  
            END IF;  
 
            z_count := z_count + 1;  
         END IF;  
      ELSE 
         b_string :=  
               b_string  
            || SUBSTR (n_string,  
                       TO_NUMBER (n),  
                       1  
                      )  
            || SUBSTR (m_string,  
                       len - i + 1,  
                       1  
                      );  
         z_count := 0;  
         is_zero := FALSE;  
      END IF;  
   END LOOP;  
 
   b_string := l_sign || b_string;  
   RETURN b_string;  
EXCEPTION  
   WHEN OTHERS  
   THEN 
      RETURN (SQLERRM);  
END; 

 

 

 

 

--oracle10g给blob字段插入值
create table t_blob(stuname varchar2(20),dblob blob);
scott@YPCOST> ed
已写入 file afiedt.buf

  1* insert into t_blob values ('tom',utl_raw.cast_to_raw('tom is a good boy!'))
scott@YPCOST> /

已创建 1 行。

scott@YPCOST> select stuname,utl_raw.cast_to_varchar2(dblob) from t_blob;

STUNAME
--------------------
UTL_RAW.CAST_TO_VARCHAR2(DBLOB)
----------------------------------------------------------------------------------------------------
tom
tom is a good boy!


scott@YPCOST> update t_blob set dblob=utl_raw.cast_to_raw('tom is not a good boy!') where stuname='t
om';

已更新 1 行。

scott@YPCOST> commit;

提交完成。

scott@YPCOST> select stuname,utl_raw.cast_to_varchar2(dblob) from t_blob;

STUNAME
--------------------
UTL_RAW.CAST_TO_VARCHAR2(DBLOB)
----------------------------------------------------------------------------------------------------
tom
tom is not a good boy!


--修改blob字段的值

Declare
b_c Blob;
Begin
  select dblob Into b_c From t_blob For Update;
  dbms_lob.append(b_c,utl_raw.cast_to_raw('and you?'));
Update t_blob
set dblob = b_c;
End;

commit;

select utl_raw.cast_to_varchar2(dblob) from t_blob;

UTL_RAW.CAST_TO_VARCHAR2(DBLOB)
---------------------------------------------------------------------
tom is a good boy!and you?

 

 

 

 

--十进制转为二进制
create or replace function number_2_bit(n_num number) return varchar is
  v_rtn varchar(2000);
  v_n1 number;
  v_n2 number;
  v_num number;
  v_sign char(1);
begin
  v_num:=abs(n_num);
  v_n1:= v_num;
  loop
    v_n2 := mod(v_n1, 2);
    v_n1 := trunc(v_n1 / 2);
    v_rtn := to_char(v_n2) || v_rtn;
    exit when v_n1 = 0;
  end loop;
  return sign(n_num)*v_rtn;
exception
   when others then
   return(sqlerrm);
end;

--删除表中重复数据
delete test a where a.rowid=(select max(rowid) from test b where a.id=b.id and a.num=b.num);

--上下行的差

with tb as(
select 2001 a,1 b,2 c from dual union all
select 2002, 8, 4 from dual union all
select 2003, 6, 6 from dual union all
select 2004, 9, 8 from dual)
select a,b,c,lead(c) over(order by a),b-lead(c) over(order by a)
from tb

 

--如何实现行列转换
create table course
(
student_name  varchar2(10),
subject       varchar2(10),
grade         number
);

insert into course values('张三','语文',80);
insert into course values('张三','数学',70);
insert into course values('张三','英语',62);
insert into course values('李四','语文',90);
insert into course values('李四','数学',80);
insert into course values('李四','英语',100);

select * from course;
STUDENT_NAME SUBJECT         GRADE
------------ ---------- ----------
张三         语文               80
张三         数学               70
张三         英语               62
李四         语文               90
李四         数学               80
李四         英语              100

--转换语句如下
select student_name "姓名",max(decode(subject,'语文', grade,null)) "语文",
max(decode(subject,'数学', grade,null)) "数学",
max(decode(subject,'英语', grade,null)) "英语"
from course
group by student_name;
--转换为
姓名             语文       数学       英语
---------- ---------- ---------- ----------
李四               90         80        100
张三               80         70         62

 

 

--自增长
--1.先创建序列
scott@YPCOST> create sequence orderNo_seq start with 100 increment by 1 maxvalue 999;

序列已创建。

scott@YPCOST> create table test(id number,name varchar2(20));

表已创建。

--2、再加触发器
scott@YPCOST> ed
已写入 file afiedt.buf

create or replace trigger insert_tri
before insert on test
for each row
declare
begin
 select orderNo_seq.nextval into :new.id from dual;
end;
scott@YPCOST> /

触发器已创建

scott@YPCOST> insert into test(name) values('tom');

已创建 1 行。

scott@YPCOST> commit;

提交完成。

scott@YPCOST> select * from test;

ID                   NAME
-------------------- --------------------
                 100 tom       

 

 

 

 

--查询字段中包含_(%)的雇员名 (escape 'a'表示a为转义字符)
select * from emp where ename like '%a_%' escape 'a';
select * from emp where ename like '%a%%' escape 'a';

select * from emp where ename like '%%'
相当于
select * from emp where ename is not null

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值