2013-02-08 3 views
1

이봐, 내가 테스트 스크립트를 실행할 때 PLSQL에서하지만 어떤 이유로 내 동적 SQL 블록에 paging를 추가하는 것을 시도하고 오류를 밖으로 : 여기 이 페이지 매김 오라클/PLSQL 오류에

ORA-00932: inconsistent datatypes: expected - got - 

내 절차 :

set serveroutput on 
    declare 
    type tempcursor is ref cursor; 
    v_cur_result tempcursor; 
    p_columnsort_in varchar2(50); 
    p_column1_in  varchar2(50); 
    p_column2_in  varchar2(50); 
    p_column3_in  varchar2(50); 
    p_column4_in  varchar2(50); 
    p_ascdesc_in   varchar2(50); 
    begin 
    spm_search_patientmedrecs 
    ('h.PRIMARYMEMBERPLANID', 
    'h.PRIMARYMEMBERPLANID', 
    'h.ASSIGNEDUSERID', 
    'd.MEMBERMEDRECONCILIATIONDETSKEY', 
    'd.GENERICNM', 
    'ASC', 
    v_cur_result 
    ); 
    loop 
     fetch v_cur_result into 
     p_column1_in,p_column2_in,p_column3_in,p_column4_in; 
     dbms_output.put_line('column 1: '||p_column1_in||' column 2: '||p_column2_in|| 
          ' column 3: '||p_column3_in||' column 4: '||p_column4_in); 
     exit when v_cur_result%notfound; 
    end loop; 
    end; 

내가 나던 이상 게시 오류가 이해가 : 여기

create or replace 
    procedure spm_search_patientmedrecs (
    p_columnsort_in  in varchar2, 
    p_column1_in   in varchar2, 
    p_column2_in   in varchar2, 
    p_column3_in   in varchar2, 
    p_column4_in   in varchar2, 
    p_ascdesc_in   in varchar2, 
    p_return_cur_out  out sys_refcursor 
    is 
    lv_sql    varchar2(32767); 
    lv_startnum  number:= 1; 
    lv_incrementby  number:= 20; 
    begin 
    lv_sql := '';  
     lv_sql := 'select * from (
        select /*+ first_rows(20) */ 
         '||p_column1_in||', 
         '||p_column2_in||', 
         '||p_column3_in||', 
         '||p_column4_in||', 
         row_number() over 
         (order by '||p_columnsort_in||' '||p_ascdesc_in||') rn 
        from membermedicalreconcilationhdr h, 
         membermedicalreconcilationdet d 
        where h.membermedreconciliationhdrskey = 
         d.membermedreconciliationhdrskey) 
        where rn between :lv_startnum and :lv_incrementby 
        order by rn'; 

     open p_return_cur_out for lv_sql; 
    end spm_search_patientmedrecs; 

내 테스트 스크립트입니다 나,하지만 나는 그 원인을 잠시 찾고 있었다. 누군가가 올바른 방향으로 나를 가리킬 수 있다면 그것은 많이 감사하게 될 것입니다, 미리 감사드립니다.

+0

인용 한 오류는 ORA-00932의 표준 양식입니다. 일반적으로'-'가 예상 된 실제 문자로 대체 될 것으로 기대합니다. 불행히도 그 정보는 없어졌습니다. –

답변

1

몇 가지 문제가 저에게 뛰어납니다.

  • 커서를 반환하는 데 사용하는 쿼리는 fetch 만 4 변수로 데이터를 가져 오는 당신의 동안 5 열 (당신이 전달하는 4 더하기 계산 rn)을 반환합니다. 4 개의 열만 반환하도록 쿼리를 수정하거나 테스트 스크립트를 수정하여 데이터를 5 개의 변수로 가져와야합니다.
  • 프로 시저에서 SQL 문에 바인드 변수가 있지만 커서를 열 때 바인드 변수를 전달하지 마십시오. 내 생각 엔 당신이 USING 절과 바인드 변수 전달이

뭔가를 원하는 것입니다

open p_return_cur_out 
    for lv_sql 
    using lv_startnum, lv_incrementby; 

아니라, 전체를 게시 도움이 될 것입니다있는 경우 더 errors--가있을 수 있습니다 오류의 행 번호를 포함한 스택 추적.

알고 있어야 할 몇 가지. p_columnsort_in이 고유 한 컬럼을 지정 발생하지 않는 정렬 순서가 완전히 지정되지 않았기 때문에

  • , 페이징 코드가 아니라 여러 페이지에 행 및/또는 표시 행을 놓칠 수 있습니다. 20 행과 21 행이 동일한 p_columnsort_in 값을 갖는 경우 첫 번째 쿼리에서 한 방향으로 정렬하고 두 번째 쿼리에서 다른 방법으로 정렬하면 21 번째 행이 첫 번째 및 두 번째 페이지에 나타나고 21 번째 행이 표시되지 않을 수 있습니다 어디서나.
  • 효율성이 문제가 될 경우 rownum을 사용하면 옵티마이 저가 일반적으로 rownum 조건자를 최적화 할 수 있기 때문에 이와 같은 분석 함수를 사용하는 것보다 효율적입니다.
+0

감사합니다. 오류가 발생한 가져 오기가있는 것 같습니다. 나는 그것을 추가해야 할 필요가 있다는 것을 결코 잊지 않았다. –

1
create or replace 
    procedure spm_search_patientmedrecs (
    p_columnsort_in  in varchar2, 
    p_column1_in   in varchar2, 
    p_column2_in   in varchar2, 
    p_column3_in   in varchar2, 
    p_column4_in   in varchar2, 
    p_ascdesc_in   in varchar2, 
    p_return_cur_out  out sys_refcursor 
    is 
    lv_sql    varchar2(32767); 
    lv_startnum  number:= 1; 
    lv_incrementby  number:= 20; 
    begin 
     lv_sql := 'select * from (
        select /*+ first_rows(20) */ 
         '||p_column1_in||', 
         '||p_column2_in||', 
         '||p_column3_in||', 
         '||p_column4_in||', 
         row_number() over 
         (order by '||p_columnsort_in||' '||p_ascdesc_in||') rn 
        from membermedicalreconcilationhdr h, 
         membermedicalreconcilationdet d 
        where h.membermedreconciliationhdrskey = 
         d.membermedreconciliationhdrskey) 
        where rn between :1 and :2 
        order by rn'; 
     open p_return_cur_out for lv_sql using lv_startnum, lv_incrementby; 
    end spm_search_patientmedrecs;