我创建了一个过程并在此之后键入,我只是修改了过程光标中的一列并键入
Posted
技术标签:
【中文标题】我创建了一个过程并在此之后键入,我只是修改了过程光标中的一列并键入【英文标题】:I created a procedure and type after thast,i just modified a column in procedure cursor and type 【发布时间】:2019-08-26 06:11:46 【问题描述】:我创建一个过程并在编译后键入我只是在过程光标和类型中修改了一个列,但是当我尝试编译过程时它返回一个错误:
错误(94,65):PLS-00302:必须声明组件“请求”
代码:
--type creation code.
CREATE or REPLACE TYPE return_security_report AS OBJECT (
requestId NUMBER ,
room VARCHAR2(256),
firstName VARCHAR2(60),
lastName VARCHAR2(60),
CONSTRUCTOR FUNCTION return_security_report RETURN SELF AS RESULT
);
/
CREATE OR REPLACE TYPE BODY return_security_report AS
CONSTRUCTOR FUNCTION return_security_report RETURN SELF AS RESULT AS
BEGIN
SELF.requestId := NULL;
SELF.room := NULL;
SELF.firstName := NULL;
SELF.lastName := NULL;
RETURN;
END;
END;
/
CREATE TYPE return_security_arr_result AS VARRAY(10000) OF return_security_report;
/
---procedure code
create or replace PROCEDURE BIQ_SECURITY_REPORT
(out_chr_err_code OUT VARCHAR2,
out_chr_err_msg OUT VARCHAR2,
out_security_tab OUT return_security_arr_result ,
)
IS
l_chr_srcstage VARCHAR2 (200);
l_chr_biqtab VARCHAR2 (200);
l_chr_srctab VARCHAR2 (200);
l_chr_bistagtab VARCHAR2 (200);
l_chr_err_code VARCHAR2 (255);
l_chr_err_msg VARCHAR2 (255);
l_out_chr_errbuf VARCHAR2 (2000);
lrec return_security_report;
CURSOR cur_security_data IS
SELECT
"ID" "requestId",
"ROOM" "room",
"FIRST_NAME" "FIRST_NAME",
"LAST_NAME" "LAST_NAME",
FROM
"BI_REQUEST_CATERING_ACTIVITY" ;
TYPE rec_security_data IS TABLE OF cur_security_data%ROWTYPE
INDEX BY PLS_INTEGER;
l_cur_security_data rec_security_data;
begin
OPEN cur_security_data;
LOOP
FETCH cur_security_data
BULK COLLECT INTO l_cur_security_data
LIMIT 1000;
EXIT WHEN l_cur_security_data.COUNT = 0;
lrec := return_security_report();
out_security_tab := return_security_arr_result(return_security_report());
out_security_tab.delete;
FOR i IN 1 .. l_cur_security_data.COUNT
LOOP
-- dbms_output.put_line('Inside cursor ' );
BEGIN
l_num_counter := l_num_counter + 1;
lrec := return_security_report();
lrec.requestid := l_cur_security_data(i).requestId ; lrec.room := l_cur_security_data(i).room ; lrec.firstName := l_cur_security_data(i).firstName ;
-- lrec.lastName := l_cur_security_data(i).lastName ;
IF l_num_counter > 1
THEN
out_security_tab.extend();
out_security_tab(l_num_counter) := return_security_report();
ELSE
out_security_tab := return_security_arr_result(return_security_report());
END IF;
out_security_tab(l_num_counter) := lrec;
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.PUT_LINE('Error occurred : ' || SQLERRM);
END;
END LOOP;
END LOOP;
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.PUT_LINE ('HERE INSIIDE OTHERS' || SQLERRM);
END;
当我尝试更新类型中的文件名时,即使在修改程序之后,程序编译器也会出错。 请为此发布解决方案。
“错误”:- 像“错误(94,65):PLS-00302:必须声明组件'REQUESTID'”
【问题讨论】:
尝试寻找优化代码,因为我可以看到不必要的循环完成。您可以直接从查询中获取OUT
参数。
【参考方案1】:
这是 ORACLE 的行为。
您已将光标中的“requestId”定义为区分大小写,您只需要以区分大小写的方式使用它。
因此需要对代码进行以下更改:(其他变量相同)
lrec.requestId := l_cur_security_data(i)."requestId" ; -- use it with " (double qoutes)
或跟随唯一光标的变化而整个代码没有变化
CURSOR cur_security_data IS
SELECT
"ID" requestId, -- removed " (double qoutes) from all the alias
"ROOM" room,
"FIRST_NAME" FIRST_NAME,
"LAST_NAME" LAST_NAME
FROM
"BI_REQUEST_CATERING_ACTIVITY" ;
实际上,当您使用"
包装您的别名时,Oracle 会将其区分为大小写。
所以在你的情况下,“requestId”必须被称为区分大小写的方式。
您在分配右侧没有double quotes
指代它。所以实际上 oracle 将其视为LREC.REQUESTID := L_CUR_SECURITY_DATA(I).REQUESTID;
,但不知道名为:REQUESTID
的变量。
这纯粹是区分大小写/不区分变量名的错误。
对于甲骨文,
num1
和 "Num1"
分别是 NUM1
和 Num1
,两者是不同的。
干杯!!
【讨论】:
非常感谢...!它对我有用。我只有一个关于这个的问题,如果选择查询在游标中返回 0 条记录,我会收到一个错误,比如引用未初始化的游标,如何在此处处理该异常 时,以处理游标异常的“COMCOPY”> HO 这应该是另一个问题,并作为一个新问题提出,以避免单个线程混乱。 ***.com/questions/57653739/… 请尝试回答这个问题以上是关于我创建了一个过程并在此之后键入,我只是修改了过程光标中的一列并键入的主要内容,如果未能解决你的问题,请参考以下文章