0

ちょっと私は、ユーザーがinsert取得したい列をparameter input. 現在、テストを実行すると、次のscriptエラーが発生します。

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;

まず、エラーを処理する方法が最善の方法ではないことはわかっていますが、それが、私にこれを行うように求めている人が望んでいた方法です。

これが で実行できるかどうかはわかりませんがOracle PL/SQL、もしそうなら、私を正しい方向に向けるための助けをいただければ幸いです. さらに情報が必要な場合は、お気軽にお問い合わせください。できる限りお手伝いします (SQL と PL/SQL を使用して 2 か月しか経っていません)。前もって感謝します。

4

1 に答える 1

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;
于 2013-02-06T17:29:58.263 に答える