错误: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-)感谢问题似乎已得到解决!谢谢你的帮助