Oracle 精确提取中指定的行数小于返回的行数:这是不可能的吗
我在PL/SQL中定义了以下过程: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
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
conditionIT.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
作为“参数”听起来就足够了。我将来可能会通过这项公约。