Oracle PLS-00323子程序或游标';CPQ(数据)(处理)';在包规范中声明,并且必须在包体中定义

Oracle PLS-00323子程序或游标';CPQ(数据)(处理)';在包规范中声明,并且必须在包体中定义,oracle,plsql,Oracle,Plsql,添加新过程时,我似乎无法执行包体 有人能告诉我我遗漏了什么吗?例如,包裹的参考资料等 我努力想知道我错在哪里了 提前谢谢你的帮助 包装 CREATE OR REPLACE PACKAGE TEST.CPQ_QUOTE_DATA_API IS FUNCTION Check_Exist___ ( PROJECT_ID_ IN VARCHAR2, SUB_PROJECT_ IN VARCHAR2, ACTIVITY_ID_ IN VARCHAR2, ORDER_NO_ IN VARCH

添加新过程时,我似乎无法执行包体

有人能告诉我我遗漏了什么吗?例如,包裹的参考资料等

我努力想知道我错在哪里了

提前谢谢你的帮助

包装

    CREATE OR REPLACE PACKAGE TEST.CPQ_QUOTE_DATA_API IS



 FUNCTION Check_Exist___ (
PROJECT_ID_ IN VARCHAR2,
SUB_PROJECT_ IN VARCHAR2,
ACTIVITY_ID_ IN VARCHAR2,
ORDER_NO_ IN VARCHAR2,
PART_NO_ IN VARCHAR2) RETURN BOOLEAN;

    PROCEDURE CPQ_DATA_HANDLE___ ( 
    PROJECT_ID_ IN VARCHAR2,
    SUB_PROJECT_ IN VARCHAR2,
    ACTIVITY_ID_ IN VARCHAR2,
    ORDER_NO_ IN VARCHAR2,
    PART_NO_ IN VARCHAR2,
    QTY_ IN NUMBER,
    PRICE_COST_ IN NUMBER,
    GPARTCOST_ IN NUMBER,
    CPQ_DATE_ IN VARCHAR2,
    DATECREATED_ IN VARCHAR2);

END CPQ_QUOTE_DATA_API;
包体

CREATE OR REPLACE PACKAGE BODY TEST.CPQ_QUOTE_DATA_API IS

FUNCTION Check_Exist___ (
    PROJECT_ID_ IN VARCHAR2,
    SUB_PROJECT_ IN VARCHAR2,
    ACTIVITY_ID_ IN VARCHAR2,
    ORDER_NO_ IN VARCHAR2,
    PART_NO_ IN VARCHAR2) RETURN BOOLEAN
    IS
       dummy_ NUMBER;
       CURSOR exist_control IS
          SELECT 1
          FROM   CPQ_QUOTE_DATA_TAB
          WHERE PROJECT_ID_ = PROJECT_ID
          AND SUB_PROJECT_ = SUB_PROJECT
          AND ACTIVITY_ID_ = ACTIVITY_ID
          AND ORDER_NO_ = ORDER_NO
          AND PART_NO_ = PART_NO;
    BEGIN
       OPEN exist_control;
       FETCH exist_control INTO dummy_;
       IF (exist_control%FOUND) THEN
          CLOSE exist_control;
          RETURN(TRUE);
       END IF;
       CLOSE exist_control;
       RETURN(FALSE);
    END Check_Exist___;

PROCEDURE CPQ_DATA_HANDLE___  

as
   PROJECT_ID_    VARCHAR2(10 CHAR);
  SUB_PROJECT_   VARCHAR2(10 CHAR);
  ACTIVITY_ID_  VARCHAR2(10 CHAR);
  ORDER_NO_     VARCHAR2(12 CHAR);
  PART_NO_      VARCHAR2(25 CHAR);
  QTY_          NUMBER;
  PRICE_COST_    NUMBER;
  GPARTCOST_    NUMBER;
  CPQ_DATE_     VARCHAR2(50 CHAR);
  DATECREATED_  VARCHAR2(50 CHAR);

   CURSOR get_record IS 
      SELECT *
        FROM TEST.WTS_CPQ_DATA_TRANS_TAB; 

GetRec get_record%ROWTYPE;

BEGIN 

open get_record;
loop
fetch get_record into GetRec;

exit when get_record%NOTFOUND;

  PROJECT_ID_        :=  GetRec.PROJECT_ID; 
  SUB_PROJECT_       :=  GetRec.SUB_PROJECT;
  ACTIVITY_ID_       :=  GetRec.ACTIVITY_ID;
  ORDER_NO_          :=  GetRec.ORDER_NO;
  PART_NO_           :=  GetRec.PART_NO;
  QTY_               :=  GetRec.QTY; 
  PRICE_COST_        :=  GetRec.PRICE_COST;
  GPARTCOST_         :=  GetRec.GPARTCOST;
  CPQ_DATE_          :=  GetRec.CPQ_DATE;
  DATECREATED_      :=  GetRec.DATECREATED;

IF TEST.CPQ_QUOTE_DATA_API.CHECK_EXIST___(PROJECT_ID_, SUB_PROJECT_, ACTIVITY_ID_, ORDER_NO_, PART_NO_) = TRUE 

THEN 

insert into TEST.WTS_CPQ_ERROR_DATA

(PROJECT_ID,SUB_PROJECT,ACTIVITY_ID,ORDER_NO,PART_NO,QTY,PRICE_COST,GPARTCOST,CPQ_DATE,DATE_CREATED) 

VALUES

(PROJECT_ID_,SUB_PROJECT_,ACTIVITY_ID_,ORDER_NO_,PART_NO_,QTY_,PRICE_COST_,GPARTCOST_,CPQ_DATE_,DATECREATED_) 
;
COMMIT;

ELSE 

insert into TEST.CPQ_QUOTE_DATA_TAB

(PROJECT_ID,SUB_PROJECT,ACTIVITY_ID,ORDER_NO,PART_NO,QTY,PRICE_COST,GPARTCOST,CPQ_DATE,DATE_CREATED) 

VALUES

(PROJECT_ID_,SUB_PROJECT_,ACTIVITY_ID_,ORDER_NO_,PART_NO_,QTY_,PRICE_COST_,GPARTCOST_,CPQ_DATE_,DATECREATED_) 
;
COMMIT;

END IF;


  END LOOP; 
close get_record;
END CPQ_DATA_HANDLE___;

END CPQ_QUOTE_DATA_API;

您的过程没有参数,但在主体中有局部变量。因此,实施与宣言不同,两者被视为两种不同的程序

你的

应该是

PROCEDURE CPQ_DATA_HANDLE___ (
  PROJECT_ID_    VARCHAR2,
  SUB_PROJECT_   VARCHAR2,
  ...
as

您好Thorsten谢谢您的建议,在我开始循环后,将变量转换为参数值会导致错误PLS-00363。它声明我以前使用的所有变量都不能用作赋值目标。e、 g PROJECT_ID:=GetRec.PROJECT_ID;这是因为所有的参数都是默认的变量。通过在spec和body中添加
IN-OUT
OUT
像IN
PROJECT\u ID\u IN-OUT VARCHAR2
来更改它们。(好吧,在一个地方修改,然后复制粘贴到另一个地方。)谢谢你帮了我很多忙。
PROCEDURE CPQ_DATA_HANDLE___ (
  PROJECT_ID_    VARCHAR2,
  SUB_PROJECT_   VARCHAR2,
  ...
as