Sql 执行存储过程时,精确提取返回的行数超过请求的行数
我正在尝试编写一个存储过程,它将接受Item Number作为输入参数,并返回一些与之相关的数据。我无法调用该过程,因为它不断给出错误,即行数超过请求的行数。我是Oracle的新手,如果我只返回一行,而当数据在多行中时,它为什么会工作,这是毫无意义的? 我将我的代码粘贴到下面,看看是否有人能指出我的错误Sql 执行存储过程时,精确提取返回的行数超过请求的行数,sql,oracle,plsql,Sql,Oracle,Plsql,我正在尝试编写一个存储过程,它将接受Item Number作为输入参数,并返回一些与之相关的数据。我无法调用该过程,因为它不断给出错误,即行数超过请求的行数。我是Oracle的新手,如果我只返回一行,而当数据在多行中时,它为什么会工作,这是毫无意义的? 我将我的代码粘贴到下面,看看是否有人能指出我的错误 CREATE OR REPLACE PROCEDURE AGILE.SELECT_ITEM ( ITEM_NO IN VARCHAR2, ITEM_NUMBER OUT VARCHAR2, R
CREATE OR REPLACE PROCEDURE AGILE.SELECT_ITEM
(
ITEM_NO IN VARCHAR2, ITEM_NUMBER OUT VARCHAR2, REV_NUMBER OUT VARCHAR2, CHANGE_NUMBER OUT VARCHAR2, SRC_FILENAME OUT VARCHAR2, DST_FILENAME OUT VARCHAR2,
FILEPATH OUT VARCHAR2, DESCRIPTION OUT VARCHAR2
)
IS
BEGIN
WITH CTE AS(
SELECT
RANK () OVER (PARTITION BY ITEM_NUMBER ORDER BY NVL(c.id, -1) DESC) RN,
CTE.ITEM_NUMBER, NVL(REV.REV_NUMBER,'Introductory') REV_NUMBER, NVL(C.CHANGE_NUMBER,'NOCHANGE') CHANGE_NUMBER,
CASE WHEN AM.FILE_ID = 0 THEN VM.FILE_ID ELSE AM.FILE_ID END AMVMFILE_ID, A.DESCRIPTION
FROM ITEM CTE
LEFT JOIN AGILE.REV REV ON REV.ITEM = CTE.ID
LEFT JOIN AGILE.CHANGE C ON C.ID = REV."CHANGE"
LEFT JOIN AGILE.ATTACHMENT_MAP AM ON AM.PARENT_ID = CTE.ID AND C.ID = AM.PARENT_ID2
LEFT OUTER JOIN AGILE.ATTACHMENT A ON AM.ATTACH_ID = A.ID AND AM.LATEST_VSN = a.LATEST_VSN
LEFT OUTER JOIN AGILE.VERSION_FILE_MAP VM ON (AM.VERSION_ID = VM.VERSION_ID OR AM.LATEST_VSN = VM.VERSION_ID)
LEFT OUTER JOIN AGILE."VERSION" V1 ON V1.id = VM.VERSION_ID
WHERE CTE.ITEM_NUMBER = 'AGY-731946-0000'
AND NVL(REV.EFFECTIVE_DATE, TO_DATE('2020-04-17', 'YYYY-MM-dd')) <= TO_DATE('2020-04-17', 'YYYY-MM-dd')
AND (C.SUBCLASS IS NULL OR C.SUBCLASS NOT IN
(
11141
,434284
,1455
,313304
,190161
,435727
,43556
,181524
,181518
,434124
,435796
,8141
,7141
,341469
,434038
,435834
,408376
))
), FINALCTE AS(
SELECT ITEM_NUMBER, REV_NUMBER, CHANGE_NUMBER,
'agile'||f.id||'.'||f.file_type src_filename,
f.filename dst_filename,
NVL(replace(fi.ifs_filepath,'\','/'),
SUBSTR(LPAD(to_char(f.id),11,'0'),0,3)||'/'||
SUBSTR(LPAD(to_char(f.id),11,'0'),4,3)||'/'||
SUBSTR(LPAD(to_char(f.id),11,'0'),7,3)||'/'||
'agile'||f.id||'.'||f.file_type) filepath, DESCRIPTION
FROM CTE DC
LEFT OUTER JOIN FILES F ON DC.AMVMFILE_ID = F.ID
LEFT OUTER JOIN FILE_INFO FI ON FI.FILE_ID = DC.AMVMFILE_ID
WHERE RN = 1 AND AMVMFILE_ID IS NOT NULL
ORDER BY ITEM_NUMBER, RN
)
SELECT DISTINCT
LTRIM(RTRIM(ITEM_NUMBER)) ITEM_NUMBER, LTRIM(RTRIM(REV_NUMBER)) REV_NUMBER, LTRIM(RTRIM(CHANGE_NUMBER)) CHANGE_NUMBER,
LTRIM(RTRIM(src_filename)) src_filename, LTRIM(RTRIM(dst_filename)) dst_filename, LTRIM(RTRIM(filepath)) filepath,
LTRIM(RTRIM(DESCRIPTION)) DESCRIPTION
INTO ITEM_NUMBER, REV_NUMBER, CHANGE_NUMBER, SRC_FILENAME, DST_FILENAME, FILEPATH, DESCRIPTION
FROM FINALCTE
--SELECT ITEM_NUMBER INTO ITEM_NUMBER FROM ITEM
WHERE ITEM_NUMBER = ITEM_NO;
END;
请帮帮我,因为我困得很厉害
预期产出
ITEM_NUMBER |REV_NUMBER|CHANGE_NUMBER|SRC_FILENAME |DST_FILENAME |FILEPATH |DESCRIPTION |
---------------|----------|-------------|----------------|-----------------------------------------------------------------------------------------|----------------------------|-------------------------------|
AGY-731946-0000|A |DL000208 |agile1820829.pdf|Cert_BSMI_S-LK5.pdf |000/018/208/agile1820829.pdf|AGNCY CERTI BSMI 3892A547 S-LK5|
AGY-731946-0000|A |DL000208 |agile1820830.url|HTTP://AgileArchive.logitech.com/WWDocLib2/WWDL002.nsf/0/C125679800434FCCC12568F100392326|000/018/208/agile1820830.url|AGNCY CERTI BSMI 3892A547 S-LK5|
错误:
SQL Error [1422] [21000]: ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at "AGILE.SELECT_ITEM", line 9
根本原因是您的顶级SQL查询返回2行 要使代码正常工作,它必须只返回1行。 以下是简短的演示:
SQL> create table t(x int);
Table created.
SQL> insert into t values(1);
1 row created.
SQL> insert into t values(2);
1 row created.
SQL> commit;
Commit complete.
SQL> --
SQL> create or replace procedure myproc
2 is
3 l number;
4 begin
5 select x into l from t;
6 end;
7 /
Procedure created.
SQL> show errors
No errors.
SQL> exec myproc
BEGIN myproc; END;
*
ERROR at line 1:
ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at "TESTDBA.MYPROC", line 5
ORA-06512: at line 1
SQL> --
SQL> delete t where x=2;
1 row deleted.
SQL> select * from t;
X
----------
1
SQL> exec myproc;
PL/SQL procedure successfully completed.
SQL>
根本原因是您的顶级SQL查询返回2行 要使代码正常工作,它必须只返回1行。 以下是简短的演示:
SQL> create table t(x int);
Table created.
SQL> insert into t values(1);
1 row created.
SQL> insert into t values(2);
1 row created.
SQL> commit;
Commit complete.
SQL> --
SQL> create or replace procedure myproc
2 is
3 l number;
4 begin
5 select x into l from t;
6 end;
7 /
Procedure created.
SQL> show errors
No errors.
SQL> exec myproc
BEGIN myproc; END;
*
ERROR at line 1:
ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at "TESTDBA.MYPROC", line 5
ORA-06512: at line 1
SQL> --
SQL> delete t where x=2;
1 row deleted.
SQL> select * from t;
X
----------
1
SQL> exec myproc;
PL/SQL procedure successfully completed.
SQL>
我是Oracle的新手,如果我只返回一行,而当数据在多行中时,它为什么会工作,这是毫无意义的?单独运行时的查询返回2行数据,但当我调用此过程时,它不是重新排列数据,而是一个错误
不能为标量变量指定多个值。用于分配多行的
SELECT..INTO
子句将出错。您可以通过以下方式进行:
光标用于循环
。但这将是缓慢的,因为它是逐行操作不能为标量变量指定多个值。用于分配多行的
SELECT..INTO
子句将出错。您可以通过以下方式进行:
光标用于循环
。但这将是缓慢的,因为它是逐行操作请给出准确的ORA-XXXX错误消息。对于ORA-1422,请参见不能为标量变量分配多个值。您需要通过游标使用记录或循环。但是我们需要更多关于你想要实现什么的细节。@因为我已经查看了你提供的链接,但无法了解那里或这里发生了什么。正如我所说,我对甲骨文还不太熟悉。你能帮我查询一下吗?@LalitKumarB我刚刚更新了问题并添加了我期望的数据。请给出准确的ORA-XXXX错误消息。对于ORA-1422,请参见不能为标量变量分配多个值。您需要通过游标使用记录或循环。但是我们需要更多关于你想要实现什么的细节。@因为我已经查看了你提供的链接,但无法了解那里或这里发生了什么。正如我所说,我对甲骨文还不太熟悉。您能帮助完成此查询吗?@LalitKumarB我刚刚更新了问题并添加了我期望的数据。在这种情况下,您必须按照另一个答案的建议修改代码:如果预期查询必须返回2行,您的代码应该能够处理这2行。在这种情况下,您必须按照其他答案:如果预期查询必须返回2行,那么代码应该能够处理这2行。