oracle 带游标的存储过程

   如果各位以前从来没有写存储过程,可得仔细了,因为在进行存储过程编写的时候,新手很容易出错,非常容易。

   执行存储过程各个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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值