免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: angel518
打印 上一主题 下一主题

请教,shell如何取得sql执行的返回值 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2011-08-20 22:17 |只看该作者
回复 7# angel518


    $?最大好像只有255吧~它的范围应该是0~255.
    如果只需要获得单个值的话,上面那个回复即可。如果需要获得多个值的话,就需要使用PL/SQL块


resultlist=`sqlplus -S user/passwd@tns<<EOF
set serveroutput on
declare
      v_a integer;
      v_b integer;
      v_c integer;
begin
      select count(1) into v_a from ta;
      select count(1) into v_b from tb;
      select count(1) into v_c from tc;
      dbms_output.put_line(v_a||chr(10)||v_b||chr(10)||v_c);
end;
/
exit
EOF`

为什么要使用chr(10)?因为可能默认的sqlplus的默认设置的glogin.sql里面的linesize设置为80。如果你求的值比较多可能会有点小问题。然后如果要解析resultlist的结果,可以使用for来解析,可以设置shell的IFS来设定delimiter.
PS:曾经使用过shell来设计过不同DB系统的数据对比系统。不过,DB的连接和断开问题始终是头疼的问题。最终还是通过PYTHON来实现,因为带各种DB API,易于实现。楼上有同志说的perl DB API应该也是PYTHON的发源地。

论坛徽章:
0
12 [报告]
发表于 2011-08-22 08:46 |只看该作者
--oracle
#!/bin/bash
user=aaa
password=bbb
tns=ccc

result=`sqlplus -S $user/$password@$tns
yanghong709 发表于 2011-08-20 22:01



    出来不了
我用的是Red Flag DC Server release 5.0
你的出来了,可能是没加 1>/dev/null,所以不是echo $result执行的结果

论坛徽章:
0
13 [报告]
发表于 2011-08-22 21:57 |只看该作者
回复 12# angel518

没看明白你的标准输出 1 >/dev/null在哪里写的?
另:$result里面放置的就是标准输出的值啊。

论坛徽章:
0
14 [报告]
发表于 2011-08-23 10:35 |只看该作者
oracle环境的话, 10楼正解; 建议将SHELL函数替换符号``修改成$()

论坛徽章:
0
15 [报告]
发表于 2011-08-23 23:52 |只看该作者
oracle环境的话, 10楼正解; 建议将SHELL函数替换符号``修改成$()
chhuma 发表于 2011-08-23 10:35



    请问一下,为什么要将反单引号换成$()?求解惑。

论坛徽章:
0
16 [报告]
发表于 2011-08-24 09:25 |只看该作者
回复 11# yanghong709


    包括DB2吗?

论坛徽章:
0
17 [报告]
发表于 2011-08-24 11:28 |只看该作者
回复 16# java_html

不包括,sqlplus是oracle数据库里的东西

论坛徽章:
0
18 [报告]
发表于 2011-08-24 11:32 |只看该作者
回复 15# yanghong709

见置顶贴
    在操作上,用 $( ) 或 ` ` 都無所謂,只是我"個人"比較喜歡用 $( ) ,理由是:

1,  ` ` 很容易與 ' ' ( 單引號)搞混亂,尤其對初學者來說。
有時在一些奇怪的字形顯示中,兩種符號是一模一樣的(直豎兩點)。
當然了,有經驗的朋友還是一眼就能分辯兩者。只是,若能更好的避免混亂,又何樂不為呢? ^_^

2, 在多層次的復合替換中,` ` 須要額外的跳脫( \` )處理,而 $( ) 則比較直觀。例如:
這是錯的:
  • command1 `command2 `command3` `



原本的意圖是要在 command2 `command3` 先將 command3 提換出來給 command 2 處理,
然後再將結果傳給 command1 `command2 ...` 來處理。
然而,真正的結果在命令行中卻是分成了 `command2 ` 與 `` 兩段。
正確的輸入應該如下:
  • command1 `command2 \`command3\` `

论坛徽章:
0
19 [报告]
发表于 2011-08-25 10:30 |只看该作者
回复 15# yanghong709


    功能是一样的,只是看上去容易和单引号混淆,不容易维护
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP