Laburo España: 250.000 ofertas de empleo

Sputnik

DBMS_SQL

Viernes, 17 de diciembre de 2004

Si necesitamos incluir sentencias de SQL dinamicas dentro de un bloque PL/SQL, el paquete de la base de datos DBMS_SQL es lo que necesitamos.

Antes de nada, como SYS, necesitamos darle privilegios de ejecución sobre DBMS_SQL al usuario que va a ejecutar el procedimiento:

GRANT EXECUTE ON DBMS_SQL TO usuario;

Despues, procederemos a realizar el procedimiento, como ejemplo, usaremos un procedimiento que añade un usuario a la base de datos (el usuario que lo ejecuta tambien tiene que tener permisos de creacion de usuarios)

CREATE OR REPLACE PROCEDURE create_dbms_ej AUTHID current_user
(in_nombre varchar2, in_pass varchar2)
IS
l_handle integer;
l_sql_stmt varchar2(200);
l_rows_processed binary_integer;
BEGIN
l_sql_stmt := 'CREATE USER :usu IDENTIFIED BY :pass';
-- Abrimos el descriptor
l_handle := dbms_sql.open_cursor;
-- Analizo la instrucción sql
dbms_sql.parse (l_handle, l_sql_stmt, dbms_sql.native);
-- Enlazo las dos variables pasadas en la SQL a las 2 variables del procedimiento
dbms_sql.bind_variable(l_handle, ':usu', in_nombre);
dbms_sql.bind_variable(l_handle, ':pass', in_pass);
l_rows_processed := dbms_sql.execute(l_handle);
-- Cierro el cursor
dbms_sql.CLOSE_CURSOR(l_handle);
END;


Y ya está, esto es todo.. disfrutadlo


Comentarios

Tambien podriamos hacer un:

EXECUTE IMMEDIATE "INSERT ....";

Pero no estariamos utilizando SQL Dinamico.

tanke | 16-01-2005 01:59:22

Tanke, el comando EXECUTE IMMEDIATE precisamente ejecuta SQL Dinámico. Es decir, la sentencia que ejecuta es una cadena de carácteres tal como

declare
sentencia varchar2(40):='INSERT INTO...';
begin
EXECUTE IMMEDIATE sentencia;
end;
/

Si a lo que te refieres es a manejar variables de host, es decir, que las sentencias se preparen, se asignen el valor a las variables, y posteriormente se ejecuten, habría que usar la cláusula USING.

declare
sentencia varchar2(40):='INSERT INTO :tabla VALUES (.........)';
v_tabla varchar2(30):='EMP';
begin
EXECUTE IMMEDIATE sentencia USING v_tabla;
end;
/

Gracias, un saludo,
Javier Morales

oraclexperto | 08-08-2005 12:49:05

tengo un problema con este codigo, en cuanto ejecuto el parse, me dice:

An exception occurred in the anonymous block.
Check for syntax errors in the "Set Parameters" dialog.

ORA-00936: missing expresion.
ORA-06512: at "SYS.DBMS_SYS_SQL", line 825
ORA-06512: at "SYS.DBMS_SQL", line 32
ORA-06512: at "REALIA.F_RECOJO", line 53
ORA-06512: at line 16

podrias hecharme un cable y decirme de que se queja


miguel | 10-10-2005 11:26:20

Comentar


Recordar datos

Miniblog

Favoritos

Tira e.c.o.l.*

Tira e.c.o.l.*

sputnik 2004-2005
Algunos derechos reservados.


Suscribir este blog en Bloglines

Blogarama

No a las patentes de software

LaInformacion.com lainformacion.com - Medio Oficial de los Premios Bitacoras 2009