2010-10-22 24 views
3

Shell腳本從文件,並把值僅在通過shell腳本條款

#! /bin/bash 
sqlplus -s <username>/<passwd>@dbname << EOF 
set echo on 
set pagesize 0 
set verify off 
set lines 32000 
set trimspool on 
set feedback off 
SELECT * 
    FROM <dbname>.<tablename1> tr 
    LEFT JOIN <tablename2> t2 ON t2.id2 = tr.id1 
    LEFT JOIN <tablename3> t3 ON t3.id2 = tr.id1 
    LEFT JOIN <tablename4> t4 ON t4.id2 = tr.id1 
WHERE tr.TIMESTAMP > SYSDATE - 75/1440 
    AND tr.TIMESTAMP <= SYSDATE - 15/1440 
    AND t2.value in (value1, value2, etc...) 
ORDER BY timestamp; 

exit; 
EOF 

現在,目的是在t2.value列讀取32000個讀取值。這些值只是像1234,4567,1236等數字我想我應該把這些數字在一個單獨的文件,然後讀取該文件在t2.value。但是我希望SQL只能執行一次,而不是32000次。你能告訴我這怎麼可能?我怎樣才能得到t2.value中的值(由逗號分隔)(通過一些循環,可能是閱讀行)?

回答

0

您可以創建一個逗號分隔的列表從包含的每行的所有號碼一個文件:

t2val=$(cat your_file_with_numbers | tr '\n' ',' | sed 's/,$//') 

接下來,您可以使用這個變量$t2val爲:

.... 
and t2.value in ("$t2val") 

我們更換在帶逗號的行之間使用\n,並刪除最後一個逗號,因爲它會在Oracle中創建語法錯誤。

+0

我在標準輸出錯誤的錯誤: ORA-00972:標識符太長 – ErAB 2010-10-22 05:54:55

+0

ORA-00972來的時候,你已經使用了很長的標識符,> 38字符。但我們不會在任何地方更改任何標識符(列,表名)。你做了什麼改變? – codaddict 2010-10-22 05:57:36

+0

我會粘貼完整的腳本。 – ErAB 2010-10-22 06:07:31

1

您可以使用SQL * Loader將這些值加載到您首次創建的臨時表中,並在其唯一列上使用索引。

sqlldr user/password%@sid control=ctl_file 

內容的ctl_file

load data 
infile * 
append 
into table MY_TEMP_TABLE 
fields terminated by ";" optionally enclosed by '"' 
(
    column1 
) 
begindata 
"value1" 
"value2" 
[...] 

(雙引號是可選的,不需要換號

然後修改您的查詢:

AND t2 in (SELECT column1 FROM my_temp_table) 

DROP my_temp_table之後。

0
#!/bin/bash 
    2 t2val=$(cat /home/trnid | tr '\n' ',' | sed 's/,$//') 
    3 sqlplus -s <username>/<passwd>@dbname > /home/file << EOF 
    4 set echo on 
    5 set pagesize 0 
    6 set verify off 
    7 set lines 32000 
    8 set trimspool on 
    9 set feedback off 
10 SELECT * 
     FROM <dbname>.<tablename1> tr 
     LEFT JOIN <tablename2> t2 ON t2.id2 = tr.id1 
     LEFT JOIN <tablename3> t3 ON t3.id2 = tr.id1 
     LEFT JOIN <tablename4> t4 ON t4.id2 = tr.id1 
     WHERE tr.TIMESTAMP > SYSDATE - 75/1440 
     AND tr.TIMESTAMP <= SYSDATE - 15/1440 
     and t2.value in ("t2val") 
     order by timestamp; 
26 exit; 
27 EOF 

trnid file has total of 32000 lines (each number on separate line). The length of each number is 11 digits. 

我只是碰巧看到不同的錯誤:

輸入截斷爲7499個字符 SP2-0027:輸入太長(> 2499個字符) - 在線忽略 輸入截斷爲7499個字符 SP2-0027 :輸入過長(> 2499個字符) - 忽略行。

上一個錯誤我得到bcoz我插入數字在trnid文件中用逗號分隔,並在不同的行中。在這種情況下,我只使用命令:

t2val=$(cat /home/trnid) 
相關問題