2014-01-22 31 views
0

我有下面的SQL程序,它顯示來自SQL顯影劑運行時SQL程序錯誤確切取返回多於請求的行數

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; 

據我所知,誤差由result_const_col這是造成在下面的錯誤VARCHAR2類型,但不知道要使用什麼來存儲從立即執行命令返回的多行。我已經閱讀了遊標並試圖使用它,但仍然出現錯誤。提前致謝。

更新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 

回答

2

您必須聲明RESULT_CONST_COL爲集合:

RESULT_CONST_COL IS TABLE OF VARCHAR2(1000); 

然後用BULK COLLECT INTO返回多行:

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; 
+0

喜雅羅斯拉夫感謝你的幫忙......遇到錯誤,當我試圖按照你的建議。表達式RESULT_CONST_COL不適合作爲賦值語句的左側...必須聲明另一個錯誤組件COUNT。我正試圖解決這個問題。 – dimas

+0

@dimas要將值賦給collection元素,必須使用index:'RESULT_CONST_COL(1):='some_value'。可以有任何數字代替少於或等於集合中元素總數的'1'。關於'COUNT',你可以在發生這個錯誤的地方發佈代碼行嗎? –

+0

嗨yaroslav我已經設法擺脫錯誤顯示有關result_const_col但它提出了另一個錯誤。請參閱更新1 – dimas

相關問題