Oracle 如何使用过程在事实表中插入数据
我尝试使用过程将数据从其他维度表插入到事实表中,但无法完成。有时它显示缺少表达式,有时它给出忽略的错误语句 我试着写这个查询,但没有成功Oracle 如何使用过程在事实表中插入数据,oracle,oracle-apex,Oracle,Oracle Apex,我尝试使用过程将数据从其他维度表插入到事实表中,但无法完成。有时它显示缺少表达式,有时它给出忽略的错误语句 我试着写这个查询,但没有成功 CREATE OR REPLACE PROCEDURE final_upload_fact AS CURSOR finally IS SELECT p.clean_project_key, u.cconsultant_key, c.stage_company_key, t.time_key
CREATE OR REPLACE PROCEDURE final_upload_fact AS
CURSOR finally IS
SELECT p.clean_project_key,
u.cconsultant_key,
c.stage_company_key,
t.time_key
FROM clean_project p
INNER JOIN clean_consultant u
ON p.clean_consultant_id = u.cldmch_id
INNER JOIN clean_company c
ON p.clean_company_id = c.stage_ldmch_id
INNER JOIN dim_time t
ON t.year = to_char(p.clean_estimated_end_date, 'yyyy')
OR t.year = to_char(p.clean_actual_end_date, 'yyyy');
BEGIN
FOR k IN finally
LOOP
INSERT INTO fact
(prjfinished_estimatedate,
hig_qual_consultant,
nooffeedbackless3,
noprjoverrunmnth,
fk1_dim_consultant_key,
fk2_time_key,
fk3_dim_project_key,
fk4_dim_company_key)
VALUES
(SELECT COUNT(dim_project_key)
FROM dim_project
WHERE dim_project_estimated_end_date <= dim_actual_end_date,
SELECT MAX(dim_highest_quality)
FROM dim_consultant,
SELECT COUNT(dim_feedbackvalue)
FROM dim_project
WHERE dim_feedbackvalue != 'N/A'
AND dim_feedbackvalue <= 3, SELECT COUNT(dim_project_key)
FROM dim_project,
k.cconsultant_key,
k.time_key,
k.clean_project_key,
k.stage_company_key);
END LOOP;
END;
/
问题是,在VALUES子句中,子查询周围没有括号 当您引用子查询时,需要将它们括在括号中,这将使您的代码看起来像:
CREATE OR REPLACE PROCEDURE final_upload_fact AS
CURSOR finally IS
SELECT p.clean_project_key,
u.cconsultant_key,
c.stage_company_key,
t.time_key
FROM clean_project p
INNER JOIN clean_consultant u
ON p.clean_consultant_id = u.cldmch_id
INNER JOIN clean_company c
ON p.clean_company_id = c.stage_ldmch_id
INNER JOIN dim_time t
ON t.year = to_char(p.clean_estimated_end_date, 'yyyy')
OR t.year = to_char(p.clean_actual_end_date, 'yyyy');
BEGIN
FOR k IN finally
LOOP
INSERT INTO fact
(prjfinished_estimatedate,
hig_qual_consultant,
nooffeedbackless3,
noprjoverrunmnth,
fk1_dim_consultant_key,
fk2_time_key,
fk3_dim_project_key,
fk4_dim_company_key)
VALUES
((SELECT COUNT(dim_project_key)
FROM dim_project
WHERE dim_project_estimated_end_date <= dim_actual_end_date),
(SELECT MAX(dim_highest_quality)
FROM dim_consultant),
(SELECT COUNT(dim_feedbackvalue)
FROM dim_project
WHERE dim_feedbackvalue != 'N/A'
AND dim_feedbackvalue <= 3),
(SELECT COUNT(dim_project_key)
FROM dim_project),
k.cconsultant_key,
k.time_key,
k.clean_project_key,
k.stage_company_key);
END LOOP;
END;
/
但是,通过将子查询移动到游标中,可以大大简化代码,这样就不需要在游标中循环,因为您可以按选择方式插入
假设您的子查询与您定义的游标没有任何关联,您可以这样重写整个过程:
CREATE OR REPLACE PROCEDURE final_upload_fact AS
INSERT INTO fact
(prjfinished_estimatedate,
hig_qual_consultant,
nooffeedbackless3,
noprjoverrunmnth,
fk1_dim_consultant_key,
fk2_time_key,
fk3_dim_project_key,
fk4_dim_company_key)
SELECT (SELECT COUNT(dim_project_key)
FROM dim_project
WHERE dim_project_estimated_end_date <= dim_actual_end_date) cnt_est_less_act_end_dt,
(SELECT MAX(dim_highest_quality)
FROM dim_consultant) max_highest_quality_consultant,
(SELECT COUNT(dim_feedbackvalue)
FROM dim_project
WHERE dim_feedbackvalue != 'N/A'
AND dim_feedbackvalue <= 3) feedback_cnt,
(SELECT COUNT(dim_project_key)
FROM dim_project) project_cnt,
p.clean_project_key,
u.cconsultant_key,
c.stage_company_key,
t.time_key
FROM clean_project p
INNER JOIN clean_consultant u
ON p.clean_consultant_id = u.cldmch_id
INNER JOIN clean_company c
ON p.clean_company_id = c.stage_ldmch_id
INNER JOIN dim_time t
ON t.year = to_char(p.clean_estimated_end_date, 'yyyy')
OR t.year = to_char(p.clean_actual_end_date, 'yyyy');
END final_upload_fact;
/
这样,您就可以删除原始过程在PL/SQL和SQL之间的所有上下文切换,即在PL/SQL中打开光标,切换到SQL以生成执行计划,返回PL/SQL以请求下一行,返回SQL以获取下一行,返回PL/SQL以将行存储在记录中,返回SQL以插入相关数据,返回PL/SQL以确定循环已经结束,因此请求下一行等等。问题在于,在VALUES子句中,子查询的周围没有括号 当您引用子查询时,需要将它们括在括号中,这将使您的代码看起来像:
CREATE OR REPLACE PROCEDURE final_upload_fact AS
CURSOR finally IS
SELECT p.clean_project_key,
u.cconsultant_key,
c.stage_company_key,
t.time_key
FROM clean_project p
INNER JOIN clean_consultant u
ON p.clean_consultant_id = u.cldmch_id
INNER JOIN clean_company c
ON p.clean_company_id = c.stage_ldmch_id
INNER JOIN dim_time t
ON t.year = to_char(p.clean_estimated_end_date, 'yyyy')
OR t.year = to_char(p.clean_actual_end_date, 'yyyy');
BEGIN
FOR k IN finally
LOOP
INSERT INTO fact
(prjfinished_estimatedate,
hig_qual_consultant,
nooffeedbackless3,
noprjoverrunmnth,
fk1_dim_consultant_key,
fk2_time_key,
fk3_dim_project_key,
fk4_dim_company_key)
VALUES
((SELECT COUNT(dim_project_key)
FROM dim_project
WHERE dim_project_estimated_end_date <= dim_actual_end_date),
(SELECT MAX(dim_highest_quality)
FROM dim_consultant),
(SELECT COUNT(dim_feedbackvalue)
FROM dim_project
WHERE dim_feedbackvalue != 'N/A'
AND dim_feedbackvalue <= 3),
(SELECT COUNT(dim_project_key)
FROM dim_project),
k.cconsultant_key,
k.time_key,
k.clean_project_key,
k.stage_company_key);
END LOOP;
END;
/
但是,通过将子查询移动到游标中,可以大大简化代码,这样就不需要在游标中循环,因为您可以按选择方式插入
假设您的子查询与您定义的游标没有任何关联,您可以这样重写整个过程:
CREATE OR REPLACE PROCEDURE final_upload_fact AS
INSERT INTO fact
(prjfinished_estimatedate,
hig_qual_consultant,
nooffeedbackless3,
noprjoverrunmnth,
fk1_dim_consultant_key,
fk2_time_key,
fk3_dim_project_key,
fk4_dim_company_key)
SELECT (SELECT COUNT(dim_project_key)
FROM dim_project
WHERE dim_project_estimated_end_date <= dim_actual_end_date) cnt_est_less_act_end_dt,
(SELECT MAX(dim_highest_quality)
FROM dim_consultant) max_highest_quality_consultant,
(SELECT COUNT(dim_feedbackvalue)
FROM dim_project
WHERE dim_feedbackvalue != 'N/A'
AND dim_feedbackvalue <= 3) feedback_cnt,
(SELECT COUNT(dim_project_key)
FROM dim_project) project_cnt,
p.clean_project_key,
u.cconsultant_key,
c.stage_company_key,
t.time_key
FROM clean_project p
INNER JOIN clean_consultant u
ON p.clean_consultant_id = u.cldmch_id
INNER JOIN clean_company c
ON p.clean_company_id = c.stage_ldmch_id
INNER JOIN dim_time t
ON t.year = to_char(p.clean_estimated_end_date, 'yyyy')
OR t.year = to_char(p.clean_actual_end_date, 'yyyy');
END final_upload_fact;
/
这样,您就可以删除原始过程在PL/SQL和SQL之间的所有上下文切换,即在PL/SQL中打开光标,切换到SQL以生成执行计划,返回PL/SQL以请求下一行,返回SQL以获取下一行,返回PL/SQL以将行存储在记录中,返回SQL以插入相关数据,返回PL/SQL以确定循环已经结束,从而请求下一行,等等,等等。mysql create语句中没有replace子句-您是在尝试将oracle转换为mysql,还是问题的标签错误?mysql的标签错误。忽略我您是否尝试独立运行该values子句?values子句中的子查询如何链接到光标?目前,您没有在这些子查询中引用k记录中的任何字段,这意味着您插入的所有行的字段都是相同的。这就是您真正想要的吗?mysql create语句中没有replace子句-您是在尝试将oracle转换为mysql,还是问题的标签错误?mysql的标签错误。忽略我您是否尝试独立运行该values子句?values子句中的子查询如何链接到光标?目前,您没有在这些子查询中引用k记录中的任何字段,这意味着您插入的所有行的字段都是相同的。这就是你真正想要的吗?