Blog

Programación, desarrollo web y SEO

PAQUETE DBMS_SQL. Oracle 10g II

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);
Share this post

1 comment

Join the conversation
  • leinah - 18 junio, 2013 reply

    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.

Join the conversation


nueve + = 11