如果各位以前从来没有写存储过程,可得仔细了,因为在进行存储过程编写的时候,新手很容易出错,非常容易。
执行存储过程各个oracle客户端是不是样的
可能你在网上看到的是调用exec,但是你再怎以调用你都执行不了,原因何在,因为exec是pl/sql develop里面的一个程序,而你当前使用oracl客户端不是pl/sql,如果你再怎么也执行不了。
我所使用的工具是dbVisualize,在使用这个工具时,我遇到了各种各样的问题。
首先得:@set serveroutput on;
首先得:@set serveroutput on;
而在DbVisualizer里面的创建
--/
create procedure abc
as
ou integer;
begin
select count(1) into ou from DP_1_SYS_BRANCEOFFICE;
end;
/
执行
--/
begin
abc();
end;
/
也可以
call abc();
而如果你想用exec,那么你必须安装pl/sql,这样,它会在环境变量里面添加上exec,然后你在命令行上就行exec
procedureName();
定义变量要有长度,如:
CREATE OR REPLACE PROCEDURE "DEPPON"."OU"(x in integer)
as
b varchar2(200);
begin
select name into b from DP_1_SYS_BRANCEOFFICE where id=x;
DBMS_OUTPUT.PUT_LINE(b);
end;
如果你写成了 b varchar2;会报错"字符串长度限制在范围 (1...32767)"
当然,你进行定义参数时,并不需要指明长度,如下
CREATE OR REPLACE PROCEDURE OU(x in integer,v out varchar2)
as
b varchar2(200);
begin
select name into b from table where id=x;
end;
上面的 v out varchar2如果我们写成 v out varchar2(200) 编译器就会报错了
--/
declare
xxx varchar2(12);
begin
ou(1,xxx);
DBMS_OUTPUT.PUT_LINE(xxx);
end;
/
带游标的存储过程
CREATE OR REPLACE PROCEDURE GENERAL_HUB_NODE_DIS
is
HUB varchar2(200);
NODE varchar2(200);
rs SYS_REFCURSOR;
begin
open rs for select HUB_NAME,NODE_NAME from T_SOLUTION_HUB_NODE;
loop
FETCH rs into HUB,NODE;
exit when rs%NOTFOUND;
execute immediate 'insert into XXX(HUB,BRANCEOFFICE) select a.NAME as hub,b.name as branchoffice from
table1 a right join table2 b on(1=1) where b.START_DC=concat(:1,:2) and b.LATITUDE is not
null and a.name = concat(:3,:4)' USING NODE,'外场',HUB,'外场';
end loop;
end;
因为 DBMS_OUTPUT.PUT_LINE的最大输入是250个字符,所以如果我们需要输出大于250的字符
我们打印输出时,需要用到的
vaa:=1;
while vaa<=length(vsql)
loop
DBMS_OUTPUT.PUT_LINE(SUBSTR(vsql, VAA, 200));
VAA := VAA + 200;
end loop;