免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4496 | 回复: 11
打印 上一主题 下一主题

[文本处理] 如何将 sqlplus 执行存储过程后的结果返回操作系统,求大神指点! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-04-18 14:46 |只看该作者 |倒序浏览
现在小弟有一个可执行的存储过程,脚本可正常调用该存储过程,但是无法将存储过程返回的值,
再返回给操作系统,请大神指点!

脚本如下:

#!/bin/ksh

sqlplus abc/abc << !
   declare
         a1 varchar2(3);
         a2 varchar2(;
         retcode  number;
         retmsg   varchar2(100);

         begin
                 myproc(a1, a2, retcode, retmsg);
                 IF retcode <> 0
                 then
                       DBMS_OUTPUT.PUT_LINE('retcode = [' || retcode ']');
                 END IF;
         end;
         /
!
echo $?


其中,myproc 为 存储过程名,可正确执行,也能得到 retcode 的值。
现在的问题是,如果我想将这个 retcode 的值返回给操作系统还无法实现。
(例如:在 retcode == -1 情况下,让  $? 显示为 -1;在 retcode == 0 的情况下,让  $? 显示为 0)
无论在什么情况下,只要这个脚本执行了, echo $? 都显示为 0. 而不是 retcode 的值
请大神指点迷津。

论坛徽章:
20
卯兔
日期:2015-01-26 22:05:142015亚冠之萨济拖拉机
日期:2015-09-10 15:15:282015亚冠之阿尔希拉尔
日期:2015-09-25 17:37:53程序设计版块每日发帖之星
日期:2015-10-03 06:20:00程序设计版块每日发帖之星
日期:2015-12-09 06:20:00CU十四周年纪念徽章
日期:2015-12-17 09:07:15程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:342015亚冠之广州富力
日期:2015-08-27 19:29:56每日论坛发贴之星
日期:2015-08-26 06:20:002015亚冠之阿尔希拉尔
日期:2015-05-18 17:26:27
2 [报告]
发表于 2015-04-18 16:02 |只看该作者
回复 1# mailsafe

方法1:
sqlplus abc/abc << !
   declare
         a1 varchar2(3);
         a2 varchar2(3);
         retcode  number;
         retmsg   varchar2(100);

         begin
                 myproc(a1, a2, retcode, retmsg);
                 IF retcode <> 0
                 then
                       DBMS_OUTPUT.PUT_LINE('retcode = [' || retcode ']');
                 END IF;
         end;
         /
         exit retcode;
!
echo $?

方法2:
func_a()
{
sqlplus abc/abc << !
   declare
         a1 varchar2(3);
         a2 varchar2(3);
         retcode  number;
         retmsg   varchar2(100);

         begin
                 myproc(a1, a2, retcode, retmsg);
                 DBMS_OUTPUT.PUT_LINE(retcode);
         end;
         /
!
}

rtn=`func_a 2>/dev/null`
echo $rtn

论坛徽章:
0
3 [报告]
发表于 2015-04-18 19:42 |只看该作者
方法一,我试一下,我原来是把  exit retcode 放在 end 前,结果提示 retcode 需定义。
先预谢,预谢。

论坛徽章:
0
4 [报告]
发表于 2015-04-20 10:07 |只看该作者
按照 songyc_2015 的方法改了一下试试,结果还是不行,提示如下:



源码如下:

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
5 [报告]
发表于 2015-04-20 10:24 |只看该作者
回复 4# mailsafe


shell 中 $? 的值只能是 0 ~ 255 之间的数。
exit 后面的数值也要遵循这个范围,-1 之类的值是不可能显示出来的。

论坛徽章:
0
6 [报告]
发表于 2015-04-20 12:28 |只看该作者
ly5066113 发表于 2015-04-20 10:24
回复 4# mailsafe


是的,但是我这里存储过程返回的值为:9,我也能得到这个值,我 exit retcode ,就不能将这个 9 返回到操作系统,让 echo 显示出来了。

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
7 [报告]
发表于 2015-04-20 13:15 |只看该作者
回复 6# mailsafe


用上面的第二种方法吧。

在 begin end 之外,retcode 已经不存在了。

论坛徽章:
20
卯兔
日期:2015-01-26 22:05:142015亚冠之萨济拖拉机
日期:2015-09-10 15:15:282015亚冠之阿尔希拉尔
日期:2015-09-25 17:37:53程序设计版块每日发帖之星
日期:2015-10-03 06:20:00程序设计版块每日发帖之星
日期:2015-12-09 06:20:00CU十四周年纪念徽章
日期:2015-12-17 09:07:15程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:342015亚冠之广州富力
日期:2015-08-27 19:29:56每日论坛发贴之星
日期:2015-08-26 06:20:002015亚冠之阿尔希拉尔
日期:2015-05-18 17:26:27
8 [报告]
发表于 2015-04-20 14:37 |只看该作者
回复 5# ly5066113

感谢大神指正,由于测试不彻底,误导了楼主,我当时的测试代码如下:

sqlplus -S -L sss/yyy@ccc <<!
    set serveroutput on
    set feedbach off
    set pages 0
    set line 32767
    set trims on
   
    var retcode number;
   
    declare
        retmsg varchar2(60);
    begin
        :retcode := 55;
        retmsg := 'retmsg555';
        dbms_output.put_line('retmsg=[' || retmsg || ']');
    end;
    /
   
    exit :retcode
!
echo $?
如果retcode在0-255之间返回是正常的,不在这个范围就有问题了,建议楼主还是用第2中方法试试吧

测试环境:
数据库版本:10.2.0.4.0
shell:ksh
系统:ibm aix6.1

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
9 [报告]
发表于 2015-04-20 14:56 |只看该作者
回复 8# songyc_2015


学习了,原来用 var retcode number;
就可以在 begin  end 外使用了。

论坛徽章:
0
10 [报告]
发表于 2015-04-20 21:11 |只看该作者
ly5066113 发表于 2015-04-20 13:15
回复 6# mailsafe


用上面的第二种方法吧。

在 begin end 之外,retcode 已经不存在了。


感觉上只有这一种方法可行。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP