重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
存储过程(procedure):是一个命名了的语句块,可以有0个或多个参数
业务包括:企业网站建设、手机网站制作设计、商城网站定制开发、网站营销推广等服务,并且涵盖国际域名空间、虚拟主机、云服务器、等互联网基础服务;成都创新互联公司联建站以互联网的创新理念,成熟完善的建站体系,开拓进取的精神,专业的解决方案和顾问咨询服务,帮助客户在互联网时代提升形象、把握商机、实现价值,提高企业的核心竞争力。
语法:
create or replace procedure HelloWorld
as
begin
dbms_output.put_line('HelloWorld');
end;
调用存储过程
* 命令调用 exec helloworld
* 语句块调用
begin
helloworld;
end;
/
DELETE:
create or replace procedure del_emp01
is
begin
delete from emp01 where empno=7369;
end;
exec del_emp01;
create or replace procedure del_emp01(v_empno in emp01.empno%type)
is
begin
delete from emp01 wherer empno=v_empno;
end;
exec del_emp01(7521);
INSERT
create or replace procedure ins_emp01
(v_empno emp01.empno%type,v_ename emp01.ename%type)
as
begin
insert into emp01(empno,ename) values(v_empno,v_ename);
end;
exec ins_emp01(1000,'李四');
UPDATE
create or replace procedure upd_emp01
(v_empno emp01.empno%type,v_ename emp01.ename%type)
as
begin
update emp01 set ename=v_ename where empno=v_empno;
end;
exec upd_emp01(1000,'张三');
SELECT
create or replace procedure sel_emp01
(v_empno emp01.empno%type,v_emp01_data out emp01%rowtype)
as
begin
select * into v_emp01_data from emp where empno=v_empno;
end;
带有输出参数的存储过程不能使用命令直接调用
只能由语句块或程序调用(JAVA) ****************************************************************
declare
v_emp_data emp01%rowtype;
begin
sel_emp01(7499,v_emp_data);
dbms_output.put_line(v_emp_data.ename||' '||v_emp_data.sal);
end;
调用:
declare
v_emp_data emp01%rowtype;
begin
sel_emp01(7499,v_emp_data);
dbms_output.put_line(v_emp_data.ename||' '||v_emp_data.sal);
end;
使用scott用户登录
统计某个部门的员工的工资总和,员工的人数,平均工资,创建存储过程
create or replace procedure deptcount
(v_deptno emp.deptno%type,v_sal_sum out number,v_recordes out number,v_avg_sal out number,errorMsg out varchar2)
is
begin
select sum(sal) into v_sal_sum from emp group by deptno having deptno=v_deptno;
select count(*) into v_recordes from emp group by deptno having deptno=v_deptno;
select avg(sal) into v_avg_sal from emp group by deptno having deptno=v_deptno;
exception
when no_data_found then
errorMsg:='没有该部门';
end;
调用:
declare
v_sal_sum number;
v_recordes number;
v_avg_sal number(8,2);
v_errormsg varchar2(20);
begin
deptcount(90,v_sal_sum,v_recordes,v_avg_sal,v_errormsg);
dbms_output.put_line(v_sal_sum||' '||v_recordes||' '||v_avg_sal);
dbms_output.put_line(v_errormsg);
end;
//输出参数
create or replace procedure my_pro(v_num in number,v_result out number)
is
v_temp number;
begin
v_temp:=0;
for i in 1..v_num
loop
v_temp:=v_temp+i;
end loop;
v_result:=v_temp;
end;
declare
v_recieve number;
begin
my_pro(100,v_recieve);
dbms_output.put_line(v_recieve);
end;
//既是输入参数又是输出参数
create or replace procedure my_pro1(v_i in out number)
is
v_j number;
begin
v_j:=30;
v_i:=v_i*v_j;
end;
declare
v_t number;
begin
v_t:=20;
my_pro1(v_t);
dbms_output.put_line(v_t);
end;
oracle创建序列基本语法:
CREATE SEQUENCE sequence //创建序列名称
[INCREMENT BY n] //递增的序列值是n 如果n是正数就递增,如果是负数就递减 默认是1
[START WITH n] //开始的值,递增默认是minvalue 递减是maxvalue
[{MAXVALUE n | NOMAXVALUE}] //最大值
[{MINVALUE n | NOMINVALUE}] //最小值
[{CYCLE | NOCYCLE}] //循环/不循环
[{CACHE n | NOCACHE}];//分配并存入到内存中
select i.姓名,i.成绩, (select count(distinct o.成绩) from info o where i.成绩o.成绩 and i.姓名o.姓名)+1 as '排名' from info i
表名要做相应的修改!!!
我这个是在SQL SERVER2005上运行的,我想也不需要改动什么也可以在oracle上运行出来。 这样做的话不需要动不动就去修改原表的结构或者数据。 大致的思路是先把原表中的姓名和成绩这两列的原始数据查出来,然后通过一个子查询来统计出比我当前要查的这个人的成绩要大的人数有多少来作为排名这一列的数据。
如果确实想将排名的数据添加到表里面的话(在SQL SERVER2005下可以这样写,你试一下能否在你的oracle上面用)
update info set 排名=T.排名 from info i,(select i.姓名, (select count(distinct o.成绩) from info o where i.成绩o.成绩 and i.姓名o.姓名)+1 as '排名' from info i) T where i.姓名=T.姓名
-----------------------------------------------------------------------------------------------------------------------
以上测试均是在SQL SERVER2005上测试,且均成功。我后来在oracle上运行了一遍,结果发现确实存在问题。
下面是经过修改之后的sql语句,经过测试是可以成功运行的。
单纯将排名查出来,并不正真改变数据:
select i.姓名,i.成绩, (select count(distinct o.成绩) from info o where i.成绩o.成绩 and i.姓名o.姓名)+1 as "排名" from info i
通过update语句将排名这一列的数据加上:
update info i set i.排名=(select count(distinct o.成绩)+1 from info o where i.成绩o.成绩 and i.姓名o.姓名)
select /*+ parallel(a,4)*/ col1 from tab;
表示查询表tab的字段col1,4个进程并行查询,前提是必须要有4个CPU才有效,否则性能会比不加并发还低
你把批量执行sql语句和存储过程,否放入一个大的存储过程里,然后在这个大的存储过程中提交事务,就所有的都会纳入事务管理当中。
1.create user username identified by password;//建用户名和密码oracle ,oracle
2.grant connect,resource,dba to username;//授权 grant connect,resource,dba,sysdba to username;
3.connect username/password//进入。
4.select table_name,column_name from user_tab_columns where table_name='TABLE_NAME';//查询表中的表名,字段名等等。 最后的table_name要大写。
5. 如何执行脚本SQL文件? SQL@PATH/filename.sql;
7.查询用户下的所有表 select distinct table_name from user_tab_columns; ===仅显示一列表名。
8.如何搜索出前N条记录?
select * from tablename where rownumn;--足矣。(--是注释用的标记)
9.查找用户下的所有表:select * from tab; --查询该用户下的所有表及视图(显示表名tname, 类型tabname和clusterid)
2、显示当前连接用户
SQL show user –不能用在sql窗口 只能用在command命令窗口。
3、查看系统拥有哪些用户
SQL select * from all_users;
4、新建用户并授权
SQL create user a identified by a;(默认建在SYSTEM表空间下)
SQL grant connect,resource to a;
5、连接到新用户
SQL conn a/a –或者是connect a/a
6、查询当前用户下所有对象
SQL select * from tab; --table或是view
7、建立第一个表
SQL create table a(a number);
8、查询表结构
SQL desc a
9、插入新记录
SQL insert into a values(1);
10、查询记录
SQL select * from a;
11、更改记录
SQL update a set a=2;
12、删除记录
SQL delete from a;
13、回滚
SQL roll;
SQL rollback;
14、提交
SQL commit;
select * from
(select t.*,dense_rank() over (order by cardkind) rank from cardkind t)
where rank = 2;
46. 如何在字符串里加回车?
select 'Welcome to visit'||chr(10)||'' from dual ; --‘||chr(10)||’作为换行符
53. 如何使select语句使查询结果自动生成序号?
select rownum COL from table; --主要就是oracle中引入了rownum
54. 如何知道数据裤中某个表所在的tablespace?
select tablespace_name from user_tables where table_name='TEST'; --table_name名称要大写。
select * from user_tables中有个字段TABLESPACE_NAME,(oracle);
select * from dba_segments where …;
55. 怎么可以快速做一个和原表一样的备份表?
create table new_table as (select * from old_table);
59. 请问如何修改一张表的主键?
alter table aaa drop constraint aaa_key ;
alter table aaa add constraint aaa_key primary key(a1,b1) ;
60. 改变数据文件的大小?
用 ALTER DATABASE .... DATAFILE .... ;
手工改变数据文件的大小,对于原来的 数据文件有没有损害。
61. 怎样查看ORACLE中有哪些程序在运行之中?
查看v$session表
62. 怎么可以看到数据库有多少个tablespace?
select * from dba_tablespaces;