shell腳本執行oracle存儲過程
A. shell下調用oracle存儲過程,怎麼將存儲過程的輸出參數傳遞給shell中的變數啊
那一就要寫一個shell
腳本了
echo
-ne
"\e[40;33;lm
請如數
參數
:\e[0m"
read
X
su
-
oracle
sqlplus
用戶名/
密碼
start
存儲過程名
參數
B. 如何定製oracle用戶下的shell腳本自動運行
多樣性應該是linux最好的特性之一,用戶可以不斷嘗試各種喜歡和新鮮玩法與花樣,並從中找出最適合自己的應用
無論你是Linux新人還是老鳥,層出不窮的應用和桌面環境可能都會讓我們應接不暇,特別是嘗試不同的Linux桌面環境,可以說是一項非常耗時和累人的任務
在此,咱系統極客對目前應用最為廣泛的7款Linux桌面環境進行盤點,並對其優缺點進行比較,希望對各位選擇或者進行各種折騰有所幫助
聲明:我們只是對目前應用最為廣泛的7款Linux桌面環境進行盤點小節,排名無分先後
KDEKDE絕非只是一個桌面環境,實際上是各種應用程序與Linux桌面的一個集合,桌面環境本身只作為該套應用環境的一個子集
目前最新的KDE環境名叫Plasma,它又分為PlasmaDesktop和PlasmaNetbook兩個版本,KDE可以說是目前定製性最強,最為靈活的Linux桌面環境之一
其它桌面環境可能需要使用額外的工具才能進行自定義或調整,而KDE將這一切都集成進了系統設置當中,用戶不需要使用任何第三方工具即可以對桌面進行個性化訂制,如下載桌面小工具、壁紙和主題等
KDE還對常用的基本應用程序進行了集成,並對未使用KDE開發平台構建的應用進行兼容,KDE集成的應用非常豐富,完全能夠滿足普通用戶的日常應用,而無需安裝其它替代應用
無論你只是想要一個開箱即用的Linux桌面環境還是要對桌面進行全面的個性化訂制,KDE都是一個非常不錯的選擇
目前採用KDE作為默認桌面環境的Linux發行版主要有openSUSE和Kubuntu
KDE優點:功能十分豐富強大高度可定製性和靈活性范圍廣泛的軟體兼容性KDE缺點:稍重的資源佔用某些組件使用起來似乎過於復雜MATEMATE桌面環境基於目前無人維護的GNOME2,MATE最初就是為對GNOME3失望的用戶而開發
ForkGNOME2的代碼進行氏清納開發並不意味著就使用過時的技術,MATE將繼續使用現代技術進行改善
MATE桌面環境採用了現代而又不失傳統的桌面體驗,它支持面板系統、各種菜單、小程序、指示器和按鈕等,並可按用戶的需要進行布置
MATE自帶的基本應用都從GNOME2復制過來進行集成,它本身對資源的消耗非常小,能夠在不十分強勁的硬體平台上穩定工作
UbuntuMATE目前採用MATE作為自己的默認桌面環境
MATE優點:直觀和穩定的用戶體驗簡單、輕便高度可定製MATE缺點:介面看起來有些老了GNOMEGNOME是各Linux發行版採用最為廣泛、最流行的桌面環境之一,許多Linux發行版都使用GNOME作為默認桌面環境
它也有一些流行的分支,例如Cinnamon、Unity等等
GNOME以易於使用和定製為設計初衷,目前果最新的GNOME3具有非常現代和有吸引力的用戶界面,並能為觸摸設備提供更好的支持
GNOME幾乎包含了所有現代化桌面環境需要的所有功能,GNOME3比GNOME2的精典模式提供了更好的界面,儀錶板、全系統搜索和強大的應用程序都能夠直接輕松搞定用戶使用需求
不過桌面環境的定製調整需要使用gnome-tweak-tool工具來完成,在3
18版本中它還了文件管理器的一些有趣功能,例如對GoogleDrive進行了集成
目前使用GNOME作為默認桌面環境的Linux發行版主要有Debian、Fedora、openSUSE和UbuntuGNOME
GNOME優點:現代和觸摸友好的用戶界面能夠通過Shell擴展延伸功能可定製性強GNOME缺點:擴展管殲沒理不盡如人意CINNAMONCinnamon是GNOME3的一個分支,目前正作為LinuxMint的默認桌面環境
它最出名的便是與Windows相似的用戶界面,可以幫助Linux入門用戶輕松上手並減低不適應度
Cinnamon集成的各種基本應用都源於GNOME3,Cinnamon集成了面板、主題、小應用程序和各種自定義組件擴展,面板位置屏幕底部邊緣,配備了主菜單、啟用程序、打開窗口列表及系統托盤等
Cinnamon優點:時尚精緻的外觀熟悉的界面非常漂亮的定製Cinnamon缺點:偶爾出現的BugUNITYUnity也是基於GNOME桌面環境開發而來,配備有最核心的GNOME應用正基程序
Unity主要用於Canonical開發的Ubuntu桌面環境
Unity主攻方向為使用鍵盤、滑鼠、觸控板甚至觸摸屏的用戶提供一致一用戶體驗,為用戶提供了簡單的應用程序並集成了觸控友好的使用環境,還實現了一些新的想法和技術,如Lens和HUD等
盡管針對Unity桌面環境有大量的爭論,但它還是有非常大量的用戶,這都歸功於它是目前最流行Linux發行版Ubuntu的默認桌面環境
C. 怎樣實現每天自動執行oracle的存儲過程一次
用job
oracle定時器調用存儲過程
1.創建一個表,為了能清楚看到定時器的運行情況我們創建一個帶有日期欄位的表
Sql代碼
create table job_table(run_time date);
create table job_table(run_time date);
2.創建存儲過程
Sql代碼
create or replace procere job_proc is
begin
insert into job_table (run_time) values (sysdate);
end;
create or replace procere job_proc is
begin
insert into job_table (run_time) values (sysdate);
end;
3.創建job,並且指定為一分鍾執行一次
Sql代碼
declare
job number;
begin
dbms_job.submit(job, 'job_proc;', sysdate, 'TRUNC(sysdate,''mi'') + 1 / (24*60)');
end/
commit;
declare
job number;
begin
dbms_job.submit(job, 'job_proc;', sysdate, 'TRUNC(sysdate,''mi'') + 1 / (24*60)');
end/
commit;
4.創建之後自動處於運行狀態,我們查詢job表,看看我們創建的job
Sql代碼
select job,broken,what,interval,t.* from user_jobs t;
select job,broken,what,interval,t.* from user_jobs t;
job broken what interval ...
81 N job_proc; TRUNC(sysdate,'mi') + 1 / (24*60) ...
參數介紹
job job的唯一標識,自動生成的
broken 是否處於運行狀態,N;運行;Y:停止
what 存儲過程名稱
interval 定義的執行時間
補充:
描述 INTERVAL參數值
每天午夜12點 ''TRUNC(SYSDATE + 1)''
每天早上8點30分 ''TRUNC(SYSDATE + 1) + (8*60+30)/(24*60)''
每星期二中午12點 ''NEXT_DAY(TRUNC(SYSDATE ), ''''TUESDAY'''' ) + 12/24''
每個月第一天的午夜12點 ''TRUNC(LAST_DAY(SYSDATE ) + 1)''
每個季度最後一天的晚上11點 ''TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), ''Q'' ) -1/24''
每星期六和日早上6點10分 ''TRUNC(LEAST(NEXT_DAY(SYSDATE, ''''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + (6×60+10)/(24×60)''
D. linux下shell調用oracle存儲過程的問題
被鎖定的話,你可以是做不了的。等待也是沒用的啊,只要被鎖了,永遠你也做不了。除非解鎖了。應該先去檢查為何被鎖吧。 調用存儲過程,返回結果可以有,得看你的存儲過程怎麼寫了,可以在存儲過程里增加返回值的。
E. oracle存儲過程中調用一個shell腳本,用於進行一些操作,已經賦許可權,但是執行不了
shell的環境變數問題,你在shell內部的變數是獲取不到外部執行結果的。
F. java 執行shell語句 shell 執行oracle語句
怎樣在java代碼中調用執行shell腳本
//用法:Runtime.getRuntime.exec("命令");
Stringshpath="/test/test.sh";//程序路徑
Processprocess=null;
Stringmand1=「chmod777」+shpath;
try{
Runtime.getRuntime.exec(mand1).waitFor;
}catch(IOExceptione1){
e1.printStackTrace;
}catch(InterruptedExceptione){
e.printStackTrace;
}
Stringvar="201102";/參數
Stringmand2=「/bin/sh」+shpath+」」+var;
Runtime.getRuntime.exec(mand2).waitFor;
如何在java中執行shell腳本
// 用法:Runtime.getRuntime.exec("命令");
String shpath="/test/test.sh"; //程序路徑
Process process =null;
String mand1 = 「chmod 777 」 + shpath;
try {
Runtime.getRuntime.exec(mand1 ).waitFor;
} catch (IOException e1) {
e1.printStackTrace;
}catch (InterruptedException e) {
e.printStackTrace;
}
String var="201102"; /參數
String mand2 = 「/bin/sh 」 + shpath + 」 」 + var;
Runtime.getRuntime.exec(mand2).waitFor;
java怎麼調用shell腳本
Stringcmdstring="chmoda+xtest.sh";
Processproc=Runtime.getRuntime.exec(cmdstring);
proc.waitFor;//阻塞,直到上述命令執行完
cmdstring="bashtest.sh";//這里也可以是ksh等
proc=Runtime.getRuntime.exec(cmdstring);
//注意下面的操作
stringls_1;
BufferedReaderbufferedReader=newBufferedReader(newInputStreamReader(proc.getInputStream);
while祥配鉛((ls_1=bufferedReader.readLine)!=null);
bufferedReader.close;
proc.waitFor;
為什謹好么要有上面那段操作呢?
原因是:可執行程序的輸出可能會比較多,而運行窗口的輸出緩沖區有限,會造成waitFor一直阻塞。解決的辦法是,利用Java提供的Process類提供的getInputStream,getErrorStream方法讓Java虛擬機截獲被調用程序的標准輸出、錯誤輸出,在waitfor命令之前讀掉輸出緩沖區中的內容。
如何在java中執行shell腳本
在java中執行shell腳本 用賣碧法:Runtime.getRuntime.exec("命令");
String shpath="/test/test.sh"; //程序路徑
Process process =null;
String mand1 = 「chmod 777 」 + shpath;
try {
Runtime.getRuntime.exec(mand1 ).waitFor;
} catch (IOException e1) {
e1.printStackTrace;
}catch (InterruptedException e) {
e.printStackTrace;
}
String var="201102"; /參數
String mand2 = 「/bin/sh 」 + shpath + 」 」 + var;
Runtime.getRuntime.exec(mand2).waitFor;
標簽:作文經典 上一篇:一個人帶頭的成語 一個豬頭帶頭的成語 下一篇:描寫長城的語句 描寫長城美景的語句怎麼通過java去調用並執行shell腳本以及問題總結
以下是我在公司項目中實際應用到的:
/**
*執行系統命令
*@time2016/10/17$17:05$
*/
{
protectedstaticLoggerlogger=LoggerFactory.getLogger(ShareDiskFileUtils.class);
;
;
static{
Stringosname=System.getProperty("os.name").toLowerCase;
isWindow=osname.contains("win");
isLinux=osname.contains("linux");
logger.info("系統環境:"+(isLinux?"Linux":"Window"));
}
/**
*執行命令
*/
(Stringmand)throwsIOException,InterruptedException{
logger.info("執行系統命令:"+mand);
Processprocess=Runtime.getRuntime.exec(getCmdArray(mand));
newStreamPrinter(process.getInputStream,logger).start;
newStreamPrinter(process.getErrorStream,logger).start;
process.waitFor;
returnprocess;
}
/**
*這個非常重要,如果你直接執行mand,會出現一些問題,如果參數中包含一些空格,",'之類的特殊字元,將會執行失敗,
*/
privatestaticString[]getCmdArray(Stringmand){
if(isWindow){
returnnewString[]{"cmd","/c",mand};
}
if(isLinux){
returnnewString[]{"/bin/sh","-c",mand};
}
returnnewString[]{"cmd","/c",mand};
}
}
怎麼通過java去調用並執行shell腳本以及問題總結
// 用法:Runtime.getRuntime.exec("命令");
String shpath="/test/test.sh"; //程序路徑
Process process =null;
String mand1 = 「chmod 777 」 + shpath;
try {
Runtime.getRuntime.exec(mand1 ).waitFor;
} catch (IOException e1) {
e1.printStackTrace;
}catch (InterruptedException e) {
e.printStackTrace;
}
String var="201102"; /參數
String mand2 = 「/bin/sh 」 + shpath + 」 」 + var;
Runtime.getRuntime.exec(mand2).waitFor;
java怎麼執行shell腳本
如果shell腳本和java程序運行在不同的伺服器上,可以使用遠程執行Linux命令執行包,使用ssh2協議連接遠程伺服器,並發送執行命令就行了,ganymed.ssh2相關mave配置如下,你可以自己網路搜索相關資料。
如果shell腳本和java程序在同一台伺服器上,
這里不得不提到java的process類了。
process這個類是一個抽象類,封裝了一個進程(你在調用linux的命令或者shell腳本就是為了執行一個在linux下執行的程序,所以應該使用process類)。
process類提供了執行從進程輸入,執行輸出到進程,等待進程完成,檢查進程的推出狀態,以及shut down掉進程。
.ganymed.ssh2
ganymed-ssh2-build
210
本地執行命令代碼如下:
Stringshpath="/test/test.sh";//程序路徑
Processprocess=null;
Stringmand1=「chmod777」+shpath;
process=Runtime.getRuntime.exec(mand1);
process.waitFor;
如何在java中執行shell腳本
1、最常用的方法:
Processp=Runtime.getRuntime.exec(SHELL_FILE_DIR+RUNNING_SHELL_FILE+
""+param1+""+param2+""+param3);
intrunnngStatus=p.waitFor;
2、通過ProcessBuilder進行調度,這種方法比較直觀,而且參數的設置也比較方便:
ProcessBuilderpb=newProcessBuilder("./"+RUNNING_SHELL_FILE,param1,
param2,param3);
pb.directory(newFile(SHELL_FILE_DIR));
intrunningStatus=0;
Strings=null;
try{
Processp=pb.start;
try{
runningStatus=p.waitFor;
}catch(InterruptedExceptione){
e.printStackTrace;
}
}catch(IOExceptione){
e.printStackTrace;
}
if(runningStatus!=0){
}
return;
參數說明:
RUNNING_SHELL_FILE:要運行的腳本
SHELL_FILE_DIR:要運行的腳本所在的目錄; 當然你也可以把要運行的腳本寫成全路徑。
runningStatus:運行狀態,0標識正常。 詳細可以看java文檔。
param1, param2, param3:可以在RUNNING_SHELL_FILE腳本中直接通過1,1,2,$3分別拿到的參數。
怎麼通過java去調用並執行shell腳本以及問題總結
對於第一個問題:java抓取,並且把結果打包。那麼比較直接的做法就是,java接收各種消息(db,metaq等等),然後藉助於jstorm集群進行調度和抓取。
最後把抓取的結果保存到一個文件中,並且通過調用shell打包, 回傳。 也許有同學會問,
為什麼不直接把java調用odps直接保存文件,答案是,我們的集群不是hz集群,直接上傳odps速度很有問題,因此先打包比較合適。(這里不糾結設計了,我們回到正題)
java調用shell的方法
通過ProcessBuilder進行調度
這種方法比較直觀,而且參數的設置也比較方便, 比如我在實踐中的代碼(我隱藏了部分業務代碼):
ProcessBuilderpb = new ProcessBuilder("./" + RUNNING_SHELL_FILE, param1,
param2, param3);
pb.directory(new File(SHELL_FILE_DIR));
int runningStatus = 0;
String s = null;
try {
Process p = pb.start;
try {
runningStatus = p.waitFor;
} catch (InterruptedException e) {
}
} catch (IOException e) {
}
if (runningStatus != 0) {
}
return;
這里有必要解釋一下幾個參數:
RUNNING_SHELL_FILE:要運行的腳本
SHELL_FILE_DIR:要運行的腳本所在的目錄; 當然你也可以把要運行的腳本寫成全路徑。
runningStatus:運行狀態,0標識正常。 詳細可以看java文檔。
param1, param2, param3:可以在RUNNING_SHELL_FILE腳本中直接通過1,2,$3分別拿到的參數。
直接通過系統Runtime執行shell
這個方法比較暴力,也比較常用, 代碼如下:
p = Runtime.getRuntime.exec(SHELL_FILE_DIR + RUNNING_SHELL_FILE + " "+param1+" "+param2+" "+param3);
p.waitFor;
我們發現,通過Runtime的方式並沒有builder那麼方便,特別是參數方面,必須自己加空格分開,因為exec會把整個字元串作為shell運行。
可能存在的問題以及解決方法
如果你覺得通過上面就能滿足你的需求,那麼可能是要碰壁了。你會遇到以下情況。
沒許可權運行
這個情況我們團隊的朱東方就遇到了, 在做DTS遷移的過程中,要執行包裡面的shell腳本, 解壓出來了之後,發現執行不了。 那麼就按照上面的方法授權吧
java進行一直等待shell返回
這個問題估計更加經常遇到。 原因是, shell腳本中有echo或者print輸出, 導致緩沖區被用完了! 為了避免這種情況, 一定要把緩沖區讀一下, 好處就是,可以對shell的具體運行狀態進行log出來。 比如上面我的例子中我會變成:
ProcessBuilderpb = new ProcessBuilder("./" + RUNNING_SHELL_FILE, keyword.trim,
taskId.toString, fileName);
pb.directory(new File(CASPERJS_FILE_DIR));
int runningStatus = 0;
String s = null;
try {
Process p = pb.start;
BufferedReaderstdInput = new BufferedReader(new InputStreamReader(p.getInputStream));
BufferedReaderstdError = new BufferedReader(new InputStreamReader(p.getErrorStream));
while ((s = stdInput.readLine) != null) {
LOG.error(s);
}
while ((s = stdError.readLine) != null) {
LOG.error(s);
}
try {
runningStatus = p.waitFor;
} catch (InterruptedException e) {
}
記得在start之後, waitFor()之前把緩沖區讀出來打log, 就可以看到你的shell為什麼會沒有按照預期運行。 這個還有一個好處是,可以讀shell裡面輸出的結果, 方便java代碼進一步操作。
也許你還會遇到這個問題,明明手工可以運行的命令,java調用的shell中某一些命令居然不能執行,報錯:命令不存在!
比如我在使用casperjs的時候,手工去執行shell明明是可以執行的,但是java調用的時候,發現總是出錯。
通過讀取緩沖區就能發現錯誤日誌了。 我發現即便自己把安裝的casperjs的bin已經加入了path中(/etc/profile,
各種bashrc中)還不夠。 比如:
exportNODE_HOME="/home/admin/node"
exportCASPERJS_HOME="/home/admin/casperjs"
exportPHANTOMJS_HOME="/home/admin/phantomjs"
exportPATH=$PATH:$JAVA_HOME/bin:/root/bin:$NODE_HOME/bin:$CASPERJS_HOME/bin:$PHANTOMJS_HOME/bin
原來是因為java在調用shell的時候,默認用的是系統的/bin/下的指令。特別是你用root許可權運行的時候。 這時候,你要在/bin下加軟鏈了。針對我上面的例子,就要在/bin下加軟鏈:
ln -s /home/admin/casperjs/bin/casperjscasperjs;
ln -s /home/admin/node/bin/nodenode;
ln -s /home/admin/phantomjs/bin/phantomjsphantomjs;
這樣,問題就可以解決了。
如果是通過java調用shell進行打包,那麼要注意路徑的問題了
因為shell裡面tar的壓縮和解壓可不能直接寫:
tar -zcf /home/admin/data/result.tar.gz /home/admin/data/result
直接給你報錯,因為tar的壓縮源必須到路徑下面, 因此可以寫成
tar -zcf /home/admin/data/result.tar.gz -C /home/admin/data/ result
如果我的shell是在jar包中怎麼辦?
答案是:解壓出來。再按照上面指示進行操作。(1)找到路徑
String jarPath = findClassJarPath(ClassLoaderUtil.class);
JarFiletopLevelJarFile = null;
try {
topLevelJarFile = new JarFile(jarPath);
Enumeration entries = topLevelJarFile.entries;
while (entries.hasMoreElements) {
JarEntryentry = entries.nextElement;
if (!entry.isDirectory entry.getName.endsWith(".sh")) {
對你的shell文件進行處理
}
}
對文件處理的方法就簡單了,直接touch一個臨時文件,然後把數據流寫入,代碼:
FileUtils.touch(tempjline);
tempjline.deleteOnExit;
FileOutputStreamfos = new FileOutputStream(tempjline);
IOUtils.(ClassLoaderUtil.class.getResourceAsStream(r), fos);
fos.close;
如何在java中執行shell腳本
首先你可以網路搜一下 java Process 類的用法,很多博文都有講解。
另外我補充一下我再使用過程中的一些點:
process = Runtime.getRuntime.exec(new String[]{"/bin/sh","-c",shellContext});
其中 shellContext 是shel腳本字元串
這句提交的時候,不少博文 exec中是直接提交shellContext。
但是對於一些場景不適用,取出來數據跟直接運行shell腳本有差異,可以改成我這種寫法。
標簽:作文經典 上一篇:一個人帶頭的成語 一個豬頭帶頭的成語 下一篇:描寫長城的語句 描寫長城美景的語句G. shell腳本語言如何和oracle結合在一起使用
如果是通過shell腳本運行Oracle的sql語句,可以這樣寫shell腳本:
echo 「Oracle SQL Example"
sqlplus / as sysdba <<EOF
select * from scott.emp;
EOF
也就是把sql語句寫到shell腳本的EOF之間。
H. oracle 中用什麼命令執行一個帶參數的存儲過程
具體如下:
1、第一步,創建一個新的存儲過程,見下圖,轉到下面的步驟。
I. shell調用oracle存儲過程
#!/bin/sh
sqlplusabc/passwd<<EOF
setlinesize500;
setpagesize10000;
spooloutput.txt
calla1();
calla2();
calla3();
commit;
spooloff
quit;
EOF
大概就是這個方式。
需要修改一下oracle用戶密碼,如果存儲過程有參數還需要修改調用的地方。