2014-01-21 55 views
0

請假設我有一個Oracle存儲過程與此簽名:Korn Shell腳本與Oracle

CREATE OR REPLACE PROCEDURE MY_PROC (
    INPUT01  IN  VARCHAR2, 
    INPUT02  IN  VARCHAR2, 
    INPUT03  IN  VARCHAR2, 
    INPUT04  IN  VARCHAR2, 
    OUTPUT01  OUT VARCHAR2, 
    OUTPUT02  OUT VARCHAR2, 
    OUTPUT03  OUT VARCHAR2 
) 

我需要寫一個KSH腳本,它具有以下四個輸入調用MY_PROC存儲過程:

./my_ksh.ksh input01 input02 input03 input04 

如果output01 = 0(該存儲過程的),然後我需要執行下面的SELECT語句:

SELECT COLUMN01||CHR(9)||COLUMN03 FROM MY_TABLE WHERE MY_COLUMN = INPUT01; 

將結果集假脫機文件稱爲「MYFILE_001-INPUT01-YYYYMMDD.csv」

其中YYYYMMDD是sysdate ... help!如果你可以的話!

回答

1

保存此作爲my_ksh.ksh

USER=your_user 
PASS=your_pass 
DB=your_db 


PARAM1=$1 
PARAM2=$2 
PARAM3=$3 
PARAM4=$4 

OUTPUT_SPOOL_FILE="MYFILE_001${PARAM1}-`date +%Y%m%d`.csv" 

sqlplus -S ${USER}/${PASS}@${DB} << ! >> $OUTPUT_SPOOL_FILE 
SET SERVEROUTPUT ON SIZE UNLIMITED; 

VAR EXITCODE NUMBER; 
VAR OUTPUT01 NUMBER; 
VAR OUTPUT03 NUMBER; 
VAR OUTPUT03 NUMBER; 

sqlplus_rc refcursor; 


DECLARE 
    l_output01 VARCHAR2(100); 
    l_output02 VARCHAR2(100); 
    l_output03 VARCHAR2(100); 

    l_input01 VARCHAR2(100) := '$PARAM1'; 
    l_input02 VARCHAR2(100) := '$PARAM2'; 
    l_input03 VARCHAR2(100) := '$PARAM3'; 
    l_input04 VARCHAR2(100) := '$PARAM4'; 

    rc sys_refcursor; 

BEGIN 
    MY_PROC('$PARAM1','$PARAM2','$PARAM3','$PARAM4',l_output01,l_output02,l_output03); 

    IF(l_output01 = 0) THEN 
    OPEN rc FOR 'SELECT COLUMN01||CHR(9)||COLUMN03 FROM MY_TABLE WHERE MY_COLUMN = :INPUT01' USING l_input01; 

    :sqlplus_rc := rc; 
    END IF; 
    :EXITCODE := SQLCODE; 
EXCEPTION 
WHEN OTHERS THEN 
    DBMS_OUTPUT.PUT_LINE(SQLERRM); 
    :EXITCODE := SQLCODE; 
END; 
/

print sqlplus_rc 

exit :EXITCODE 
! 
+0

USER =爲myuser PASS = MYPWD $ 1 DB =「(DESCRIPTION =(ADDRESS =(PROTOCOL = TCP)(HOST = MYSECRETHOST)(PORT = 1521))(CONNECT_DATA =(SERVICE_NAME = MY03SECR)))「 – UltraCommit

+0

無法解析tnsnames :(它包含圓括號... – UltraCommit

+0

在您的主目錄中有一個.tnsnames.ora作爲隱藏文件並添加此條目 –