Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 如何使用过程在事实表中插入数据_Oracle_Oracle Apex - Fatal编程技术网

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记录中的任何字段,这意味着您插入的所有行的字段都是相同的。这就是你真正想要的吗?