Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

getting ORA-01422: exact fetch returns more than requested number of rows while calling a procedure

Albert ChaoNov 11 2021
CREATE TABLE cmb_staging (
    e_id               NUMBER(10),
    e_name             VARCHAR2(30),
    e_loc              VARCHAR2(30),
    validation_status  VARCHAR2(30),
    validation_result  VARCHAR2(30)
);

insert into cmb_staging values(1,'A','AA',null,null);
insert into cmb_staging values(1,'B','BB',null,null);
insert into cmb_staging values(2,'C','CC',null,null);
insert into cmb_staging values(2,'D','DD',null,null);
insert into cmb_staging values(3,'A','AA',null,null);

CREATE TABLE cmb_target (
    e_id    NUMBER(10),
    e_name  VARCHAR2(30),
    e_loc   VARCHAR2(30)
);

CREATE TABLE cmb_reject (
    e_id               NUMBER(10),
    e_name             VARCHAR2(30),
    e_loc              VARCHAR2(30),
    validation_status  VARCHAR2(30),
    validation_result  VARCHAR2(30)
);

CREATE TABLE SUMMARY_TAB
   (    TOT_RECORDS NUMBER(10,0), 
    SUCCESS_RECORDS NUMBER(10,0), 
    FAILED_RECORDS NUMBER(10,0), 
    PROCESS_STATUS VARCHAR2(30)
   );


Procedure :

create or replace procedure sp_dup_rec(ov_err_msg OUT varchar2)
    is
      lv_succ_rec number(30);
      lv_fail_rec number(30);
      lv_count number(30);
    begin
      lv_succ_rec := 0;
      lv_fail_rec := 0;

      UPDATE cmb_staging
      SET   validation_status = 'Fail',
            validation_result    = CASE
                                WHEN e_id IS NULL
                                THEN 'Id is not present'
                                ELSE 'Id is longer than expected'
                                END
      WHERE e_id is null
      OR    LENGTH(e_id) > 4;

--If there are duplicates id then it should go into cmb_reject table
select e_id into lv_count from cmb_staging;
if lv_count < 1 then
      MERGE INTO cmb_target t
        USING (SELECT e_id,
             e_name,
             e_loc
      FROM   cmb_staging
      WHERE  validation_status IS NULL) S
        ON (t.e_id = S.e_id)

            WHEN MATCHED THEN UPDATE SET 
                t.e_name = s.e_name,
                t.e_loc = s.e_loc


            WHEN NOT MATCHED THEN INSERT (t.e_id,t.e_name,t.e_loc)
                VALUES (s.e_id,s.e_name,s.e_loc);

      lv_succ_rec := SQL%ROWCOUNT;
else
      insert into cmb_reject
      select s.*
      from   cmb_staging s
      WHERE  validation_status = 'Fail';

      lv_fail_rec := SQL%ROWCOUNT;
end if;

      dbms_output.put_line('Inserting into Summary table');
      insert into summary_tab(
        tot_records,
        success_records,
        failed_records
      ) values (
        lv_succ_rec + lv_fail_rec,
        lv_succ_rec,
        lv_fail_rec
      );

      COMMIT;
      ov_err_msg := 'Procedure completed succesfully';
    EXCEPTION
      WHEN OTHERS THEN
        ov_err_msg := 'Procedure end up with errors'|| sqlerrm;
        ROLLBACK;
    END sp_dup_rec;


Calling a procedure :

set serveroutput on;
declare
    v_err_msg varchar2(100);
begin
    sp_dup_rec(v_err_msg);
    dbms_output.put_line(v_err_msg);
end;


Hi Team, I am getting ora-01422 error while calling a procedure. Basically, I want to insert duplicate records into the cmb_reject tab because the merge statement will fail and I will get ora - 30296 error if I will use only merge. SO, I have written if condition wherein it will fetch the count and if the count is more then will insert into cmb_reject tab

This post has been answered by User_H3J7U on Nov 11 2021
Jump to Answer
Comments
Post Details
Added on Nov 11 2021
3 comments
724 views