2013-02-06 68 views
0

嘿,我想寫一個過程,其中用戶可以insert他想獲得哪些列作爲parameter input。截至目前,當我運行一個測試script我得到這個錯誤:動態SQL接受表列作爲過程中的輸入

error -1 message error in ct_cu_act_medrecon_pg.spm_search_patientmedrecs =>ORA-00933: SQL command not properly ended 

錯誤是指的在order by部分在select statement,當我刪除,我得到一個錯誤說:

error -1 message error in ct_cu_act_medrecon_pg.spm_search_patientmedrecs =>ORA-00904: "D"."P_INSERTDT_IN": invalid identifier 

這裏是規格:

procedure spm_search_patientmedrecs (
    p_columnsort_in in varchar2, --which is sort column 
    p_medmed_in  in varchar2, --first column 
    p_planid_in  in varchar2, --second column 
    p_detmed_in  in varchar2, --third column 
    p_insertdt_in in varchar2, --fourth column 
    p_ascdesc_in  in varchar2, --asc or desc in order by 
    p_return_cur_out out sys_refcursor, 
    p_err_code_out out number, 
    p_err_mesg_out out varchar2 
); 

下面是該過程的身體:

procedure spm_search_patientmedrecs (
    p_columnsort_in in varchar2, 
    p_medmed_in  in varchar2, 
    p_planid_in  in varchar2, 
    p_detmed_in  in varchar2, 
    p_insertdt_in in varchar2, 
    p_ascdesc_in  in varchar2, 
    p_return_cur_out out sys_refcursor, 
    p_err_code_out out number, 
    p_err_mesg_out out varchar2) 
is 
    lv_sql   varchar2(32767); 
begin 
    lv_sql := ''; 
    lv_sql := 'select h.p_medmed_in, 
        h.p_planid_in, 
        d.p_detmed_in, 
        d.p_insertdt_in 
      from membermedicalreconcilationhdr h, 
        membermedicalreconcilationdet d 
      where h.membermedreconciliationhdrskey = 
        d.membermedreconciliationhdrskey 
      order by h.p_columnsort_in p_ascdesc_in'; 
    p_err_code_out := 0; 
    OPEN p_return_cur_out FOR lv_sql; 
exception 
    when others then 
    p_err_code_out := -1; 
    p_err_mesg_out := 'error in ct_cu_act_medrecon_pg.spm_search_patientmedrecs =>'||sqlerrm; 
end spm_search_patientmedrecs; 

這裏是我的測試腳本:

set serveroutput on 
declare 
    type tempcursor is ref cursor; 
    v_cur_result tempcursor; 
    errcode number; 
    errmesg varchar2(1000); 
begin 
    ct_cu_act_medrecon_pg.spm_search_patientmedrecs 
    ('primarymemberplanid', 
    'membermedreconciliationhdrskey', 
    'primarymemberplanid', 
    'membermedreconciliationdetskey', 
    'inserteddt', 
    'ASC', 
    v_cur_result, 
    errcode, 
    errmesg 
    ); 

-- dbms_output.put_line(v_cur_result); 
    dbms_output.put_line('error '||errcode||' message '||errmesg); 
end; 

首先,我知道我是如何HANDELING錯誤的心不是最好的方式做到這一點,但多數民衆贊成在問我的人如何做到這一點希望它。

現在我不知道這是否是Oracle PL/SQL中可能做的事情,但如果是這樣的話,我會非常感謝幫助我指出了正確的方向。如果你們需要任何更多的信息,請隨時詢問,我會盡我所能提供幫助(我只能使用SQL和PL/SQL兩個月)。提前致謝。

回答

2

動態SQL意味着組裝作爲SQL語句執行的字符串。你的字符串硬編碼參數名稱,而你實際需要的是參數的內容。

事情是這樣的:

lv_sql := 'select h.'||p_medmed_in||', 
        h.'||p_planid_in||', 
        d.'||p_detmed_in||', 
        d.'||p_insertdt_in||' 
      from membermedicalreconcilationhdr h, 
        membermedicalreconcilationdet d 
      where h.membermedreconciliationhdrskey = 
        d.membermedreconciliationhdrskey 
      order by h.'||p_columnsort_in||' '|| p_ascdesc_in; 
+0

AHHHH有趣,讓我看看這個,看看它是如何去。感謝您的及時響應,併爲我清理動態sql。 –

+0

看起來像它的工作,非常感謝你的幫助。 –

+0

@Alex - 我確實說過「類似這樣的東西」:)感謝您收拾我! – APC