我有两个插入语句,如下面的A和B.我需要将这两个插入语句合并为一个,如语句C.我不喜欢重复的代码,例如语句A和B中的select部分。什么是正确的语句C的格式?请忽略动态查询语句,因为真正的语句选择部分非常复杂。
声明A:
insert into a
(firstname, lastname)
select t2.firstname, t3.lastname
from t1, t2, t3
where t1.t1_id = t2.t1_id
and t2.t2_id = t3.t2_id;
声明B:
insert into b
(personid)
select t1.personid
from t1, t2, t3
where t1.t1_id = t2.t1_id
and t2.t2_id = t3.t2_id;
陈述C:
insert into a
(firstname, lastname)
insert into b
(personid)
select t2.firstname, t3.lastname, t1.personid
from t1, t2, t3
where t1.t1_id = t2.t1_id
and t2.t2_id = t3.t2_id;
现实世界的原始陈述如下:
procedure allo_recipient(p_all_id number,
p_allo_type varchar2,
p_step_no number,
p_region varchar2,
p_don_reg_code varchar2,
p_med_urgent varchar2,
p_don_id number,
p_abo_ic varchar2,
p_multi_organ varchar2) is
begin
insert into all_pat_list
(apl_id,
all_id,
prod_id,
prior_seq_no,
org_code,
all_step_no,
pat_id,
pat_name,
sex,
dob,
ped_ind,
blood_typ,
home_prov_code,
home_town,
org_code_registered,
org_descrip_registered,
hosp_id,
mrn,
oldr_code,
current_wait_list_stat_code,
init_wait_list_stat_date,
dis_code_prim_diag,
dis_code_sec_diag,
cadaver_liv_ind,
weight,
height,
abdom_girth,
chest_circum,
chest_vert_right,
chest_vert_left,
chest_transverse,
cmv,
ebv,
hepatitis_b_surface_ant,
hepatitis_c,
prev_trnsplt_no,
all_step_descrip,
eff_date,
hcv_rna,
dsa_cur_unaccp1,
dsa_acc_unaccp1,
dsa_cur_indet1,
dsa_acc_indet1,
dsa_cur_unaccp2,
dsa_acc_unaccp2,
dsa_cur_indet2,
dsa_acc_indet2,
x_match_serum_date, -- to do: this field is use by old allocation report, it need determine keep or discard in the new report
x_match_b_cell_res_ind, -- to do: this field is use by old allocation report, it need determine keep or discard in the new report
x_match_t_cell_res_ind, -- to do: this field is use by old allocation report, it need determine keep or discard in the new report
current_pra, -- to do: this field is use by old allocation report, it need determine keep or discard in the new report
current_pra_date, -- to do: this field is use by old allocation report, it need determine keep or discard in the new report
peak_pra, -- to do: this field is use by old allocation report, it need determine keep or discard in the new report
peak_pra_date, -- to do: this field is use by old allocation report, it need determine keep or discard in the new report
kp_allocation_points,
cpra) --to do: c_pra need be replaced with new one in furture.
--3rd select: get all needed elements for all_pat_list
select apl_seq.nextval apl_id,
p_all_id all_id,
prod_id,
all_kp_prior_seq.nextval prior_seq_no,
org_code,
all_step_no,
pat_id,
pat_name,
sex,
dob,
ped_ind,
blood_typ,
home_prov_code,
home_town,
org_code_registered,
tttt_gen_pkg.get_org_type_desc(org_code_registered) org_descrip_registered,
hosp_id,
mrn,
tttt_gen_pkg.get_hosp_oldr_code(hosp_id) oldr_code,
current_wait_list_stat_code,
list_date init_wait_list_stat_date,
dis_code_prim_diag,
dis_code_sec_diag,
cadaver_liv_ind,
tttt_gen_pkg.get_latest_pat_weight(pat_id) weight,
tttt_gen_pkg.get_latest_pat_height(pat_id) height,
tttt_gen_pkg.get_latest_pat_abdom_girth(pat_id) abdom_girth,
tttt_gen_pkg.get_latest_pat_chest_circum(pat_id) chest_circum,
tttt_gen_pkg.get_latest_pat_chest_vr(pat_id) chest_vert_right,
tttt_gen_pkg.get_latest_pat_chest_vl(pat_id) chest_vert_left,
tttt_gen_pkg.get_latest_pat_chest_trans(pat_id) chest_transverse,
tttt_gen_pkg.get_latest_test_res(pat_id, 'CMV') cmv,
tttt_gen_pkg.get_latest_test_res(pat_id, 'EBV') ebv,
tttt_gen_pkg.get_latest_test_res(pat_id, 'HBSAG') hepatitis_b_surface_ant,
tttt_gen_pkg.get_latest_test_res(pat_id, 'HCV') hepatitis_c,
tttt_gen_pkg.get_prev_tx_count(pat_id, org_code) prev_trnsplt_no, --tttt_gen_pkg.get_prev_tx_count(pat_id, 1) prev_trnsplt_no,
tttt_gen_pkg.get_all_step_descrip(p_step_no, org_code) all_step_descrip, --tttt_gen_pkg.get_all_step_descrip(p_step_no, 1) all_step_descrip,
sysdate,
tttt_gen_pkg.get_latest_test_res(pat_id, 'HCV_RNA') hcv_rna,
null dsa_cur_unaccp1,
null dsa_acc_unaccp1,
null dsa_cur_indet1,
null dsa_acc_indet1,
null dsa_cur_unaccp2,
null dsa_acc_unaccp2,
null dsa_cur_indet2,
null dsa_acc_indet2,
null x_match_serum_date,
null x_match_b_cell_res_ind,
null x_match_t_cell_res_ind,
null current_pra,
null current_pra_date,
null peak_pra,
null peak_pra_date,
kp_allocation_points,
cpra
from (
-- 1st select: get basic elements of pat list for each step
select distinct prod.org_code,
p_step_no all_step_no,
p.pat_id,
p.last_name || ', ' || p.first_name || ' ' ||
p.middle_name pat_name,
p.sex,
p.dob,
decode(sign(months_between(sysdate, p.dob) / 12 - 18), -1, 'P', 'A') ped_ind,
p.blood_typ,
pr.prov_code_home home_prov_code,
pr.home_town,
pr.org_code org_code_registered,
pr.hosp_id,
pr.mrn,
tttt_gen_pkg.get_current_wls_code(prod_id) current_wait_list_stat_code,
tttt_gen_pkg.get_initial_wls_date(prod.prod_id) list_date, --init_wait_list_stat_date
dis_code_prim_diag,
dis_code_sec_diag,
cadaver_liv_ind,
pr.patr_id,
prod.prod_id,
tttt_kp_allocation.allocation_points(pr.patr_id, prod.org_code) kp_allocation_points,
null cpra
from pat p, temp_kp_pat_pool pr, pat_register_org_det prod
where p.pat_id = pr.pat_id
and pr.patr_id = prod.patr_id
and (p_allo_type, prod.org_code) in
(('K', '3'), ('K', '6'), ('P', '6')) -- ('K' => K; K/P; P) ('P' => K/P; P )
and (pr.patr_id not in
(select patr_id from temp_kp_used_patrid_pool)) -- filter out patr_id(s) which has been handled in previous steps
and pr.cadaver_liv_ind in ('B', 'D') --waiting for deceased and both.
and (((p_region = 'L') and
(tttt_gen_pkg.get_hosp_prov_code(pr.hosp_id) = 'ON') and
(tttt_gen_pkg.get_hosp_oldr_code(pr.hosp_id) =
p_don_reg_code)) or
((p_region = 'O') and
(tttt_gen_pkg.get_hosp_prov_code(pr.hosp_id) = 'ON') and
(tttt_gen_pkg.get_hosp_oldr_code(pr.hosp_id) !=
p_don_reg_code)) or
((p_region = 'P') and
(tttt_gen_pkg.get_hosp_prov_code(pr.hosp_id) = 'ON')) or
--((p_region = 'H') and
--(tttt_gen_pkg.get_hosp_prov_code(pr.hosp_id) != 'ON') and
--(tttt_gen_pkg.is_hsp_pat = 'Y')) or -- to do: need pat HSP flag to identify pat belongs to HSP
((p_region = 'NA') and (1 = 1)))
and (((p_med_urgent = 'Y') and
(tttt_gen_pkg.get_current_wls_code(prod.prod_id) = 'H')) or
((p_med_urgent = 'NA') and (1 = 1)))
and (((p_abo_ic = 'PI') and
(tttt_kp_allocation.kp_abo_c_i(p_don_id, pr.pat_id) = 'PI')) or
((p_abo_ic = 'I') and
(tttt_kp_allocation.kp_abo_c_i(p_don_id, pr.pat_id) = 'I')) or
((p_abo_ic = 'C') and
(tttt_kp_allocation.kp_abo_c_i(p_don_id, pr.pat_id) = 'C')) or
((p_abo_ic = 'NA') and (1 = 1)))
and (((p_multi_organ = 'Y') and
(pr.org_code in (10, 14, 15))) or
((p_multi_organ = 'NA') and (1 = 1)))
order by kp_allocation_points desc, cpra desc, list_date -- end of 1st select
); --end of 2rd select
使用“Ed Gibbs”解决方案的真实世界修改语句如下所示,但遗憾的是我收到了编译错误:
“PACKAGE BODY的编译错误tttt.tttt_KP_ALLOCATION
错误:PL / SQL:ORA-02287:此处不允许序列号 行:636 文字:all_kp_prior_seq.nextval prior_seq_no,
错误:PL / SQL:忽略SQL语句 行:574 文本:将all插入all_pat_list值
错误:提示:参数'p_loc_pro'已声明但从未在'run_kp_allo'中使用 行:847 文字:p_loc_pro varchar2, “
procedure allo_recipient(p_all_id number,
p_allo_type varchar2,
p_step_no number,
p_region varchar2,
p_don_reg_code varchar2,
p_med_urgent varchar2,
p_don_id number,
p_abo_ic varchar2,
p_multi_organ varchar2) is
begin
insert all into all_pat_list values
(apl_id,
all_id,
prod_id,
prior_seq_no,
org_code,
all_step_no,
pat_id,
pat_name,
sex,
dob,
ped_ind,
blood_typ,
home_prov_code,
home_town,
org_code_registered,
org_descrip_registered,
hosp_id,
mrn,
oldr_code,
current_wait_list_stat_code,
init_wait_list_stat_date,
dis_code_prim_diag,
dis_code_sec_diag,
cadaver_liv_ind,
weight,
height,
abdom_girth,
chest_circum,
chest_vert_right,
chest_vert_left,
chest_transverse,
cmv,
ebv,
hepatitis_b_surface_ant,
hepatitis_c,
prev_trnsplt_no,
all_step_descrip,
eff_date,
hcv_rna,
dsa_cur_unaccp1,
dsa_acc_unaccp1,
dsa_cur_indet1,
dsa_acc_indet1,
dsa_cur_unaccp2,
dsa_acc_unaccp2,
dsa_cur_indet2,
dsa_acc_indet2,
x_match_serum_date, -- to do: this field is use by old allocation report, it need determine keep or discard in the new report
x_match_b_cell_res_ind, -- to do: this field is use by old allocation report, it need determine keep or discard in the new report
x_match_t_cell_res_ind, -- to do: this field is use by old allocation report, it need determine keep or discard in the new report
current_pra, -- to do: this field is use by old allocation report, it need determine keep or discard in the new report
current_pra_date, -- to do: this field is use by old allocation report, it need determine keep or discard in the new report
peak_pra, -- to do: this field is use by old allocation report, it need determine keep or discard in the new report
peak_pra_date, -- to do: this field is use by old allocation report, it need determine keep or discard in the new report
kp_allocation_points,
cpra) --to do: c_pra need be replaced with new one in furture.
into temp_kp_used_patrid_pool values (patr_id)
--3rd select: get all needed elements for all_pat_list
select apl_seq.nextval apl_id,
p_all_id all_id,
prod_id,
all_kp_prior_seq.nextval prior_seq_no,
org_code,
all_step_no,
pat_id,
pat_name,
sex,
dob,
ped_ind,
blood_typ,
home_prov_code,
home_town,
org_code_registered,
tttt_gen_pkg.get_org_type_desc(org_code_registered) org_descrip_registered,
hosp_id,
mrn,
tttt_gen_pkg.get_hosp_oldr_code(hosp_id) oldr_code,
current_wait_list_stat_code,
list_date init_wait_list_stat_date,
dis_code_prim_diag,
dis_code_sec_diag,
cadaver_liv_ind,
tttt_gen_pkg.get_latest_pat_weight(pat_id) weight,
tttt_gen_pkg.get_latest_pat_height(pat_id) height,
tttt_gen_pkg.get_latest_pat_abdom_girth(pat_id) abdom_girth,
tttt_gen_pkg.get_latest_pat_chest_circum(pat_id) chest_circum,
tttt_gen_pkg.get_latest_pat_chest_vr(pat_id) chest_vert_right,
tttt_gen_pkg.get_latest_pat_chest_vl(pat_id) chest_vert_left,
tttt_gen_pkg.get_latest_pat_chest_trans(pat_id) chest_transverse,
tttt_gen_pkg.get_latest_test_res(pat_id, 'CMV') cmv,
tttt_gen_pkg.get_latest_test_res(pat_id, 'EBV') ebv,
tttt_gen_pkg.get_latest_test_res(pat_id, 'HBSAG') hepatitis_b_surface_ant,
tttt_gen_pkg.get_latest_test_res(pat_id, 'HCV') hepatitis_c,
tttt_gen_pkg.get_prev_tx_count(pat_id, org_code) prev_trnsplt_no, --tttt_gen_pkg.get_prev_tx_count(pat_id, 1) prev_trnsplt_no,
tttt_gen_pkg.get_all_step_descrip(p_step_no, org_code) all_step_descrip, --tttt_gen_pkg.get_all_step_descrip(p_step_no, 1) all_step_descrip,
sysdate,
tttt_gen_pkg.get_latest_test_res(pat_id, 'HCV_RNA') hcv_rna,
null dsa_cur_unaccp1,
null dsa_acc_unaccp1,
null dsa_cur_indet1,
null dsa_acc_indet1,
null dsa_cur_unaccp2,
null dsa_acc_unaccp2,
null dsa_cur_indet2,
null dsa_acc_indet2,
null x_match_serum_date,
null x_match_b_cell_res_ind,
null x_match_t_cell_res_ind,
null current_pra,
null current_pra_date,
null peak_pra,
null peak_pra_date,
kp_allocation_points,
cpra,
patr_id
from (
-- 1st select: get basic elements of pat list for each step
select distinct prod.org_code,
p_step_no all_step_no,
p.pat_id,
p.last_name || ', ' || p.first_name || ' ' ||
p.middle_name pat_name,
p.sex,
p.dob,
decode(sign(months_between(sysdate, p.dob) / 12 - 18), -1, 'P', 'A') ped_ind,
p.blood_typ,
pr.prov_code_home home_prov_code,
pr.home_town,
pr.org_code org_code_registered,
pr.hosp_id,
pr.mrn,
tttt_gen_pkg.get_current_wls_code(prod_id) current_wait_list_stat_code,
tttt_gen_pkg.get_initial_wls_date(prod.prod_id) list_date, --init_wait_list_stat_date
dis_code_prim_diag,
dis_code_sec_diag,
cadaver_liv_ind,
pr.patr_id,
prod.prod_id,
tttt_kp_allocation.allocation_points(pr.patr_id, prod.org_code) kp_allocation_points,
null cpra
from pat p, temp_kp_pat_pool pr, pat_register_org_det prod
where p.pat_id = pr.pat_id
and pr.patr_id = prod.patr_id
and (p_allo_type, prod.org_code) in
(('K', '3'), ('K', '6'), ('P', '6')) -- ('K' => K; K/P; P) ('P' => K/P; P )
and (pr.patr_id not in
(select patr_id from temp_kp_used_patrid_pool)) -- filter out patr_id(s) which has been handled in previous steps
and pr.cadaver_liv_ind in ('B', 'D') --waiting for deceased and both.
and (((p_region = 'L') and
(tttt_gen_pkg.get_hosp_prov_code(pr.hosp_id) = 'ON') and
(tttt_gen_pkg.get_hosp_oldr_code(pr.hosp_id) =
p_don_reg_code)) or
((p_region = 'O') and
(tttt_gen_pkg.get_hosp_prov_code(pr.hosp_id) = 'ON') and
(tttt_gen_pkg.get_hosp_oldr_code(pr.hosp_id) !=
p_don_reg_code)) or
((p_region = 'P') and
(tttt_gen_pkg.get_hosp_prov_code(pr.hosp_id) = 'ON')) or
--((p_region = 'H') and
--(tttt_gen_pkg.get_hosp_prov_code(pr.hosp_id) != 'ON') and
--(tttt_gen_pkg.is_hsp_pat = 'Y')) or -- to do: need pat HSP flag to identify pat belongs to HSP
((p_region = 'NA') and (1 = 1)))
and (((p_med_urgent = 'Y') and
(tttt_gen_pkg.get_current_wls_code(prod.prod_id) = 'H')) or
((p_med_urgent = 'NA') and (1 = 1)))
and (((p_abo_ic = 'PI') and
(tttt_kp_allocation.kp_abo_c_i(p_don_id, pr.pat_id) = 'PI')) or
((p_abo_ic = 'I') and
(tttt_kp_allocation.kp_abo_c_i(p_don_id, pr.pat_id) = 'I')) or
((p_abo_ic = 'C') and
(tttt_kp_allocation.kp_abo_c_i(p_don_id, pr.pat_id) = 'C')) or
((p_abo_ic = 'NA') and (1 = 1)))
and (((p_multi_organ = 'Y') and
(pr.org_code in (10, 14, 15))) or
((p_multi_organ = 'NA') and (1 = 1)))
order by kp_allocation_points desc, cpra desc, list_date -- end of 1st select
); --end of 2rd select
答案 0 :(得分:6)
正如Sebas所说,INSERT ALL
就是答案。您与“{1}}合并的”声明A“和”声明B“将如下所示:
INSERT ALL
另外,正如HLGEM指出的那样,隐式联接现在通常不受欢迎。以下是使用ANSI样式连接的方法:
INSERT ALL
INTO a VALUES (firstname, lastname)
INTO b VALUES (personid)
select t2.firstname, t3.lastname, t1.personid
from t1, t2, t3
where t1.t1_id = t2.t1_id
and t2.t2_id = t3.t2_id