oracle小知识
设置显示执行时间
set timing on;
不显示:off
最简单的块:
begin dbms_output.put_line('Hello,World');
end;
执行结果出现这种情况(执行成功,但是不显示字符串):
这时的解决办法是:在执行块之前,先执行这条语句: set serveroutput on (可以理解为开关,把输出这个功能打开)
这时就成功了。
格式化命令:
设置每行显示的记录长度: SET LINESIZE 300
设置每页显示的记录长度:SET PAGESIZE 30
使用@执行程序
查看所有的数据表: SELECT * FROM tab;
查看当前的用户:show user
切换登陆用户: CONN 用户名/密码 【as sysdba】
对于每一张表,都有其属于的用户,不同的用户想要访问的其它用户的表,需要这张表的完整名称,及用户名.表名称
调用本机的指令,在前面加 HOST ,例如 HOST copy d:\demo.sql d:hello.sql
游标
一.For循环游标
基本的步骤是: 1.定义游标----2.定义游标变量----3.循环游标
--声明游标 CURSOR cursor_Name IS select_sattement
--For循环游标
--()定义游标
--()定义游标变量
--()使用For循环来使用这个游标
declare
cursor c_job --定义游标
is
select emp.empno,emp.ename,emp.job,sal
from emp
where job='MANAGER';
--定义游标变量
c_row c_job%rowtype;
begin
for c_row in c_job loop --循环游标
dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal);
end loop;
end;
二.Fetch游标
--Fetch游标
--使用的时候必须要明确的打开和关闭
declare
cursor c_job
is
select empno,ename,job,sal
from emp
where job!='MANAGER';
c_row c_job%rowtype;
begin
open c_job;
loop
fetch c_job into c_row;
exit when c_job%notfound;
dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal);
end loop;
close c_job;
end;
下面是一个根据日期,更新表中每一行的是周几的游标例子
--游标练习,根据日期,更新每行是周几
DECLARE
CURSOR c_date
IS
select DIM_TIME.DATE_ID,DIM_TIME.YEAR_MONTH
FROM DIM_TIME;
c_row c_date%rowtype;
begin
for c_row in c_date loop
update DIM_TIME set Dim_Time.Week_Name=to_char(to_Date(c_row.DATE_ID,'YYYYMMDD'),'DAY')
where Dim_Time.Date_Id=c_row.Date_ID;
end loop;
end;
下面是一个时间维度表的练习,包括创建表,利用函数 、存储过程 、游标等知识,更新表中其他的字段
--创建时间维度表,粒度精确到天
CREATE TABLE DIM_TIME(
Date_ID char(8) primary key, --时间主键 例如20160703
Year_Month char(6), --年月 201607
Year number, --年 2016
Year_Quarter char(6), --年季度 2016Q3
Year_Half char(6), --年和上下半年 2016H2
Half_Number number, --上下半年 2
Half_Name char(2), --上下半年名称 H2
Quarter_Name char(2), --季度名称 Q3
Quarter_Number number, --季度 3
Month char(3), --月份 JUN
Month_Number number, --
Month_Name varchar2(10), --JUNL
Month_Dedak char(4), --月和上中下旬 07D1
Week char(3), --星期 SUN
Week_Number number, --
Week_Name varchar2(10)); --SUNDAY
--约束
/*限定月份在1至12月之间*/
ALTER TABLE DIM_TIME add constraint MonthCheck
check(Month in('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'));
ALTER TABLE DIM_TIME add constraint MonthNumberCheck
check(Month_Number in (1,2,3,4,5,6,7,8,9,10,11,12));
alter table DIM_TIME
drop constraint MonthCheck;
--华丽的分割线----- /*此处练习存储过程和Merge into 的用法*/
CREATE OR REPLACE PROCEDURE SP_Update_Date
(
uDate_ID char
) IS
BEGIN
-- UPDATE DIM_TIME SET DIM_TIME.DATE_ID=uDate_ID
-- WHERE DIM_TIME.DATE_ID='20160701';
merge into Dim_Time t
using (select * from DIM_TIME) v
on (t.date_ID=v.date_ID)
when matched then
update set
t.year_month=Substr(v.date_id,1,6),
t.year=Substr(v.date_id,1,4),
t.year_quarter=Substr(v.date_id,1,4),
t.year_half=Substr(v.date_id,1,4),
t.half_number=2,
t.half_name='H2',
t.quarter_number=3,
t.quarter_name='Q3',
t.month='Jul',
t.month_number=7,
t.month_name='Jule';
END; --根据日期获取上半年还是下半年的函数
CREATE OR REPLACE FUNCTION getYearHalf(iDate Date)
RETURN number IS
v_month char(2);
half number;
begin
select to_char(iDate,'MM') into v_month from dual;
half :=to_number(v_month) ;
if half>6 then
half:=2;
else
half:=1;
end if;
return half;
end; --游标练习,根据日期,更新每行是周几(块的练习)
DECLARE
CURSOR c_date
IS
select DIM_TIME.DATE_ID,DIM_TIME.YEAR_MONTH
FROM DIM_TIME;
c_row c_date%rowtype;
begin
for c_row in c_date loop
update DIM_TIME set Dim_Time.Week_Name=to_char(to_Date(c_row.DATE_ID,'YYYYMMDD'),'DAY')
where Dim_Time.Date_Id=c_row.Date_ID;
end loop;
end;
--创建空的存储过程
CREATE OR REPLACE PROCEDURE SP_Upadte AS
BEGIN
NULL;
END;
--创建带参数的存储过程
CREATE OR REPLACE PROCEDURE SP_Upadte
( Id in number,
Name out nvarchar2 )
AS
Sex char(2);
Class varchar2(20);
BEGIN
NULL;
END; --创建更新date的存储过程(利用游标)
CREATE OR REPLACE PROCEDURE SP_Update_Date
AS
v_Half number;
v_Quarter number;
v_Month VARCHAR2(10);
v_Dedak number;
v_Week VARCHAR2(10);
CURSOR c_date IS
SELECT DATE_ID,YEAR_MONTH FROM DIM_TIME;
c_row c_date%rowtype;
BEGIN
for c_row in c_date loop --循环游标
v_Month:=to_char(to_Date(c_row.DATE_ID,'YYYYMMDD'),'MONTH'); --月份名称
v_Week:=to_char(to_Date(c_row.DATE_ID,'YYYYMMDD'),'DAY'); --星期名称
v_Dedak:=to_number(Substr(c_row.date_id,7,2));--(日期最后几号)日
if(to_number(to_char(to_Date(c_row.DATE_ID,'YYYYMMDD'),'MM'))<7) then
v_Half:=1; --上半年
else
v_Half:=2; --下半年
end if;
if(to_number(to_char(to_Date(c_row.DATE_ID,'YYYYMMDD'),'MM'))<4) then
v_Quarter:=1; --季度
elsif(to_number(to_char(to_Date(c_row.DATE_ID,'YYYYMMDD'),'MM'))<7) then
v_Quarter:=2;
elsif(to_number(to_char(to_Date(c_row.DATE_ID,'YYYYMMDD'),'MM'))<10) then
v_Quarter:=3;
else
v_Quarter:=4;
end if;
if v_Dedak<11 then
v_Dedak:=1;
elsif v_Dedak<21 then
v_Dedak:=2;
else
v_Dedak:=3;
end if;
--这里也可以直接调用写好的函数
-- v_Half:=getYearHalf(to_Date(c_row.DATE_ID,'YYYYMMDD'));
update DIM_TIME set
year_month =Substr(c_row.date_id,1,6), --根据Date_ID得到year_Month
year=Substr(c_row.date_id,1,4), --得到年份
year_quarter=Substr(c_row.date_id,1,4)||'Q'||v_Quarter, --得到年和季度
year_half=Substr(c_row.date_id,1,4)||'H'||v_Half,
half_number=v_Half,
half_name='H'||v_Half,
quarter_name= 'Q'||v_Quarter,
quarter_number= v_Quarter,
month=Substr(v_Month,1,3),
month_number=to_char(to_Date(c_row.DATE_ID,'YYYYMMDD'),'MM'),
month_name=v_Month,
MONTH_DEDAK=Substr(c_row.date_id,5,2)||'D'||v_Dedak,
week=Substr(v_Week,1,3),
week_number=to_number(to_char(to_Date(c_row.DATE_ID,'YYYYMMDD'),'D')),
week_name=v_Week
where DIM_TIME.DATE_ID=c_row.DATE_ID;
end loop;
END;
Oracle创建自增字段方法(序列:SEQUENCE)
1.最简单的序列,从1开始,自增1
--创建单独的序列
CREATE SEQUENCE DIM_TIME_log_id_seq
increment by 1 start with 1;
2.稍微完整点的序列是如下:
--创建序列
CREATE SEQUENCE SEQ_ID
MINVALUE 1 --最小值
MAXVALUE 9999 --最大值
START WITH 1 --从1开始
INCREMENT BY 1 --增1
CYCLE --到了9999后从头开始循环,此处可以为NOCYCLE
NOCACHE; --没有缓存,此处可以为CACHE 10
两个重要的函数:
- SEQ_ID.CURRVAL 返回SEQ_ID的当前值
- SEQ_ID.NEXTVAL 返回SEQ_ID的下一个值(增加后的至)
Oracle返回一个时间段
比如从2013年1月1日到2014年1月1日的所有日期
SELECT DATE'2013-1-1'+(ROWNUM-1) FROM dual
CONNECT BY rownum < (date'2014-1-1'-date'2013-1-1');
还有从某个日期往后多少天
SELECT to_date('2013-1-1','YYYY-MM-DD')+(rownum-1) from dual
CONNECT BY rownum<=10;
SQL设置显示执行时间
SET TIMING ON ; //不显示即为off;
SET TIMING ON;
ORACLE实现分页的功能:
SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM<=10) WHERE RN>=5 ;
oracle小知识的更多相关文章
- Oracle小知识_长期总结
更新时间:2018年7月16日 11:22:28 一. 系统 1. 打开防火墙后 Oracle 无法链接 新建1521端口规则. 二.知识 A. 序列 1. nextval ------------- ...
- oracle 小知识
oracle: 数值随机的函数是 dbms_random.value(最大值,最小值) 用法是select dbms_random(3,0) from dual; oracle: 获取前100条 ...
- oracle小知识总结
1,表列的五种约束 not null, unique,primary key, foreign key, check 2,权限分配 grant 权限 on 表 to 用户 3,表和视图的区别 视图是一 ...
- Oracle常用知识小总结
永不放弃,一切皆有可能!!! 只为成功找方法,不为失败找借口! Oracle常用知识小总结 1. 创建自增主键 对于习惯了SQL SERVER的图形化界面操作的SQLer,很长一段时间不用oracle ...
- 简述Python入门小知识
如今的Python开发工程师很受企业和朋友们的青睐,现在学习Python开发的小伙伴也很多,本篇文章就和大家探讨一下Python入门小知识都有哪些. 扣丁学堂简述Python入门小知识Python培训 ...
- Oracle基础知识汇总一
Oracle基础知识 以下内容为本人的学习笔记,如需要转载,请声明原文链接 https://www.cnblogs.com/lyh1024/p/16720759.html oracle工具: SQ ...
- Oracle 数据库知识汇总篇
Oracle 数据库知识汇总篇(更新中..) 1.安装部署篇 2.管理维护篇 3.数据迁移篇 4.故障处理篇 5.性能调优篇 6.SQL PL/SQL篇 7.考试认证篇 8.原理体系篇 9.架构设计篇 ...
- 蓝牙Bluetooth技术小知识
蓝牙Bluetooth技术以及广泛的应用于各种设备,并将继续在物联网IoT领域担任重要角色.下面搜集整理了一些关于蓝牙技术的小知识,以备参考. 蓝牙Bluetooth技术始创于1994年,其名字来源于 ...
- HTML+CSS中的一些小知识
今天分享一些HTML.CSS的小知识,希望能够对大家有所帮助! 1.解决网页乱码的问题:最重要的是要保证各个环节的字符编码一致! (1)编辑器的编辑环境的字符集(默认字符集):Crtl+U 常见的编码 ...
随机推荐
- c++ 图解快速排序算法
第一.算法描述 快速排序由C. A. R. Hoare在1962年提出,该算法是目前实践中使用最频繁,实用高效的最好排序算法, 快速排序算法是采用分治思想的算法,算法分三个步骤 从数组中抽出一个元素作 ...
- Py修行路 Matplotlib 绘图及可视化模块
Matplotlib是一个强大的Python绘图和数据可视化的工具包. 安装方法:pip install matplotlib 引用方法:import matplotlib.pyplot as plt ...
- Oracle 设置主键自增长__Oracle
转自:https://yq.aliyun.com/ziliao/258074 如果想在Oracle数据库里实现数据表主键自增,我们似乎没有办法像MySql般直接定义列的属性来实现.不过对于这个数据库的 ...
- oracle 基础 执行sql文件
Oracle执行外部文件: c:>sqlplus user/pwd@db sql>@new.sql 执行多个sql文件: 1.把所有的文件都放在同一个目录下,然后在命令行里执行命令: ...
- 2016上海浦东汽车展览会C+罩杯 车模名单
只能帮你们到这了
- html乱码原因与网页乱码解决方法
造成html网页乱码原因主要是html源代码内中文字内容与html编码不同造成.但无论是哪种情况造成乱码在网页开始时候都需要设置网页编码. charset编码设置 html网页乱码效果截图 一.乱码造 ...
- MyBatis总结七:动态sql和sql片段
开发中,sql拼接很常见,所以说一下动态sql: 1 if 2 chose,when,otherwise 3 where,set 4 foreach 用法解析(现有一张users表 内有id user ...
- 用fontcreator创建了一个半成品的字体
下效果,哈哈. 为啥说半成品呢?因为只制作了0到9这几个字符,其他的字母.汉字.符号啥的都没有制作,唯一感觉就是字体设计是一个非常有设计感的活儿,而且需要付出很多的精力,尤其是汉字字体,常见的有6k多 ...
- 使用IDEA编译spark 1.5并运行example的代码
操作系统:windows 10 IDEA : IDEA 14.1.4 1:使用IDEA导入spark 1.5的源码,注意maven配置为自动导入 2:在maven窗口下的profiles中勾选hado ...
- Python--socket和threading编程
网络编程基础(一) TCP/IP协议 OSI/RM协议 特点:独立于计算机硬件和操作系统,统一分配网络地址,提供可靠服务,隔离了物理网络的硬件差异 协议分层(百度):网络接口层:IEE802.3(以太 ...