DBMS_SQL
Aquí os dejo algunos ejemplos de la utilización del paquete DBMS_SQL:
– 1º Ejemplo de permisos ( usuario SYS)
GRANT EXECUTE ON dbms_sql TO public; REVOKE EXECUTE ON dbms_sql TO public; |
– 2º Ejemplo : Ejecución de tipo de sentencia 1 (Creación de tabla)
BEGIN EXECUTE immediate ' Create table T2 (columna_1 number)'; END; |
– 3º Ejemplo : Ejecución de tipo de sentencia 2 (Creación de tabla)
DECLARE cadena varchar2(200):='Create table nueva (id_empleado number,salario number)'; cadena_incorrecta varchar2(200):='Create table nueva (c1 numb)'; valor_devuelto NUMBER; vcursor NUMBER:=dbms_sql.open_cursor; BEGIN dbms_sql.parse (vcursor,cadena,dbms_sql.native); -- Tb dbms_sql.v7 --dbms_sql.parse (vcursor,cadena_incorrecta,dbms_sql.native); valor_devuelto := dbms_sql.EXECUTE(vcursor); dbms_sql.close_cursor(vcursor); END; |
– 4º Ejemplo: Ejecución de tipo de sentencia 2 (Orden DML No select)
DECLARE valor_devuelto NUMBER; vcursor INTEGER:=dbms_sql.open_cursor; BEGIN dbms_sql.parse (vcursor,'update EMP set sal=sal*:v1 where id_empleado=:v2', dbms_sql.native); dbms_sql.bind_variable(vcursor,'v1',1.8); dbms_sql.bind_variable(vcursor,'v2',7369); valor_devuelto := dbms_sql.EXECUTE(vcursor); -- Obtenemos el número de filas afectadas dbms_output.put_line(valor_devuelto); dbms_sql.close_cursor(vcursor); END; |
–5º Ejemplo: Ejecución de tipo de sentencia 2 (Orden DML NO select)
DECLARE valor_devuelto NUMBER; vcursor INTEGER:=dbms_sql.open_cursor; BEGIN dbms_sql.parse (vcursor,'update nueva set salario=salario*:v1',dbms_sql.native); dbms_sql.bind_variable(vcursor,'v1',1000); valor_devuelto := dbms_sql.EXECUTE(vcursor); -- Obtenemos el número de filas afectadas dbms_output.put_line(valor_devuelto); dbms_sql.close_cursor(vcursor); END; |
– 6º Ejemplo: Ejecución de tipo de sentencia 2 (Orden DQL)
DECLARE valor_devuelto NUMBER; vcursor INTEGER:=dbms_sql.open_cursor; v_id_empleado emp.empno%TYPE; v_salario emp.sal%TYPE; v_nombre emp.ename%TYPE; BEGIN dbms_sql.parse (vcursor,'select empno,sal,ename from emp where sal > 1000', dbms_sql.native); -- Definimos variables dbms_sql.define_column(vcursor,1,v_id_empleado); dbms_sql.define_column(vcursor,2,v_salario); dbms_sql.define_column(vcursor,3,v_nombre,10); -- Ejecutamos valor_devuelto := dbms_sql.EXECUTE(vcursor); loop IF dbms_sql.fetch_rows (vcursor) > 0 THEN -- Recojemos valores dbms_sql.column_value (vcursor, 1, v_id_empleado); dbms_sql.column_value (vcursor, 2, v_salario); dbms_sql.column_value (vcursor, 3, v_nombre); dbms_output.put_line(v_id_empleado); dbms_output.put_line(v_salario); dbms_output.put_line(v_nombre); ELSE exit; END IF; END loop; dbms_sql.close_cursor(vcursor); END; |
Aclaración:
DBMS_SQL.NATIVE es una constante que toma el valor 7. Da igual si se pone esto o 7.
DBMS_SQL.PARSE(vcursor, Cadena, DBMS_SQL.NATIVE); |
1 comment
Join the conversationleinah - 18 junio, 2013
Hola. Está muy bien toda la información que has publicado. Si no te importa me gustaría consultarte una duda. Tengo que hacer un procedimiento en el que primero se lean los registros de la tabla EMP, y se inserten esos mismos registros en una tabla con similar estructura creada previamente. La inserción debe efectuarse de 5 en 5, con un array.
Sé que tengo que utilizar el paquete DBMS_SQL, pero no sé como enfocarlo. Si pudieras orientarme te lo agradecería.
Un saludo.