'How to check if exists a row before insert - PL/SQL

Im new with SQL, and I want to knw how can I add a SQL in this structure to check if the row already exists before insert, Im tried this way, but I think its not the best.

DECLARE
    v_project_id   NUMBER;
    v_group_name   VARCHAR2(100);
    v_user_id      NUMBER;
    v_group_id     NUMBER;
    BEGIN
    FOR project IN (
                SELECT project_id
                FROM JSON_TABLE(:p_request,
                                        '$' COLUMNS(NESTED PATH '$.projects[*]'
                                                    COLUMNS(
                                                            project_id  VARCHAR2(100) PATH '$.project.id'
                                                            )
                                                    )
                                )
                )
    LOOP
        v_project_id  := project.project_id;
        v_group_name := json_value (:p_request,'$.group_name');
        v_user_id := json_value (:p_request,'$.user_id');
        v_group_id := s_project_group.NEXTVAL;
        dbms_output.put_line(v_group_id||' - '||v_group_name||' - '||v_user_id||' - '||v_project_id);
--------- HERE, I WANT TO CHECK IF THE NEW ROW ALREADY EXISTS BEFORE INSERT, IM TRIED THIS WAY, BUT I THINK ITS NOT THE BEST------------    
        (select case 
            when NOT exists (select 1 FROM APP_PROJECT_GROUP WHERE GROUP_NAME = :v_group_name AND USER_ID = :v_user_id) 
            INSERT INTO APP_PROJECT_GROUP (GROUP_ID, GROUP_NAME, PROJECT_ID, USER_ID) VALUES (v_group_id, v_group_name, v_project_id, v_user_i)
            );
----------------------------------------------------------------------------------------------------------------------------------------        
        COMMIT;
    END LOOP;
END;


Solution 1:[1]

As I commented on your previous question, use a MERGE statement then you can perform all the INSERTs in a single SQL statement (without having to use use cursor loops and repeatedly context-switching from PL/SQL to SQL):

MERGE INTO app_project_group dst
USING (
  SELECT group_id,
         group_name,
         TO_NUMBER(project_id) AS project_id,
         user_id
  FROM   JSON_TABLE(
           :p_request,
           '$'
           COLUMNS(
             group_name VARCHAR2(150) PATH '$.group_name',
             group_id   NUMBER(15)    PATH '$.group_id',
             user_id    NUMBER(15)    PATH '$.user_id',
             NESTED PATH '$.projects[*]'
             COLUMNS (
               project_id VARCHAR2(15)  PATH '$.project.id'
             )
           )
         )
) src
ON (src.group_name = dst.group_name AND src.user_id = dst.user_id)
WHEN NOT MATCHED THEN
  INSERT (group_id, group_name, project_id, user_id)
  VALUES (s_project_group.NEXTVAL, src.group_name, src.project_id, src.user_id);

db<>fiddle here

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1