2013-02-08 74 views
1

嘿,我嘗試添加paging在PLSQL但出於某種原因,我的動態SQL塊,當我運行測試腳本就出現了錯誤:分頁中的Oracle/PLSQL錯誤

ORA-00932: inconsistent datatypes: expected - got - 

這裏是我的方法:

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; 

這裏是我的測試腳本:

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; 

我張貼以上犯規的錯誤是有意義的我,但我一直在尋找原因。如果任何人都可以指出我正確的方向,將非常感謝,提前感謝。

+0

您引用的錯誤是ORA-00932的規範形式;通常我會希望將'-'換成預期和得到的實際字符。不幸的是,你的信息已經丟失。 – 2013-02-12 02:54:59

回答

1

我遇到了一些問題。

  • 您使用返回遊標的查詢將返回5列(您通過4中加上計算rn),而您的fetch數據取到只有4個變量。您可能需要修改查詢以僅返回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值,那麼對第一個查詢進行一種排序並對第二個查詢進行另一種排序是完全合法的,因此第20行可能會顯示在第一個和第二個頁面上,而第21行可能不會顯示在任何地方。
  • 如果考慮到效率問題,那麼使用rownum最終可能比使用這樣的分析函數更有效,因爲優化程序通常可以更好地優化謂詞謂詞。
+0

謝謝,它看起來像是導致錯誤的提取。它從來沒有跨過我的腦海,我需要補充說。 – 2013-02-08 20:36:47

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;