如何在插入中输入此表中的数据?

问题描述 投票:0回答:2

我是pl / sql的新手,我想在插入中输入这些数据有人帮帮我吗?我不知道如何在插入中输入此数据而不进行连接我无法找到在插入中输入数据的方法

these     SELECT PORCENTAJE 
          FROM RANGO_SUBIDA_COMISION;





    VARIABLE B_ANIO NUMBER;

    EXECUTE :B_ANIO := 042018;

    DECLARE
    V_EMPLEADO_ID    EMPLEADOS.EMPLEADO_ID%TYPE;
    V_NOMBRE         EMPLEADOS.NOMBRE%TYPE;
    V_APELLIDO       EMPLEADOS.APELLIDO%TYPE;
    V_VALOR_COMISION COMISIONES.VALOR_COMISION%TYPE;
    V_SUELDO         EMPLEADOS.SUELDO%TYPE;

BEGIN

    FOR R IN

    (
    SELECT DISTINCT E.EMPLEADO_ID , E.NOMBRE , E.APELLIDO , C.VALOR_COMISION , E.SUELDO
    FROM EMPLEADOS E JOIN COMISIONES C
    ON (C.EMPLEADO_ID = E.EMPLEADO_ID)
    )
    LOOP

    V_EMPLEADO_ID      := R.EMPLEADO_ID;
    V_NOMBRE           := R.NOMBRE;
    V_APELLIDO         := R.APELLIDO;
    V_VALOR_COMISION   := R.VALOR_COMISION;
    V_SUELDO           := R.SUELDO;

    INSERT INTO INFORME_SUBIDA_COMISION 
    VALUES ( :B_ANIO ,V_EMPLEADO_ID , V_NOMBRE , V_APELLIDO , V_VALOR_COMISION , V_SUELDO  );

    END LOOP;
    END;
sql oracle plsql
2个回答
5
投票

我不太清楚你的问题是什么。但我不明白你为什么要使用光标。为什么不直接执行这样的查询?

INSERT INTO INFORME_SUBIDA_COMISION (ANIO, EMPLEADO_ID, NOMBRE, APELLIDO, VALOR_COMISION, SUELDO)
SELECT DISTINCT :B_ANIO, E.EMPLEADO_ID, E.NOMBRE, E.APELLIDO, 
       C.VALOR_COMISION, E.SUELDO
    FROM EMPLEADOS E JOIN COMISIONES C
         ON C.EMPLEADO_ID = E.EMPLEADO_ID;

注意:我猜测INFORME_SUBIDA_COMISION中的列名是什么,但是你应该明确列出它们。


0
投票

如果要插入大量数据,可以在批量模式下使用此插入

SET SERVEROUTPUT ON

/*use this script to insert data in bulk mode.*/
DECLARE
    TYPE array IS
        TABLE OF informe_subida_comision%rowtype;
    v_data          array;
    dml_errors EXCEPTION;
    PRAGMA exception_init ( dml_errors,-24381 );
    CURSOR l_cur IS
        SELECT DISTINCT
            e.empleado_id,
            e.nombre,
            e.apellido,
            c.valor_comision,
            e.sueldo
        FROM
            empleados e
            JOIN comisiones c ON (
                c.empleado_id = e.empleado_id
            );

    v_error_count   NUMBER;
    v_err           VARCHAR2(500);
    v_err_indx      NUMBER;
BEGIN
    OPEN l_cur;
    LOOP
        BEGIN
            FETCH l_cur BULK COLLECT INTO v_data LIMIT 1000;
            FORALL i IN 1..v_data.count SAVE EXCEPTIONS
      --insert data into the table 
                INSERT INTO informe_subida_comision VALUES v_data ( i );

       -- log any dml errors 

        EXCEPTION
            WHEN dml_errors THEN
                v_error_count := SQL%bulk_exceptions.count;
                FOR i IN 1..v_error_count LOOP
                    v_err_indx := SQL%bulk_exceptions(i).error_index;
                    v_err := sqlerrm(-SQL%bulk_exceptions(i).error_code);
                    dbms_output.put_line(v_data(v_err_indx).empleado_id
                     || ''
                     || v_err);
                END LOOP;

        END;

        COMMIT;
        EXIT WHEN l_cur%notfound;
    END LOOP;

    CLOSE l_cur;
END;
© www.soinside.com 2019 - 2024. All rights reserved.