Oracle 절차-PLS-00306 : 잘못된 개수 또는 인수 유형

플린

실행시 내 프로 시저에 다음 오류가 발생합니다.

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_unsecfor 유지하기로 결정한 경우 로컬 변수. 사용하고 수정하는 것을 훨씬 쉽게 볼 수 있으며 현재 이름이 혼동되기 쉽습니다).

또 다른 방법은 대신 참조 커서를 사용하는 것입니다.

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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Oracle Stored Procedure PLS-00306 : 잘못된 개수 또는 인수 유형

PLS-00306 : Oracle SP 호출시 잘못된 수 또는 인수 유형

PLS-00306 : 'CREATE_PROGRAM'호출시 잘못된 수 또는 인수 유형

PLS-00306 : 'PUT_LINE'호출시 잘못된 수 또는 인수 유형

oci_execute(): ORA-06550: PLS-00306: 잘못된 수 또는 유형의 인수

Char Out 매개 변수 오류가있는 Oracle 저장 프로 시저 호출 PLS-00306 : 잘못된 수 또는 호출 인수 유형

PLS-00306 : 오라클 함수를 호출 할 때 잘못된 개수 또는 인수 유형

PLS-00306에 대한 알 수없는 이유 : 잘못된 수 또는 인수 유형

사용자 정의 유형을 사용하여 메모리 배열에 생성 - PLS-00306 잘못된 인수 수

Oracle SQL Developer에서 프로 시저를 호출하는 잘못된 수 또는 유형의 인수

'||' 호출 시 잘못된 수 또는 유형의 인수

고차 함수 인수 유형의 잘못된 유형 추론

올바른 매개 변수 이후에도 호출시 잘못된 인수의 수 또는 유형

올바른 매개 변수 이후에도 호출시 잘못된 인수의 수 또는 유형

ORA-06550 : 인수의 개수 또는 유형이 잘못되었습니다

함수를 만드는 동안 잘못된 개체 유형

SpringData Jpa를 사용하는 Oracle의 저장 프로 시저 호출시 인수의 개수 또는 유형이 잘못되었습니다.

반짝이는 verbatimTextOutput이있는 잘못된 인수 유형

잘못된 유형 인수: stringp, org-map-entries가 있는 nil

ODP.Net-사용자 정의 유형 매개 변수로 저장 프로 시저를 호출하면 ORA-06550 / PLS-00306이 발생합니다.

PMT 오류 : 잘못된 인수 개수 또는 잘못된 속성 할당

잘못된 인수 개수 또는 잘못된 속성 할당 : 'OracleNotification'

증분 할 잘못된 유형 인수

잘못된 첫 번째 인수 유형

setq : 잘못된 유형 인수 : listp 1

잘못된 유형의 인수 C

테이블 유형을 반환할 때 Oracle 함수의 잘못된 유형

프로 시저를 호출하는 동안 잘못된 수 또는 인수 유형 오류

"잘못된 유형 매개 변수 수"는 무엇을 의미합니까?