错误:PL/SQL:编译单元分析已终止?

错误:PL/SQL:编译单元分析已终止?,sql,oracle,plsql,Sql,Oracle,Plsql,继续在两个代码上获得相同的错误 DROP TABLE Date_Dimension CASCADE CONSTRAINTS ; CREATE TABLE Date_Dimension ( date_key NUMBER NOT NULL , full_date DATE , day_of_week NUMBER , day_num_in_month NUMBER , day_nu

继续在两个代码上获得相同的错误

DROP TABLE Date_Dimension CASCADE CONSTRAINTS ;

CREATE TABLE Date_Dimension
  (
    date_key             NUMBER NOT NULL ,
    full_date            DATE ,
    day_of_week          NUMBER ,
    day_num_in_month     NUMBER ,
    day_num_overall      NUMBER ,
    day_name             VARCHAR2 (9) ,
    day_abbrev           VARCHAR2 (3) ,
    week_num_in_year     NUMBER ,
    week_num_overall     NUMBER ,
    week_begin_date      DATE ,
    MONTH                NUMBER ,
    month_number_overall NUMBER ,
    month_name           VARCHAR2 (9) ,
    month_abbrev         VARCHAR2 (3) ,
    quarter              NUMBER ,
    YEAR                 VARCHAR2 (20) ,
    century              NUMBER
  ) ;
ALTER TABLE Date_Dimension ADD CONSTRAINT Date_Dimension_PK PRIMARY KEY ( date_key ) ;

Create or replace PROCEDURE sp_DATE_DIMENSION(v_STARTDATE IN INT, v_END_YEAR IN INT) IS

v_STARTDATE DATE;
v_ENDDATE DATE;

v_STARTDATE Date := to_date('2005/01/01' || v_START_YEAR, 'YYYY/MM/DD');
v_ENDDATE Date := to_date('2020/12/31' || v_END_YEAR,'YYYY/MM/DD');

BEGIN

INSERT INTO

  Date_Dimension 
  (date_key,full_date, day_of_week, day_num_in_month, day_num_overall, day_name, day_abbrev, week_num_in_year, week_num_overall, month, month_name, month_abbrev, quarter, year, century)

VALUES
  (
 '1',TO_DATE(v_STARTDATE, 'yyyy/mm/dd'), TO_NUMBER(v_STARTDATE, 'D'), TO_NUMBER(v_STARTDATE, 'DD'), TO_NUMBER(v_STARTDATE, 'DDD'), TO_CHAR(v_STARTDATE, 'DAY'), TO_CHAR(v_STARDATE, 'DY'), TO_NUMBER(v_STARTDATE, 'IW'), TO_NUMBER(v_STARTDATE, 'WW'), TO_NUMBER(v_STARTDATE, 'MM'), TO_CHAR (v_STARTDATE, 'MONTH'), TO_CHAR (v_STARTDATE, 'MON'), TO_NUMBER (v_STARTDATE, 'Q'), TO_CHAR (v_STARTDATE, 'YEAR'), TO_NUMBER (v_STARTDATE, 'CC') 
  )
;

IF v_STARTDATE > v_ENDDATE THEN

  DBMS_OUTPUT.PUT_LINE ('ERROR IN CODE REGARDING DATES CHOSEN');

ELSE

    WHILE v_STARTDATE <= V_ENDDATE LOOP 
        DBMS_OUTPUT.PUT_LINE ('Date : '||to_char(v_StartDate,'YYYY / MM / DD'));

        v_STARTDATE := v_STARTDATE + 1;

    END LOOP;
END IF;
END;
删除表日期\维度级联约束;
创建表日期维度
(
日期\u密钥编号不为空,
完整日期,
周数的第天,
日数月数,
日数总数,
day_name VARCHAR2(9),
day_abbrev VARCHAR2(3),
周数年数,
周数总人数,
周开始日期日期,
月数,
月份\数量\总数,
月份名称VARCHAR2(9),
第2(3)个月,
季度号,
第2年(20),
世纪号
) ;
更改表日期\维度添加约束日期\维度\主键(日期\键);
创建或替换过程sp_DATE_维度(v_STARTDATE IN INT,v_END_YEAR IN INT)为
v_开始日期;
v_结束日期;
开始日期:=截止日期('2005/01/01'|开始年份,'YYYY/MM/DD');
截止日期:=截止日期('2020/12/31'|截止年份,'YYYY/MM/DD');
开始
插入
日期维度
(日期、完整日期、周中的日、月中的日、总的日、日名称、日缩写、年中的周、总的周、月名称、月缩写、季度、年、世纪)
价值观
(
“1”、截止日期(v_STARTDATE,'yyyy/mm/dd')、截止编号(v_STARTDATE,'D')、截止编号(v_STARTDATE,'dd')、截止字符(v_STARTDATE,'DDD')、截止字符(v_STARTDATE,'DAY')、截止字符(v_STARTDATE,'DY')、截止编号(v_STARTDATE,'IW')、截止数字(v_STARTDATE,'WW')、截止字符(v_STARTDATE,'mm')、截止字符(v_STARTDATE,'MONTH,'MONTH,'v')(v_STARTDATE,'Q')、TO_CHAR(v_STARTDATE,'YEAR')、TO_NUMBER(v_STARTDATE,'CC'))
)
;
如果开始日期>结束日期,则
DBMS_OUTPUT.PUT_行('与所选日期有关的代码错误');
其他的
当v_STARTDATE时,您的代码

PLS-00410:记录、表格或参数列表中不允许有重复字段

您已将过程的格式参数列表中的名称
startdate
复制为局部变量,然后再次重复这两个变量。我认为您的意思是正式参数仅为年份,因为它是一个数字。您对日期的转换也是错误的:

to_date('2005/01/01' || v_START_YEAR, 'YYYY/MM/DD')
…没有意义,因为您已经对2005年进行了硬编码

我认为在这一部分,你需要的是:

create or replace PROCEDURE sp_DATE_DIMENSION(p_START_YEAR IN NUMBER, p_END_YEAR IN NUMBER) IS
  l_START_DATE Date := to_date(p_START_YEAR ||'-01-01', 'YYYY-MM-DD');
  l_END_DATE Date := to_date(p_END_YEAR ||'-01-01', 'YYYY-MM-DD');
BEGIN
  INSERT INTO Date_Dimension (date_key, full_date, day_of_week, day_num_in_month,
    day_num_overall, day_name, day_abbrev, week_num_in_year, week_num_overall,
    month, month_name, month_abbrev, quarter, year, century)
  VALUES (1,
    l_START_DATE,
    TO_NUMBER(TO_CHAR(l_START_DATE, 'D')),
    TO_NUMBER(TO_CHAR(l_START_DATE, 'DD')),
    TO_NUMBER(TO_CHAR(l_START_DATE, 'DDD')),
    TO_CHAR(l_START_DATE, 'DAY'),
    TO_CHAR(l_START_DATE, 'DY'),
    TO_NUMBER(TO_CHAR(l_START_DATE, 'IW')),
    TO_NUMBER(TO_CHAR(l_START_DATE, 'WW')),
    TO_NUMBER(TO_CHAR(l_START_DATE, 'MM')),
    TO_CHAR(l_START_DATE, 'MONTH'),
    TO_CHAR(l_START_DATE, 'MON'),
    TO_NUMBER(TO_CHAR(l_START_DATE, 'Q')),
    TO_CHAR (l_START_DATE, 'YEAR'),
    TO_NUMBER(TO_CHAR(l_START_DATE, 'CC'))
  );
调整其他变量引用以匹配。在插入中,您将第一个值作为字符串
'1'
传递,而不是数字
1
。然后对已注明日期的变量调用
to_date()
;然后调用
to_number()
带有日期元素的格式掩码-用于那些需要转换为字符串,然后转换为数字的元素。因此,insert将变得更像:

create or replace PROCEDURE sp_DATE_DIMENSION(p_START_YEAR IN NUMBER, p_END_YEAR IN NUMBER) IS
  l_START_DATE Date := to_date(p_START_YEAR ||'-01-01', 'YYYY-MM-DD');
  l_END_DATE Date := to_date(p_END_YEAR ||'-01-01', 'YYYY-MM-DD');
BEGIN
  INSERT INTO Date_Dimension (date_key, full_date, day_of_week, day_num_in_month,
    day_num_overall, day_name, day_abbrev, week_num_in_year, week_num_overall,
    month, month_name, month_abbrev, quarter, year, century)
  VALUES (1,
    l_START_DATE,
    TO_NUMBER(TO_CHAR(l_START_DATE, 'D')),
    TO_NUMBER(TO_CHAR(l_START_DATE, 'DD')),
    TO_NUMBER(TO_CHAR(l_START_DATE, 'DDD')),
    TO_CHAR(l_START_DATE, 'DAY'),
    TO_CHAR(l_START_DATE, 'DY'),
    TO_NUMBER(TO_CHAR(l_START_DATE, 'IW')),
    TO_NUMBER(TO_CHAR(l_START_DATE, 'WW')),
    TO_NUMBER(TO_CHAR(l_START_DATE, 'MM')),
    TO_CHAR(l_START_DATE, 'MONTH'),
    TO_CHAR(l_START_DATE, 'MON'),
    TO_NUMBER(TO_CHAR(l_START_DATE, 'Q')),
    TO_CHAR (l_START_DATE, 'YEAR'),
    TO_NUMBER(TO_CHAR(l_START_DATE, 'CC'))
  );
对错误消息使用
dbms\u output
不是一种好的做法,因为(a)调用程序没有其他错误指示,并且(b)即使在简单的客户端调用中,用户也可能没有捕获或显示这些错误。最好抛出一个异常:

  IF l_START_DATE > l_END_DATE THEN
    RAISE_APPLICATION_ERROR (-20001, 'ERROR IN CODE REGARDING DATES CHOSEN');
  END IF;

  WHILE l_START_DATE <= l_END_DATE LOOP
    DBMS_OUTPUT.PUT_LINE ('Date : ' || to_char(l_START_DATE, 'YYYY / MM / DD'));
    l_START_DATE := l_START_DATE + 1;
  END LOOP;
END;
/
如果开始日期>结束日期,则
引发应用程序错误(-20001,“与所选日期有关的代码错误”);
如果结束;

当l_START_DATE时,错误是什么,它出现在哪里?您使用的是哪一个客户端?除了初始终止消息之外,应该有某种方法可以看到实际错误的出现-可能在IDE的另一个窗口或部分中;或者通过类似SQL*Plus“
显示错误”
;或者通过查询
用户错误作为回退rs
,它保存所有存储的PL/SQL代码的所有未解决错误。如果您可以看到其中一个错误,您应该也可以看到其他错误…Oracle SQL Developer返回错误消息,不允许我查看错误的确切位置SQL Developer在编译器日志窗口中显示PLS-00410,或者如果您看到
s如何处理工作表中的错误
。它指向该错误的第1行-基本上,我猜它很早就放弃了解析PL/SQL的尝试。虽然错误消息是可用的,但您只需要解释它*8-)感谢问题似乎已得到解决!谢谢你的帮助