Oracle 精确提取中指定的行数小于返回的行数:这是不可能的吗

Oracle 精确提取中指定的行数小于返回的行数:这是不可能的吗,oracle,plsql,Oracle,Plsql,我在PL/SQL中定义了以下过程: CREATE OR REPLACE PROCEDURE deleteFromStudyCase(studycase_id IN NUMBER) IS VAL_CARRIER_ID_GLOBAL NUMBER(19,0); EST_OBJ_ID_GLOBAL NUMBER(19,0); INVEST_TASK_ID_GLOBAL NUMBER(19,0); BEGIN -- Fill the variables SELECT I

我在PL/SQL中定义了以下过程:

CREATE OR REPLACE PROCEDURE deleteFromStudyCase(studycase_id IN NUMBER)
IS
   VAL_CARRIER_ID_GLOBAL  NUMBER(19,0);
   EST_OBJ_ID_GLOBAL      NUMBER(19,0);
   INVEST_TASK_ID_GLOBAL  NUMBER(19,0);
BEGIN

-- Fill the variables
SELECT IT.ID into INVEST_TASK_ID_GLOBAL
  FROM T_INVESTIGATIONTASK IT
  WHERE IT.STUDYCASE_ID = studycase_id;

SELECT EO.ID into EST_OBJ_ID_GLOBAL 
  FROM T_ESTIMATIONOBJECT EO
  WHERE EO.INVESTIGATIONTASK_ID = INVEST_TASK_ID_GLOBAL;

SELECT VC.ID into VAL_CARRIER_ID_GLOBAL
  FROM T_VALIDATIONCARRIER VC
  WHERE VC.IA_ESTIMATIONOBJECT_ID = EST_OBJ_ID_GLOBAL;

....many DELETE statements...

END deleteFromStudyCase;
当我尝试这样使用它时:

BEGIN
  DELETEFROMSTUDYCASE(30111);
END;
在运行时,它会失败,并出现以下错误:

Error report -
ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at "DELETEFROMSTUDYCASE", line 9
ORA-06512: at line 2
01422. 00000 -  "exact fetch returns more than requested number of rows"
*Cause:    The number specified in exact fetch is less than the rows returned.
*Action:   Rewrite the query or change number of rows requested
这意味着其中一个选择按预期返回不止一个值。我尝试分别运行select语句以查看哪一个是问题所在,但:

SELECT IT.ID
  FROM T_INVESTIGATIONTASK IT
  WHERE IT.STUDYCASE_ID = 30111;
只返回10053

SELECT EO.ID
  FROM T_ESTIMATIONOBJECT EO
  WHERE EO.INVESTIGATIONTASK_ID = 10053;
只返回933个

SELECT VC.ID
  FROM T_VALIDATIONCARRIER VC
  WHERE VC.IA_ESTIMATIONOBJECT_ID = 933;
只返回12个。

由于数据库的这一部分具有树结构,因此我还创建了以下过程:

CREATE OR REPLACE PROCEDURE deleteFromInvestigationTask(invest_task_id IN NUMBER)
IS
  VAL_CARRIER_ID_GLOBAL NUMBER(19,0);
  EST_OBJ_ID_GLOBAL NUMBER(19,0);
BEGIN

-- Fill the variables
SELECT EO.ID into EST_OBJ_ID_GLOBAL 
  FROM T_ESTIMATIONOBJECT EO
  WHERE EO.INVESTIGATIONTASK_ID = invest_task_id;

SELECT VC.ID into VAL_CARRIER_ID_GLOBAL 
  FROM T_VALIDATIONCARRIER VC
  WHERE VC.IA_ESTIMATIONOBJECT_ID = EST_OBJ_ID_GLOBAL;

...many DELETE statements...
这一个工作正常。
那么另一个应该可以工作,为什么我会继续得到这个错误?还可能是什么?

我发现了这个问题

在第一个过程中,参数名是
studycase\u id
,它也是表
T\u调查任务
中一列的名称,因此
WHERE
condition
IT.studycase\u id=studycase\u id
是错误的:这就是第一个
SELECT
失败的原因。我在
study\u case\u id
中更改了参数名称,并解决了我的问题。

我们应该如何帮助您?在procudre中运行调试,并按照您可以用这种方式调试的结果进行操作:我将该过程重命名为deleteFromStudyCaseTest并编译它,如果出现错误,我将删除,如果仍然出现错误,我将删除第三个select,我尝试使用第一个和第二个,如果仍然存在,我尝试获取查询的输出,并了解输出的结果是什么。也许有人可以访问数据库并添加数据?第二个过程仅使用选择2和3。这表明故障是由SELECT Nr.1引起的。相同的证据提供了错误堆栈,指向第9行(这是第一个选择)。手动运行查询将提供答案-检查您是否在同一数据库中,是否与同一用户在一起,以及是否所有事务都是
COMMIT
ed。如果您确定select中只返回一条记录,请尝试使用以下方法进行测试:select MAX(EO.ID)into_OBJ_ID_GLOBAL等。。这也将迫使结果返回一个值。很好。您可以使用过程名称作为参数前缀,例如
deleteFromStudyCase.studycase\u id
。或者大多数人所做的,就是使用一种命名约定,例如参数的命名约定
p\u studycase\u id
。将
p
作为“参数”听起来就足够了。我将来可能会通过这项公约。