todos salario que por numero muestre los king empleados empleado dependen departamento consultas cada apellido plsql for-loop insert procedure

plsql - salario - oracle consultas en sql hr



PL/SQL Insertando 1 fila para cada resultado en una selección (1)

Estoy escribiendo un Procedimiento PL / SQL que realiza una selección basada en variables de entrada y luego inserta una fila para cada resultado en la selección. Estoy teniendo problemas para depurar lo que está mal con mi consulta debido a mi novedad a PL / SQL. Sé que esto debe ser fácil, pero estoy atrapado aquí por alguna razón. ¡Gracias por tu ayuda!

CREATE OR REPLACE PROCEDURE setup_name_map(ranking_id IN NUMBER, class_string IN VARCHAR2) IS BEGIN FOR rec IN (SELECT NAME_ID FROM PRODUCT_NAMES WHERE NAME = class_string) LOOP EXECUTE IMMEDIATE ''INSERT INTO NAME_RANKING (NAME_ID, RANKING_ID) VALUES ('' || rec.NAME_ID || '', '' || ranking_id || '')''; END LOOP; END;

Según el Oracle Developer Compiler ... ''NAME_ID'' es un identificador no válido. He intentado ponerlo entre comillas pero no dados. También se queja de que el uso de las variables de índice de bucle ''REC'' no es válido. Cualquier ayuda es muy apreciada.


No hay necesidad de SQL dinámico aquí:

BEGIN FOR rec IN (SELECT NAME_ID FROM PRODUCT_NAMES WHERE NAME = class_string) LOOP INSERT INTO NAME_RANKING (NAME_ID, RANKING_ID) VALUES (rec.NAME_ID, ranking_id); END LOOP; END;

Mejor aún, puedes evitar un enfoque lento de cursor de fila por fila como este:

BEGIN INSERT INTO NAME_RANKING (NAME_ID, RANKING_ID) SELECT NAME_ID, ranking_id FROM PRODUCT_NAMES WHERE NAME = class_string; END;

Si realmente necesitaba el SQL dinámico, no debería estar concatenando valores en él, sino utilizando variables de enlace:

BEGIN FOR rec IN (SELECT NAME_ID FROM PRODUCT_NAMES WHERE NAME = class_string) LOOP EXECUTE IMMEDIATE ''INSERT INTO NAME_RANKING (NAME_ID, RANKING_ID) VALUES (:b1, :b2) USING rec.NAME_ID, ranking_id; END LOOP; END;