如何将OUT参数从过程返回到shell脚本?

时间:2014-05-20 10:42:29

标签: oracle

我创建了一个程序:

CREATE OR REPLACE PROCEDURE PM_OWN.emav_input_check(last_bus_day IN DATE,
    price_date IN DATE, o_param OUT NUMBER)
AS

bbg_yest       NUMBER;
bbg_today      NUMBER;
drates_yest    NUMBER;

BEGIN

SELECT COUNT (*) INTO bbg_yest
FROM Crd_Own.Bbg_Oiv v
WHERE asof_date = TO_DATE ('last_bus_day', 'mm/dd/yyyy');

SELECT COUNT (*) INTO bbg_today
FROM Crd_Own.Bbg_Oiv
WHERE asof_date = TO_DATE ('price_date', 'mm/dd/yyyy');

SELECT COUNT (*) INTO drates_yest
FROM pm_own.deposit_rates
WHERE     asof_date = TO_DATE ('last_bus_day', 'mm/dd/yyyy')

IF bbg_yest != 0
THEN
SELECT ( (bbg_today - bbg_yest) * 100) / bbg_yest INTO retval1
FROM DUAL;
ELSE
retval1 := 0;
END IF;

-----
-----
 retval := 0;

 IF retval1 < 0 AND ABS (retval1) > 20
 THEN
 retval := 1;
 ELSIF retval2 < 0 AND ABS (retval2) > 20
 THEN
 retval := 2;
 ELSIF retval3 < 0 AND ABS (retval3) > 20
 THEN
 retval := 3;
 ELSIF retval4 < 0 AND ABS (retval4) > 20
 THEN
 retval := 4;
 END IF;
 o_param := retval;
END;

这个基本过程返回一些值,并从一些shell脚本调用过程。

 #!/bin/sh

 last_bus_day=`adjust_business_date -date $price_date -adj -1 -adj_type D`

 ORAPWD=`cat /appl/${ENV_BASE}data/data/U/control/.xfile_${ORA_ENV_OP}`

 return_val=0

 job_id <<....END
 model_check=`sqlplus -s` <<....END
 ${ORA_ENV_OP}/${ORAPWD}@${ORACLE_SERVER}

 var return_val number;

 execute PM_OWN.emav_input_check($last_bus_day,$price_date,:return_val);

 commit;
 exit;

 ....END

我想在shell脚本中进一步使用存储过程返回的值。

我认为return_val获取过程返回的值,但是我如何在shell脚本中使用它作为$return_val

基本上我的程序是脚本的一部分:

 last_bus_day=`adjust_business_date -date $price_date -adj -1 -adj_type D`

 ORAPWD=`cat /appl/${ENV_BASE}data/data/U/control/.xfile_${ORA_ENV_OP}`

 job_id <<....END

 model_check=`sqlplus -s` <<....END

 ${ORA_ENV_OP}/${ORAPWD}@${ORACLE_SERVER}
 set heading off
 declare bbg_yest number;
 bbg_today number;
 drates_yest number;
 drates_today number;


 begin

 --Check 1
 select count(*) into bbg_yest
 from   Crd_Own.Bbg_Oiv v
 where  asof_date =  TO_DATE('$last_bus_day','mm/dd/yyyy');

select count(*) into bbg_today
from   Crd_Own.Bbg_Oiv v
 where  asof_date =  TO_DATE('$price_date','mm/dd/yyyy');

--Check 2
 select count(*) into drates_yest
 from   pm_own.deposit_rates
 where  asof_date = TO_DATE('$last_bus_day','mm/dd/yyyy') and currency_code in (' USD','EUR','GBP','JPY  ') AND    TERM_WEEKS = 0 AND MARKET = 'L' ORDER BY CURRENCY_CODE, TERM_MONTHS;

 --------
  -------and so on


 if retval1 < 0 and abs(retval1) > 20 then
    retval := 1;
  elsif retval2 < 0 and abs(retval2) > 20 then
   retval := 2;
elsif retval3 < 0 and abs(retval3) > 20 then
   retval := 3;
elsif retval4 < 0 and abs(retval4) > 20 then
   retval := 4;
end if;

dbms_output.put_line(retval);

end

....END

现在我用程序调用替换脚本中的代码。

1 个答案:

答案 0 :(得分:0)

简短的回答是,您可以在程序调用后打印出绑定变量,然后将像以前一样将其分配给model_check

var return_val number;
execute PM_OWN.emav_input_check($last_bus_day,$price_date,:return_val);
print return_val;

虽然您可能希望set feedback off,但是您没有看到“匿名阻止已完成”消息。

您不需要提交,因为该过程未进行任何更改。但这也意味着您可以将其创建为函数并返回值:

CREATE OR REPLACE FUNCTION PM_OWN.emav_input_check(last_bus_day IN DATE,
  price_date IN DATE)
RETURN NUMBER
AS
...
  END IF;
  RETURN retval;
END;
/

您的呼叫可以来自SQL,需要匿名阻止:

model_check=`sqlplus -l -s <<....END
${ORA_ENV_OP}/${ORAPWD}@${ORACLE_SERVER}
set feedback off
set heading off
set pagesize 0
select PM_OWN.emav_input_check($last_bus_day,$price_date) from dual;
exit;
....END`