SQL过程错误精确提取返回的行数超过请求的行数

SQL过程错误精确提取返回的行数超过请求的行数,sql,stored-procedures,oracle-sqldeveloper,Sql,Stored Procedures,Oracle Sqldeveloper,我有下面的SQL过程,它在从SQL DEveloper运行时显示下面的错误 ERROR Message: ORA-01422: exact fetch returns more than requested number of rows PROCEDURE SP_ENABLE_CONST(P_ARCH_BATCH_ID VARCHAR) IS TABLELIST VARCHAR2(100); SQL_QUERY VARCHAR2(4000); RESULT_COL INT;

我有下面的SQL过程,它在从SQL DEveloper运行时显示下面的错误

ERROR Message: 
    ORA-01422: exact fetch returns more than requested number of rows



PROCEDURE SP_ENABLE_CONST(P_ARCH_BATCH_ID VARCHAR) IS


TABLELIST VARCHAR2(100);
SQL_QUERY VARCHAR2(4000);
RESULT_COL INT;
RESULT_CONST_COL VARCHAR2(1000);


BEGIN
/*LOOP will return three tables designated in table_name */
FOR TEMP2_VAR_TEST IN (SELECT TABLE_NAME FROM SYS.ALL_TABLES WHERE TABLE_NAME LIKE 'TEST%')
 
/*each loop the table_name returned will be used in SQL_QUERY */
  LOOP

      SQL_QUERY := 'SELECT CONSTRAINT_NAME FROM USER_CONS_COLUMNS WHERE TABLE_NAME = :1';
     
      DBMS_OUTPUT.PUT_LINE(SQL_QUERY); 

/*select statement will return more than one row containing table constraints*/
**ERROR on this part since RESULT_CONST_COL cannot contain more than one row
      EXECUTE IMMEDIATE SQL_QUERY INTO RESULT_CONST_COL USING TEMP2_VAR_TEST.TABLE_NAME;
      
      DBMS_OUTPUT.PUT_LINE('CONSTRAINT_NAME' || RESULT_CONST_COL);
          
  END LOOP;     
  END SP_ENABLE_CONST;
END PK_ARCHIVE_PROCESS_TEST;
我知道该错误是由类型为VARCHAR2的result_const_col引起的,但不确定如何存储从execute immediate命令返回的多行。我已经阅读了有关游标的内容,并尝试使用它,但仍然出现错误。提前谢谢

更新1 按照您的建议修改了我的代码,但仍然遇到错误

TYPE RESULT_CONST_COL IS TABLE OF VARCHAR2(1000);
VAR_OF_RESULT_CONST RESULT_CONST_COL;

TBL_CONSTRAINTS VARCHAR2(100);
TABLELIST VARCHAR2(100);
SQL_QUERY VARCHAR2(4000);
RESULT_COL INT;


BEGIN

FOR TEMP2_VAR_TEST IN (SELECT TABLE_NAME FROM SYS.ALL_TABLES WHERE TABLE_NAME LIKE 'TEST%')
 
  LOOP      
      SQL_QUERY := 'SELECT CONSTRAINT_NAME FROM USER_CONS_COLUMNS WHERE TABLE_NAME = :1';          
      DBMS_OUTPUT.PUT_LINE(SQL_QUERY); 

/*ERROR line 92*/
        EXECUTE IMMEDIATE SQL_QUERY USING TEMP2_VAR_TEST.TABLE_NAME
          RETURNING BULK COLLECT INTO VAR_OF_RESULT_CONST;      
  
        FOR I IN 1 .. VAR_OF_RESULT_CONST.COUNT LOOP
          DBMS_OUTPUT.PUT_LINE(VAR_OF_RESULT_CONST(i));
        END LOOP;       
  END LOOP;
当我试图运行上面的代码时遇到了这个错误

ORA-06547: RETURNING clause must be used with INSERT, UPDATE, or DELETE statements
**ORA-06512: at "HSNIAPP.PK_ARCHIVE_PROCESS_TEST", line 92**
ORA-06512: at line 6
SELECT CONSTRAINT_NAME FROM USER_CONS_COLUMNS WHERE TABLE_NAME = :1

您必须将
RESULT\u CONST\u COL
声明为集合:

RESULT_CONST_COL IS TABLE OF VARCHAR2(1000);
然后使用
批量收集到
返回多行:

EXECUTE IMMEDIATE SQL_QUERY BULK COLLECT INTO RESULT_CONST_COL
 USING TEMP2_VAR_TEST.TABLE_NAME;
然后遍历集合中返回的结果以处理所有值:

FOR i IN 1 .. RESULT_CONST_COL.COUNT LOOP
 DBMS_OUTPUT.PUT_LINE(RESULT_CONST_COL(i));
 EXECUTE IMMEDIATE 'ALTER TABLE '|| TEMP2_VAR_TEST ||
  ' DISABLE CONSTRAINT ' || RESULT_CONST_COL(i);
END LOOP;

嗨,亚罗斯拉夫谢谢你的帮助。。。当我试图听从你的建议时遇到了错误。表达式结果常量不合适,因为赋值语句的左侧。。。必须声明另一个错误组件计数。我现在正试图解决此问题。@dimas若要为集合元素赋值,必须使用索引:
RESULT\u CONST\u COL(1):=“some\u value”
。可以有小于或等于集合中元素总数的任何数字代替
1
。关于
COUNT
你能把引起这个错误的代码行贴出来吗?嗨,雅罗斯拉夫,我已经设法排除了关于结果常数的错误,但是它又出现了另一个错误。请参阅更新1@dimas对不起,代码有误。您只需使用
批量收集到
。如果动态执行
插入
更新
删除
语句,则需要返回
。我已经相应地更新了我的答案。很好,雅罗斯拉夫,你做的修正是布里里安。程序正在运行。这只是一个后续问题,因为结果将为每个表提供几行外键。我可以使用RESULT_CONST_COL遍历每一行并使用ALTER statemen禁用外键吗?