Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 执行存储过程时,精确提取返回的行数超过请求的行数_Sql_Oracle_Plsql - Fatal编程技术网

Sql 执行存储过程时,精确提取返回的行数超过请求的行数

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

我正在尝试编写一个存储过程,它将接受Item Number作为输入参数,并返回一些与之相关的数据。我无法调用该过程,因为它不断给出错误,即行数超过请求的行数。我是Oracle的新手,如果我只返回一行,而当数据在多行中时,它为什么会工作,这是毫无意义的? 我将我的代码粘贴到下面,看看是否有人能指出我的错误

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
子句将出错。您可以通过以下方式进行:

  • 光标用于循环
    。但这将是缓慢的,因为它是逐行操作
  • 使用记录/收集,有关更多详细信息,请参阅文档
  • 我是Oracle的新手,如果我只返回一行,而当数据在多行中时,它为什么会工作,这是毫无意义的?单独运行时的查询返回2行数据,但当我调用此过程时,它不是重新排列数据,而是一个错误


    不能为标量变量指定多个值。用于分配多行的
    SELECT..INTO
    子句将出错。您可以通过以下方式进行:

  • 光标用于循环
    。但这将是缓慢的,因为它是逐行操作
  • 使用记录/收集,有关更多详细信息,请参阅文档

  • 请给出准确的ORA-XXXX错误消息。对于ORA-1422,请参见不能为标量变量分配多个值。您需要通过游标使用记录或循环。但是我们需要更多关于你想要实现什么的细节。@因为我已经查看了你提供的链接,但无法了解那里或这里发生了什么。正如我所说,我对甲骨文还不太熟悉。你能帮我查询一下吗?@LalitKumarB我刚刚更新了问题并添加了我期望的数据。请给出准确的ORA-XXXX错误消息。对于ORA-1422,请参见不能为标量变量分配多个值。您需要通过游标使用记录或循环。但是我们需要更多关于你想要实现什么的细节。@因为我已经查看了你提供的链接,但无法了解那里或这里发生了什么。正如我所说,我对甲骨文还不太熟悉。您能帮助完成此查询吗?@LalitKumarB我刚刚更新了问题并添加了我期望的数据。在这种情况下,您必须按照另一个答案的建议修改代码:如果预期查询必须返回2行,您的代码应该能够处理这2行。在这种情况下,您必须按照其他答案:如果预期查询必须返回2行,那么代码应该能够处理这2行。