실행시 내 프로 시저에 다음 오류가 발생합니다.
Error starting at line : 1 in command -
exec p_matrika(2010,2.5,'26311330')
Error report -
ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'P_MATRIKA'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
프로 시저가 오류없이 컴파일됩니다. 나는 또한 SQL 문을 확인했고 제대로 작동하여 1 행을 반환하므로 프로 시저 자체에서 뭔가 잘못하고있는 것 같습니다. SQL 문 형식이 약간 엉망이 된 것에 대해 사과드립니다. 복사해서 붙여 넣었을 때 엉망진창입니다.
create or replace PROCEDURE P_MATRIKA
(
leto IN NUMBER,
rating IN NUMBER,
davcna IN VARCHAR2,
unsec_out OUT NUMBER,
supp_out OUT NUMBER,
sec_out OUT NUMBER,
unsec_limit OUT NUMBER,
supp_limit OUT NUMBER,
sec_limit OUT NUMBER,
unsec_tenor OUT NUMBER,
supp_tenor OUT NUMBER,
sec_tenor OUT NUMBER
)
AS
out_unsec NUMBER;
out_supp NUMBER;
out_sec NUMBER;
limit_unsec NUMBER;
limit_supp NUMBER;
limit_sec NUMBER;
tenor_unsec NUMBER;
tenor_supp NUMBER;
tenor_sec NUMBER;
BEGIN
with
matrika_osnova
as
(
select distinct a.par_davcna, nvl(a.unsecured,0) unsec_out,
nvl(a.supported,0) supp_out, nvl(a.secured,0) sec_out,
x.tip_sub, x.cispri, x.kraban, x.dolfinobv,
y.ltv_tip, y.rating, y.unsec_pct, q.supp_pct,
w.sec_pct, p.unsec_maxznes, s.sec_maxznes,
case when y.unsec_pct * nvl(x.cispri,0) > nvl(p.unsec_maxznes,0) then
nvl(p.unsec_maxznes,0) - nvl(x.kraban,0) + (nvl(x.dolfinobv,0)/5)
else
case when y.unsec_pct * nvl(x.cispri,0) -
nvl(x.kraban,0) + (nvl(x.dolfinobv,0)/5) < 0 then
0
else
y.unsec_pct * nvl(x.cispri,0) - nvl(x.kraban,0) +
(nvl(x.dolfinobv,0)/5)
end
end unsec_max,
case when q.supp_pct * nvl(x.cispri,0) > nvl(s.sec_maxznes,0) then
nvl(s.sec_maxznes,0) - nvl(x.kraban,0) + (nvl(x.dolfinobv,0)/5)
else
case when q.supp_pct * nvl(x.cispri,0) - nvl(x.kraban,0) +
(nvl(x.dolfinobv,0)/5) < 0 then
0
else
q.supp_pct * nvl(x.cispri,0) - nvl(x.kraban,0) +
(nvl(x.dolfinobv,0)/5)
end
end supp_max,
case when w.sec_pct * nvl(x.cispri,0) > nvl(s.sec_maxznes,0) then
nvl(s.sec_maxznes,0) - nvl(x.kraban,0) + (nvl(x.dolfinobv,0)/5)
else
case when w.sec_pct * nvl(x.cispri,0) - nvl(x.kraban,0) +
(nvl(x.dolfinobv,0)/5) < 0 then
0
else
w.sec_pct * nvl(x.cispri,0) - nvl(x.kraban,0) +
(nvl(x.dolfinobv,0)/5)
end
end sec_max,
d.unsec_tenor, e.supp_tenor, f.sec_tenor
from sco_matrika_banka a
inner join
(select b.tip_sub, b.par_davcna, b.cispri, b.kraban, b.dolfinobv
from scoring_gvin b
where b.leto = leto) x --IN parameter
on a.par_davcna = x.par_davcna
inner join
(select a.tip_sub, a.ltv_tip,
a.max_znesek unsec_maxznes
from sco_sif_ltv_maxznes a
where a.ltv_tip = 1) p
on x.tip_sub = p.tip_sub
inner join
(select a.tip_sub, a.ltv_tip,
a.max_znesek sec_maxznes
from sco_sif_ltv_maxznes a
where a.ltv_tip = 3) s
on x.tip_sub = s.tip_sub
inner join
(select a.tip_sub, a.ltv_tip,
a.rating, a.ltv_pct unsec_pct
from sco_sif_ltv_pct a
where a.ltv_tip = 1
and a.rating = rating) y --IN parameter
on x.tip_sub = y.tip_sub
inner join
(select a.tip_sub, a.ltv_tip,
a.rating, a.ltv_pct supp_pct
from sco_sif_ltv_pct a
where a.ltv_tip = 2
and a.rating = rating) q --IN parameter
on x.tip_sub = y.tip_sub
inner join
(select a.tip_sub, a.ltv_tip,
a.rating, a.ltv_pct sec_pct
from sco_sif_ltv_pct a
where a.ltv_tip = 3
and a.rating = rating) w --IN parameter
on x.tip_sub = y.tip_sub
inner join
(select a.tip_sub, a.tenor unsec_tenor
from sco_sif_ltv_tenor a
where a.ltv_tip = 1) d
on x.tip_sub = d.tip_sub
inner join
(select a.tip_sub, a.tenor supp_tenor
from sco_sif_ltv_tenor a
where a.ltv_tip = 2) e
on x.tip_sub = e.tip_sub
inner join
(select a.tip_sub, a.tenor sec_tenor
from sco_sif_ltv_tenor a
where a.ltv_tip = 3) f
on x.tip_sub = f.tip_sub
where a.par_davcna = davcna) --IN parameter
select a.unsec_out, a.supp_out, a.sec_out,
case when a.unsec_max - a.unsec_out < 0 then
0
else
a.unsec_max - a.unsec_out
end unsec_limit,
case when a.supp_max - a.supp_out < 0 then
0
else
a.supp_max - a.supp_out
end supp_limit,
case when a.sec_max - a.sec_out < 0 then
0
else
a.sec_max - a.sec_out
end sec_limit,
a.unsec_tenor, a.supp_tenor, a.sec_tenor
into
out_unsec, out_supp, out_sec, limit_unsec, limit_supp,
limit_sec, tenor_unsec, tenor_supp, tenor_sec
from matrika_osnova a;
unsec_out := out_unsec;
supp_out := out_supp;
sec_out := out_sec;
unsec_limit := limit_unsec;
supp_limit := limit_supp;
sec_limit := limit_sec;
unsec_tenor := tenor_unsec;
supp_tenor := tenor_supp;
sec_tenor := tenor_sec;
END P_MATRIKA;
프로 시저 구체화에 형식 매개 변수가있는 것과 동일한 수의 인수가 호출에 있어야합니다 (여기서는 기본값이 아닌 IN 매개 변수가없는 경우). 각 OUT 매개 변수에는 값을 입력하기 위해 호출자로부터 해당 변수가 있어야합니다. 프로 시저에는 12 개의 형식 매개 변수가 있습니다. 현재 3 개의 IN 매개 변수에 대한 값을 제공하고 있지만 9 개의 OUT 매개 변수를 허용하는 변수를 제공하지 않습니다.
호출과 동일한 익명 블록에 선언 된 로컬 PL / SQL 변수를 사용하거나-아마도 더 유용하고 C # 호출에 가깝게-바인드 변수를 사용할 수 있습니다.이 변수는 SQL * Plus 또는 SQL Developer (사용 기준)에서 exec
정의 할 수 있습니다. 다음 variable
명령으로 :
variable out_unsec NUMBER;
variable out_supp NUMBER;
variable out_sec NUMBER;
variable limit_unsec NUMBER;
variable limit_supp NUMBER;
variable limit_sec NUMBER;
variable tenor_unsec NUMBER;
variable tenor_supp NUMBER;
variable tenor_sec NUMBER;
exec p_matrika(2010, 2.5, '26311330', :out_unsec, :out_supp, :out_sec, -
:limit_unsec, :limit_supp, :limit_sec, :tenor_unsec, :tenor_supp, :tenor_sec);
print out_unsec
print out_supp
...
예를 들어 스크립트의 이후 코드에서 바인드 변수를 사용할 수 있으며 여기에서 호출을 통해 C #에서 사용할 수 있습니다.
SQL Developer가 반 자동화 할 수 있지만 테스트를 위해 설정하는 것은 약간 지저분합니다. 또한 항상 정확히 하나의 결과가 있다고 가정하지만 결과가 없거나 둘 이상인 경우 절차에서 예외가 발생합니다.
(부수적으로, 프로 시저에 지역 변수가 필요하지 않습니다. 쿼리는으로 직접 선택할 수 unsec_out
있으며 별도의 중간은 필요하지 않습니다 out_unsec
. 예 p_out_unsec
를 들어 형식 매개 변수 에 대한 이름 지정 규칙 , ans l_out_unsec
for 유지하기로 결정한 경우 로컬 변수. 사용하고 수정하는 것을 훨씬 쉽게 볼 수 있으며 현재 이름이 혼동되기 쉽습니다).
또 다른 방법은 대신 참조 커서를 사용하는 것입니다.
create or replace PROCEDURE P_MATRIKA
(
leto IN NUMBER,
rating IN NUMBER,
davcna IN VARCHAR2,
p_refcur OUT SYS_REFCURSOR
)
AS
BEGIN
OPEN p_refcur FOR
... your query
END;
그런 다음 다음을 수행 할 수 있습니다.
var refcur refcursor
exec p_matrika(2010, 2.5, '26311330', :refcur);
print refcur
또는 참조 커서를 반환하는 함수로 만들 수 있습니다. 그러면 C # 코드에서 바인딩 된 참조 커서를 다른 결과 집합처럼 처리 할 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다