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); |