如何使用oracle程序将数据从多个表中插入一个表中
Posted
技术标签:
【中文标题】如何使用oracle程序将数据从多个表中插入一个表中【英文标题】:How to insert data into one table from multiple table using oracle procedure 【发布时间】:2011-11-30 07:07:04 【问题描述】:我有 6 个不同的表,它们相互依赖。我正在尝试将所有这 6 个表中的选定列插入到一个表中。
我必须传递一个参数以根据表格的输出从一个表格中选择数据,以获取表格数据。如果没有记录匹配,则应传递 null。
我正在尝试使用 6 个光标编写一个过程,并将一个光标的值传递给其他光标。
请有人帮助我实现这一目标。
这是我的表的简化版本
Table Name table type
========== ==========
CRM_CLAIM_INT_DETAILS_VIEW Linked_Table
INTRFC_MOTOR_NOTIFICATION_VIEW Linked_Table
Intrfc_Motor_Office_Master Linked_Table
INTRFC_MOTOR_RISK_VIEW Linked_Table
Intrfc_Policy_view Linked_Table
MO_CLAIM_MASTER Table
Selected Fields
===============
CRM_ACC_DATE_TIME,CRM_GEN_REP_NAME,CRM_SYSDATE
policy_number
Parent_office_name
CHASSIS_NO,ENGINE_NO,MAKE,MODEL,REGISTRATION_NO
AGENT_NAME,Branch_Office Description,Insured_Address,Insured_Name,PRODUCT_CODE,RISK_START_DATE,RISK_START_TIME
claim_no,DATE_OF_NOTIFICATION,notified_by,VEHICLE_TYPE
Condition
=========
mo_claim_master.crm_sl_no = CRM_CLAIM_INT_DETAILS_VIEW.crm_sl_no
INTRFC_MOTOR_NOTIFICATION_VIEW.claim_no = mo_claim_master.claim_no
intrfc_policy_view.branch_office_code = Intrfc_Motor_Office_Master.office_code
INTRFC_MOTOR_RISK_VIEW.refernce_num = intrfc_policy_view.num_reference_num
intrf_notification_view.refernce_num = intrfc_policy_view.num_reference_num
claim_ref_no=:claim_ref_no
插入 CFT_Table
我已经为此创建了一个过程,但我仍然无法获得空值。 这是获得此输出 pl 的正确方法吗?建议我。
CREATE OR REPLACE
PROCEDURE TEST(
para_claim_ref_no IN VARCHAR2 )
AS
CURSOR c1
IS
SELECT claim_no,
DATE_OF_NOTIFICATION,
VEHICLE_TYPE,
notified_by,
notif_crm_sl_no
FROM mo_claim_master
WHERE claim_ref_no=para_claim_ref_no;
t1 c1%rowtype;
claim_num_var VARCHAR2(50);
notif_crm_sl_no_var NUMBER;
CURSOR c2
IS
SELECT policy_num,
reference_num
FROM INTRFC_MOTOR_NOTIFICATION_VIEW
WHERE claim_no=claim_num_var;
t2 c2%rowtype;
num_reference_num_var NUMBER;
CURSOR c3
IS
SELECT BRANCH_OFFICE_CODE,
Branch_Office_Desc,
Insured_Name,
Insured_Address,
RISK_START_DATE,
RISK_START_TIME,
PRODUCT_CODE,
AGENT_NAME
FROM intrfc_policy_view
WHERE num_reference_number=num_reference_num_var;
t3 c3%rowtype;
branch_office_code_var VARCHAR2(30);
CURSOR c4
IS
SELECT OFFICE_CODE
FROM INTRFC_MOTOR_OFFICE_MASTER
WHERE office_code = branch_office_code_var;
t4 c4%rowtype;
CURSOR c5
IS
SELECT MAKE,
MODEL,
ENGINE_NO,
CHASSIS_NO,
REGISTRATION_NO
FROM INTRFC_MOTOR_RISK_VIEW
WHERE reference_num=num_reference_num_var;
t5 c5%rowtype;
CURSOR c6
IS
SELECT CRM_ACC_DATE_TIME,
CRM_GEN_REP_NAME
FROM CRM_CLAIM_INT_DETAILS_VIEW
WHERE crm_slno=notif_crm_sl_no_var;
t6 c6%rowtype;
BEGIN
OPEN c1;
FETCH c1 INTO t1;
CLOSE c1;
claim_num_var := t1.claim_no;
notif_crm_sl_no_var := t1.notif_crm_sl_no;
OPEN c2;
FETCH c2 INTO t2;
CLOSE c2;
num_reference_num_var := t2.reference_num;
OPEN c3;
FETCH c3 INTO t3;
CLOSE c3;
branch_office_code_var := t3.BRANCH_OFFICE_CODE;
OPEN c4;
FETCH c4 INTO t4;
CLOSE c4;
OPEN c5;
FETCH c5 INTO t5;
CLOSE c5;
OPEN c6;
FETCH c6 INTO t6;
CLOSE c6;
dbms_output.put_line(t1.claim_no);
dbms_output.put_line(t1.DATE_OF_NOTIFICATION);
dbms_output.put_line(t1.VEHICLE_TYPE);
dbms_output.put_line(t1.notified_by);
dbms_output.put_line(t2.policy_num);
dbms_output.put_line(t3.Branch_Office_Desc);
dbms_output.put_line(t3.Insured_Name);
dbms_output.put_line(t3.Insured_Address);
dbms_output.put_line(t3.RISK_START_DATE);
dbms_output.put_line(t3.RISK_START_TIME);
dbms_output.put_line(t3.PRODUCT_CODE);
dbms_output.put_line(t3.AGENT_NAME);
dbms_output.put_line(t4.office_code);
dbms_output.put_line(t5.MAKE);
dbms_output.put_line(t5.MODEL);
dbms_output.put_line(t5.ENGINE_NO);
dbms_output.put_line(t5.CHASSIS_NO);
dbms_output.put_line(t5.REGISTRATION_NO);
dbms_output.put_line(t6.CRM_ACC_DATE_TIME);
dbms_output.put_line(t6.CRM_GEN_REP_NAME);
END TEST;
【问题讨论】:
你确定你需要一个光标吗?我认为您可能只能使用带有外部连接的选择进行插入。不过,如果不了解更多关于您的桌子,就很难说。 如果您可以发布 DDL 来创建您的表格(或表格的简化版本)、DML 来插入一些示例数据以及对预期输出的解释,那将会很有帮助。我不确定我是否理解您要解决的问题。 我通过提供简化表格来编辑我的问题。我的输出应该是来自所有六个表中选定列的一条记录,应该插入到一个单独的表中。 您的游标不需要参数,这意味着您可能不需要它们,正如@flesk 所说。您可以将所有表连接在一起并直接插入。 【参考方案1】:没有人发布答案,所以我会在这里添加一个。
当您谈论多个游标时,听起来您想遍历每个游标中的每一行,并随时插入和更新。这是最糟糕的解决方案。你想要一个INSERT ... SELECT
。
Tom Kyte 在这里解释:Slow by slow...
我不打算在这里写整个插入语句,因为你有大量的表和列,但基本上你是基于 SELECT 创建一个 INSERT 语句:
INSERT INTO CFT_Table ( ... column names ... )
SELECT ( ... column names ... )
FROM MO_CLAIM_MASTER
LEFT JOIN Intrfc_Policy_view ON ( ... join condition ... )
LEFT JOIN INTRFC_MOTOR_RISK_VIEW ON (... join condition ... )
我使用 LEFT JOIN 是因为你说你想要 NULL 值。我假设 MO_CLAIM_MASTER 对于您要插入的每一行都有一行。
【讨论】:
以上是关于如何使用oracle程序将数据从多个表中插入一个表中的主要内容,如果未能解决你的问题,请参考以下文章
如何将数据从单个 csv/excel 文件传输到多个 oracle 表