亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: 請(qǐng)教,shell如何取得sql執(zhí)行的返回值 [打印本頁(yè)]

作者: angel518    時(shí)間: 2011-08-19 18:27
標(biāo)題: 請(qǐng)教,shell如何取得sql執(zhí)行的返回值
在sehll腳本中,有如下sql語(yǔ)句
select count(*) from A
insert into B select * from A;
當(dāng)上面的sql執(zhí)行后,接下來(lái)處理上面的返回值,該怎么取啊

如select查詢(xún)記錄數(shù),insert 插入的記錄數(shù)?用shell怎么得到呢
作者: Warneryu    時(shí)間: 2011-08-19 18:34
回復(fù) 1# angel518


    mysql -uroot -p**** -e "select count(*) from A" |wc -l
作者: icybay    時(shí)間: 2011-08-19 19:49
回復(fù) 1# angel518

sqlplus ...  <<EOF

spool a.txt
select   * from tab;
spool off
EOF
作者: seesea2517    時(shí)間: 2011-08-19 21:03
獲取結(jié)果:

  1. return_value=$(mysql -u用 -p密碼 -h主機(jī) -e "select count(*) from A;")
復(fù)制代碼
但如果是 insert 則無(wú)法得到結(jié)果,因?yàn)楸旧頉](méi)有輸出。要借助其它工具了,3#的工具沒(méi)見(jiàn)過(guò),可能很好用,改天試用試用。
作者: Shell_HAT    時(shí)間: 2011-08-19 23:34
回復(fù) 4# seesea2517


Oracle的客戶(hù)端命令sqlplus
作者: seesea2517    時(shí)間: 2011-08-20 10:44
回復(fù)  seesea2517


Oracle的客戶(hù)端命令sqlplus
Shell_HAT 發(fā)表于 2011-08-19 23:34



    有道理啊,LZ還沒(méi)說(shuō)是什么服務(wù)器呢~
作者: angel518    時(shí)間: 2011-08-20 11:30
忘了說(shuō),是ORACLE
我代碼如下:
RET=`sqlplus -s user/passwd <<EOF
insert into B select * from A;
COMMIT;
EOF`
echo $RET

sqlplus -s user/passwd <<EOF
select count(*) from A
EOF
RETN="$?"
echo $RETN
第一個(gè)顯示空白,第二個(gè)返回0,實(shí)際插入了幾條啊
哪里有錯(cuò)???
作者: Shell_HAT    時(shí)間: 2011-08-20 12:55
回復(fù) 7# angel518


把SQL的執(zhí)行spool到一個(gè)文件里面,然后讀這個(gè)文件。
作者: tjpm    時(shí)間: 2011-08-20 13:29
其實(shí)用Perl DBI模塊來(lái)做這些數(shù)據(jù)庫(kù)查詢(xún),修改還是很方便的,比直接用shell好控制一點(diǎn)。
作者: yanghong709    時(shí)間: 2011-08-20 22:01
--oracle
#!/bin/bash
user=aaa
password=bbb
tns=ccc

result=`sqlplus -S $user/$password@$tns<<EOF
select count(1) from tb;
EOF`

echo $result
作者: yanghong709    時(shí)間: 2011-08-20 22:17
回復(fù) 7# angel518


    $?最大好像只有255吧~它的范圍應(yīng)該是0~255.
    如果只需要獲得單個(gè)值的話(huà),上面那個(gè)回復(fù)即可。如果需要獲得多個(gè)值的話(huà),就需要使用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)?因?yàn)榭赡苣J(rèn)的sqlplus的默認(rèn)設(shè)置的glogin.sql里面的linesize設(shè)置為80。如果你求的值比較多可能會(huì)有點(diǎn)小問(wèn)題。然后如果要解析resultlist的結(jié)果,可以使用for來(lái)解析,可以設(shè)置shell的IFS來(lái)設(shè)定delimiter.
PS:曾經(jīng)使用過(guò)shell來(lái)設(shè)計(jì)過(guò)不同DB系統(tǒng)的數(shù)據(jù)對(duì)比系統(tǒng)。不過(guò),DB的連接和斷開(kāi)問(wèn)題始終是頭疼的問(wèn)題。最終還是通過(guò)PYTHON來(lái)實(shí)現(xiàn),因?yàn)閹Ц鞣NDB API,易于實(shí)現(xiàn)。樓上有同志說(shuō)的perl DB API應(yīng)該也是PYTHON的發(fā)源地。
作者: angel518    時(shí)間: 2011-08-22 08:46
--oracle
#!/bin/bash
user=aaa
password=bbb
tns=ccc

result=`sqlplus -S $user/$password@$tns
yanghong709 發(fā)表于 2011-08-20 22:01



    出來(lái)不了
我用的是Red Flag DC Server release 5.0
你的出來(lái)了,可能是沒(méi)加 1>/dev/null,所以不是echo $result執(zhí)行的結(jié)果
作者: yanghong709    時(shí)間: 2011-08-22 21:57
回復(fù) 12# angel518

沒(méi)看明白你的標(biāo)準(zhǔn)輸出 1 >/dev/null在哪里寫(xiě)的?
另:$result里面放置的就是標(biāo)準(zhǔn)輸出的值啊。
作者: chhuma    時(shí)間: 2011-08-23 10:35
oracle環(huán)境的話(huà), 10樓正解; 建議將SHELL函數(shù)替換符號(hào)``修改成$()
作者: yanghong709    時(shí)間: 2011-08-23 23:52
oracle環(huán)境的話(huà), 10樓正解; 建議將SHELL函數(shù)替換符號(hào)``修改成$()
chhuma 發(fā)表于 2011-08-23 10:35



    請(qǐng)問(wèn)一下,為什么要將反單引號(hào)換成$()?求解惑。
作者: java_html    時(shí)間: 2011-08-24 09:25
回復(fù) 11# yanghong709


    包括DB2嗎?
作者: icybay    時(shí)間: 2011-08-24 11:28
回復(fù) 16# java_html

不包括,sqlplus是oracle數(shù)據(jù)庫(kù)里的東西
作者: icybay    時(shí)間: 2011-08-24 11:32
回復(fù) 15# yanghong709

見(jiàn)置頂貼
    在操作上,用 $( ) 或 ` ` 都無(wú)所謂,只是我"個(gè)人"比較喜歡用 $( ) ,理由是:

1,  ` ` 很容易與 ' ' ( 單引號(hào))搞混亂,尤其對(duì)初學(xué)者來(lái)說(shuō)。
有時(shí)在一些奇怪的字形顯示中,兩種符號(hào)是一模一樣的(直豎兩點(diǎn))。
當(dāng)然了,有經(jīng)驗(yàn)的朋友還是一眼就能分辯兩者。只是,若能更好的避免混亂,又何樂(lè)不為呢? ^_^

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



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

作者: chhuma    時(shí)間: 2011-08-25 10:30
回復(fù) 15# yanghong709


    功能是一樣的,只是看上去容易和單引號(hào)混淆,不容易維護(hù)




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2