oracle存储过程并且
‘壹’ oracle高手快来看看,我想写一个输出结果集的存储过程并执行
create or replace procere p_selTabSpace(v1
dba_data_files.tablespace_name%type)
as
var1 dba_data_files.tablespace_name%type;
var2 number;
var3 number;
var4 number;
begin
select a.a1 "tabSpaceName",b.b2/1024/1024 "tabSpaceSize",round((b.b2 -
a.a2) / 1024 / 1024, 2) "tabSpaceUsed",substr((b.b2 - a.a2) / b.b2, 1,
7) "tabSpaceVused" into var1,var2,
var3,var4
from
(select tablespace_name a1, sum(nvl(bytes, 0)) a2
from dba_free_space
group by tablespace_name) a,
(select tablespace_name b1, sum(bytes) b2
from dba_data_files
group by tablespace_name) b,
(select tablespace_name c1, contents c2, extent_management c3
from dba_tablespaces) c
where a.a1=UPPER(v1) and a.a1 = b.b1 and c.c1 = b.b1;
DBMS_OUTPUT.PUT_LINE('tabSpaceName is'||UPPER(VAR1)||'
'||'tabSpaceSize'||var2||' '||'tabSpaceUsed'||var3||'
'||'tabSpaceVused'||var4);
END;
--------------------------------TEST-------------------------
EXECUTE p_selTabSpace('system');
你想得到结果集是用来存放单行的数据还是存放多行的数据,如果是后者的话,单纯的select...into...这种方法是实现不了的,原因是你不可以将一列的多个结果都付给同一个变量,这也就是使用select...into...这种方式的一种局限,如果想用来存放多行结果就要向楼上说的那样使用游标或者是复合数据类型才可以。
‘贰’ Oracle中如何写带条件的查询存储过程并返回查询结果集
create or replace procere p_cnt(
p_time in varchar2,---查询的条件
p_cur out SYS_REFCURSOR)---游标返回
IS
v_sql varchar2(1000) :='';
v_date varchar2(20);
BEGIN
v_date := replace(p_time, '-', '');---时间的格式转换
v_sql := 'select * from dapartment d where d.d_time ='''|| v_date||'''';
END;
OPEN p_cur FOR v_sql;
END p_cnt;
‘叁’ oracle存储过程并且怎么写
存储过程(procere):是一个命名了的语句块,可以有0个或多个参数
语法:
create or replace procere HelloWorld
as
begin
dbms_output.put_line('HelloWorld');
end;
调用存储过程
* 命令调用 exec helloworld
* 语句块调用
begin
helloworld;
end;
/
DELETE:
create or replace procere del_emp01
is
begin
delete from emp01 where empno=7369;
end;
exec del_emp01;
create or replace procere 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 procere 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 procere 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 procere 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 procere 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 procere 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 procere 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存储过程创建临时表并插入数据。
存储过程创建表后,在编译阶段数据库中并没有该表。这时向表中插入数据,会提示表不存在。所以,插入语句要赋值到变量里,通过e来执行。
‘伍’ ORACLE存储过程创建临时表并插入数据。
你这个语法是不对的
你create
table
as
select
的时候是不能指定列的数据类型,因为你是根据查询结果创建一个表,列名和数据类型都是由查询结果定的,或者你可以
create
table
然后
insert
into
table
select
...
改成下面这样
create
or
replace
procere
test_proc
as
begin
execute
immediate
'
create
global
temporary
table
T_AB
as
select
A.id_,
A.name_,
B.num_
from
T_A
A,
T_B
B
where
A.id_=B.id_';
end;
‘陆’ oracle中的存储过程,有什么作用,以及怎么在代码中使用
定义:存储过程(Stored Procere )是一组为了完成特定功能的SQL 语句
集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数
(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要
对象,任何一个设计良好的数据库应用程序都应该用到存储过程。
存储过程是由流控制和SQL 语句书写的过程,这个过程经编译和优化后
存储在数据库服务器中,应用程序使用时只要调用即可。在ORACLE 中,
若干个有联系的过程可以组合在一起构成程序包。
优点:存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2.当对数据库进行复杂操作时(如对多个表进行Update、Insert、Query、Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
3.存储过程可以重复使用,可减少数据库开发人员的工作量。
4.安全性高,可设定只有某用户才具有对指定存储过程的使用权。
proc = connection.prepareCall("{ call SIM_MEDICARE.P_Isinblacklist(?,?,?,?,?) }");
proc.setString(1, “”);设置传入参数
proc.registerOutParameter(4, Types.VARCHAR);注册传出参数
proc.execute();执行过程
proc.getString(4)获取结果