我创建了一个程序:
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
现在我用程序调用替换脚本中的代码。
答案 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`