我创建了一个过程并在此之后键入,我只是修改了过程光标中的一列并键入

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" 分别是 NUM1Num1,两者是不同的。

干杯!!

【讨论】:

非常感谢...!它对我有用。我只有一个关于这个的问题,如果选择查询在游标中返回 0 条记录,我会收到一个错误,比如引用未初始化的游标,如何在此处处理该异常 时,以处理游标异常的“COMCOPY”> HO 这应该是另一个问题,并作为一个新问题提出,以避免单个线程混乱。 ***.com/questions/57653739/… 请尝试回答这个问题

以上是关于我创建了一个过程并在此之后键入,我只是修改了过程光标中的一列并键入的主要内容,如果未能解决你的问题,请参考以下文章

jQuery确定音频是不是播放完毕并在此之后触发功能

路由表中的环回

为啥我可以键入别名函数并在不强制转换的情况下使用它们?

用于预定义类创建的元类与继承

使用 NODEJS 键入时的密码验证

动态透视查询查看/存储过程?