Oracle 动态SQL接受表列作为过程中的输入
嘿,我正在尝试编写一个过程,在这个过程中,用户可以Oracle 动态SQL接受表列作为过程中的输入,oracle,plsql,runtime-error,dynamic-sql,procedure,Oracle,Plsql,Runtime Error,Dynamic Sql,Procedure,嘿,我正在尝试编写一个过程,在这个过程中,用户可以插入他希望作为参数输入的列。从现在开始,当我运行测试脚本时会出现以下错误: error -1 message error in ct_cu_act_medrecon_pg.spm_search_patientmedrecs =>ORA-00933: SQL command not properly ended 错误是指select语句中的order by部分,当我删除该部分时,我会收到一个错误,说明: error -1 message e
插入他希望作为参数输入的列。从现在开始,当我运行测试脚本时
会出现以下错误:
error -1 message error in ct_cu_act_medrecon_pg.spm_search_patientmedrecs =>ORA-00933: SQL command not properly ended
错误是指select语句中的order by
部分,当我删除该部分时,我会收到一个错误,说明:
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;
首先,我知道我如何处理错误并不是最好的方法,但这正是要求我这样做的人想要的
现在我不知道在oraclepl/SQL
中是否可以这样做,但如果是这样,我将非常感谢您的帮助,为我指明正确的方向。如果你们需要更多的信息,请随意询问,我会尽我所能提供帮助(我只使用SQL和PL/SQL两个月)。提前感谢。动态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;
啊哈,很有趣,让我来看看这是怎么回事。感谢您及时的回复,并为我清理动态sql。@Alex-我确实说过“类似这样的事情”:)谢谢您帮我整理!