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