2013-02-06 24 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