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

时间:2018-06-04 01:20:46

标签: sql oracle plsql

我是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;

2 个答案:

答案 0 :(得分: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中的列名是什么,但您应该明确列出它们。

答案 1 :(得分: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;