2014-01-21 53 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作为隐藏文件并添加此条目 –