InicioArticulos y noticiasBases de datosProgramaciónForosInternetServiciosEmail
Tutorial PL/SQL
Introducción a PLSQL
Programación con PL/SQL
Fundamentos de PL/SQL
Tipos de datos en PL/SQL
Operadores en PL/SQL
Estructuras de control en PL/SQL
Bloques PL/SQL
Cursores en PL/SQL
Cursores Implicitos en PL/SQL
Cursores Explicitos en PL/SQL
Cursores de actualización en PL/SQL
Excepciones en PL/SQL
Excepciones personalizadas en PL/SQL
Propagacion de excepciones en PL/SQL
Subprogramas en PL/SQL
Procedimientos almacenados en PL/SQL
Funciones en PL/SQL
Triggers en PL/SQL
Subprogramas en bloques anónimos
Paquetes en PL/SQL
Registros PL/SQL
Tablas PL/SQL
Tipo VARRAY
BULK COLLECT
Transacciones con PL/SQL
Transacciones autónomas
SQL Dinamico
Funciones integradas de PL/SQL
Secuencias
PL/SQL y Java
También puedes ver ...
Excepciones personalizadas en PL/SQL
Como conectar a ORACLE con Java
Recuperar datos BLOB de ORACLE
Trabajar con datos de tipo BLOB en ORACLE
PL/SQL y Java
Secuencias
Transacciones autónomas
Funciones integradas de PL/SQL
Transacciones con PL/SQL
Tipo VARRAY

Afiliados
La Web del programador
MundoProgramacion


Inicio | Tutorial PL/SQL Transacciones autónomasTutorial PL/SQLFunciones integradas de PL/SQL Versión para imprimir

SQL Dinamico

Sentencias DML con SQL dinamico

    PL/SQL ofrece la posibilidad de ejecutar sentencias SQL  a partir de cadenas de caracteres. Para ello debemos emplear la instrucción EXECUTE IMMEDIATE.

    Podemos obtener información acerca de número de filas afectadas por la instrucción ejecutada por EXEXUTE IMMEDIATE utilizando SQL%ROWCOUNT.

    El siguiente ejemplo muestra la ejecución de un comando SQL dinamico.


DECLARE
  ret NUMBER;
  FUNCTION fn_execute RETURN NUMBER IS
    sql_str VARCHAR2(1000);
  BEGIN
    sql_str := 'UPDATE DATOS SET NOMBRE = ''NUEVO NOMBRE''
WHERE CODIGO = 1'
;   
    EXECUTE IMMEDIATE sql_str;  
    RETURN SQL%ROWCOUNT;
  END fn_execute ;
BEGIN
     ret := fn_execute();
     dbms_output.put_line(TO_CHAR(ret));
END;

    Podemos además parametrizar nuestras consultas a través de variables host. Una variable host es una variable que pertenece al programa que está ejecutando la sentencia SQL dinámica y que podemos asignar en el interior de la sentencia SQL con la palabra clave USING . Las variables host van precedidas de dos puntos ":".

    El siguiente ejemplo muestra el uso de variables host para parametrizar una sentencia SQL dinamica.


DECLARE
  ret NUMBER;
  FUNCTION fn_execute (nombre VARCHAR2, codigo NUMBER) RETURN NUMBER
IS
    sql_str VARCHAR2(1000);
  BEGIN
    sql_str := 'UPDATE DATOS SET NOMBRE = :new_nombre
WHERE CODIGO = :codigo'
;   
    EXECUTE IMMEDIATE sql_str USING nombre, codigo;  
    RETURN SQL%ROWCOUNT;
  END fn_execute ;
BEGIN
     ret := fn_execute('Devjoker',1);
     dbms_output.put_line(TO_CHAR(ret));
END;

Cursores con SQL dinámico

    Con SQL dinámico también podemos utilizar cursores.

    Para utilizar un cursor implicito solo debemos construir nuestra sentencia SELECT en una variable de tipo caracter y ejecutarla con EXECUTE IMMEDIATE utilizando la palabra clave INTO.


DECLARE
       str_sql VARCHAR2(255);
       l_cnt   VARCHAR2(20);
BEGIN
     str_sql := 'SELECT count(*) FROM PAISES';
     EXECUTE IMMEDIATE str_sql INTO l_cnt;
     dbms_output.put_line(l_cnt);
END;

    Trabajar con cursores explicitos es también muy fácil. Únicamente destacar el uso de REF CURSOR para declarar una variable para referirnos al cursor generado con SQL dinamico. 


DECLARE
 
TYPE
CUR_TYP IS REF CURSOR;
  c_cursor CUR_TYP;
  fila PAISES%ROWTYPE;
  v_query VARCHAR2(255);
BEGIN
  v_query := 'SELECT * FROM PAISES';
 
  OPEN c_cursor FOR v_query;
  LOOP
    FETCH c_cursor INTO fila;
    EXIT WHEN c_cursor%NOTFOUND;
    dbms_output.put_line(fila.DESCRIPCION);
  END LOOP;
  CLOSE c_cursor;
END;

    Las varibles host tambien se pueden utilizar en los cursores.


DECLARE
  TYPE cur_typ IS REF CURSOR;
  c_cursor CUR_TYP;
  fila PAISES%ROWTYPE;
  v_query VARCHAR2(255);
  codigo_pais VARCHAR2(3) := 'ESP';
BEGIN

  v_query := 'SELECT * FROM PAISES WHERE CO_PAIS = :cpais';
  OPEN c_cursor FOR v_query USING codigo_pais;
  LOOP
    FETCH c_cursor INTO fila;
    EXIT WHEN c_cursor%NOTFOUND;
    dbms_output.put_line(fila.DESCRIPCION);
  END LOOP;
  CLOSE c_cursor;
END;

 


Inicio | Tutorial PL/SQL Transacciones autónomasTutorial PL/SQLFunciones integradas de PL/SQL Versión para imprimir Foros de consulta

 
duda por pepe
Respuesta recibida el [25/07/2007 02:44:23]
Tengo entendido que execute immediate no sirve para instrucciones DDL, es eso correcto? es que soy novato. Podría entonces sustituir al paquete DBMS_SQL? son cosas totalmenete distintas? estoy hecho un lio.
Gracias por vuestro tiempo.

PD: Es una gran página.

 
Pues ahora mismo no lo sé, per... por Devjoker
Respuesta recibida el [01/09/2007 09:18:43]
Pues ahora mismo no lo sé, pero este tipo de dudas se arreglan fácil, haz una prueba, intenta crear una tabla por ejemplo y nos cuentas!

 
Si se puede por Manuel Antonio Castro Pérez
Respuesta recibida el [03/09/2007 11:57:54]
Si se puede hacer con sentencias DDL:


IF (v_existe != 0) THEN
v_strSql := 'DROP TABLE MIG_EST_RECEP';

EXECUTE IMMEDIATE v_strSql;
END IF;

 
Versiones que soportan el ejemplo por Ed
Respuesta recibida el [30/10/2007 07:44:01]
tengo Forms [32 Bit] Version 10.1.2.2.0 (Production)
Oracle9i Enterprise Edition Release 9.2.0.5.0 - 64bit Production

y me esta marcando error en OPEN c_cursor FOR v_query;

como si no lo soportara.

tengo esa duda soporta esta version el ejemplo?

 
Cursores Dinamicos por Diego
Respuesta recibida el [09/11/2007 12:47:06]
y si lo que quiero es ir añadiendo condiciones a la clausula where dependiendo de si los parametros que mando a mi procedimiento son nulos o no, ¿Como lo hago? 

 
Cursores Dinamicos por Diego
Respuesta recibida el [09/11/2007 12:55:22]
y si lo que quiero es ir añadiendo condiciones a la clausula where dependiendo de si los parametros que mando a mi procedimiento son nulos o no, ¿Como lo hago?.

Mi problema es a la hora de hacer el OPEN c_cursor FOR v_query USING ...,
dependiendo de los parametros del procedimiento (si son nulos o no) en el USING tengo que poner unos parametros u otros y no se como hacerlos he probado creando una cadena de caracteres pero no se como hacerla. Gracias.

 
query dinamico por Maber
Respuesta recibida el [27/12/2007 09:30:03]
creo que puedes hacerlo de esta manera
string_query:='SELECT * ' || 'FROM TABLA ';
string_query:=string_query || ' WHERE condicion'
La idea es ir armando las cadenas de texto por medio de los pipes

 
dblink dinamico por Jose E
Respuesta recibida el [23/01/2008 07:00:02]
Hola, necesito invocar un procedimiento mediante un dblink pasandole un parametro de entrada y 9 mas de salida he realizado varias pruebas pero no he conseguido hacerlo, es mas no se si se podra hacer, esto es lo que estoy haciendo:
v_select := 'PR_DATOS_CONTACTO_LMA( :1, :2 , :3 , :4 , :5 , :6 , :7 , :8 , :9 , :10 )';

EXECUTE IMMEDIATE v_select
USING p_clave_verificador_int,v_r_verificador.nom_verificador,v_primer_apellido,v_segundo_apellido,
v_num_tlf,v_num_tlf_2,v_fax,v_r_verificador.email,v_r_verificador.clase_productor,v_descripcionVerificador;

PR_DATOS_CONTACTO_LMA es un sinonimo del DBLINK q tengo q invocar, gracias

 
dblink dinamico por Jose E
Respuesta recibida el [23/01/2008 10:26:06]
Buenas de nuevo, al final he conseguido hacerlo andar, os dejo como lo he hecho por si os sirve a alguno, un saludo.:

v_select := 'BEGIN PR_DATOS_CONTACTO_LMA( :1 , :2 , :3 , :4 , :5 , :6 , :7 , :8 , :9 , :10); END;';

EXECUTE IMMEDIATE v_select
USING IN p_clave_verificador_int,
OUT v_r_verificador.nom_verificador,
OUT v_primer_apellido,
OUT v_segundo_apellido,
OUT v_num_tlf,
OUT v_num_tlf_2,
OUT v_fax,
OUT v_r_verificador.email,
OUT v_r_verificador.clase_productor,
OUT v_desClaseProductor;

 
Sql Dinamico... por Jesus
Respuesta recibida el [14/03/2008 02:13:29]
Pedro Buenas tardes... pero esto no me funciona... COmo le hagooo

begin
declare
v_paso1 varchar2(20);
v_paso2 varchar2(20);
v_paso3 varchar2(20);
v_total varchar2(100);
v_total_1 varchar2(100);
v_cade1 varchar2(20);
v_cade2 varchar2(20);
v_cade3 varchar2(20);
v_sql varchar2(200);
res_sql varchar2(200);
begin
v_paso1 := .08;
v_cade1 := '*(nvl(';
v_paso2 := null;
v_cade2 := ',';
v_paso3 := .95;
v_cade3 := '))';
--execute immediate (v_paso1||v_cade1||'v_paso2'||v_cade2||v_paso3||v_cade3);
begin
--v_sql := 'select v_paso1||v_cade1||'||'''v_paso2'||'''||v_cade2||v_paso3||v_cade3 into v_total from dual';
v_sql := 'select v_paso1*(nvl(v_paso2,v_paso3)) into v_total from dual';
dbms_output.put_line(' SQL ... '||v_sql );
execute immediate v_sql into res_sql;
dbms_output.put_line(' SQL ... '||res_sql );
end;
--
select v_total
into v_total_1
from dual;
dbms_output.put_line(' v$n_total_formula_1 .. '||v_total_1 );
END;
END;


Añadir comentario ... Para preguntar utiliza los foros
Autor:

Título:


Para preguntar utiliza los foros.



Inicio | Tutorial PL/SQL Transacciones autónomasTutorial PL/SQLFunciones integradas de PL/SQL Versión para imprimir

SQL Dinamico
Autor: Pedro Herrarte Sánchez
Visitas: 34965 Fecha de publicación: 24/07/2006
Pedro Herrarte, es consultor tecnológico en nCapas Software(empresa de la que además es fundador), donde realiza tareas de consultoría, análisis y desarrollo.

Ha trabajado con muchas tecnologías ... SQL Server, T-SQL, ORACLE, PL/SQL, ASP.NET, ASP, CGI , C#, C, Pro*C, Java, Essbase, Vignette, PowerBuilder y Visual Basic ...

Es especialista en tecnologías .NET, entornos Web, y bases de datos, especialmente SQL Server y ORACLE.

Es fundador, diseñador y programador de www.devjoker.com.



devjoker  Lo más nuevo ... Donde se habla ... 
03/04/2008 LINQ con métodos Extensores y expresiones lambda    forma parte de...Métodos extensores
03/04/2008 Métodos Extensores: SELECT    forma parte de...Métodos extensores
03/04/2008 Almacenamiento (1)    forma parte de...Tutorial de Sistemas Informaticos
28/03/2008 Mapa de configuracion de WCF
28/03/2008 LinQ To SQL - Un ejemplo sencillo
25/03/2008 Sitios Web de ejemplo ASP.NET
22/03/2008 Problemas al conectar a redes wifi con Windows Vista
19/03/2008 Service Pack 1 de Windows Vista

Útimos temas recibidos en los foros ...
Insertar datos en un grid manualmente por flakita ... [C#] 0 09/04/2008
ayuda con un select por Manu ... [mySQL] 8 25/07/2007
CHASIS DE UN PC CUALQUIERA por carolina ... [WIN 98/NT/2000/XP] 5 23/11/2006
Q PASA JENTE por torrichi ... [Java] 2 25/03/2008
LLINQ to SQL por Javier ... [C#] 1 09/04/2008
Agendar tarea por dia pero q pueda ser a diferente hora cada dia por Orlan ... [C#] 1 09/04/2008
Ventana Popup por Maurito22 ... [ASP.NET] 1 31/03/2008
No se puede abrir el archivo fisico por ron ... [C#] 1 07/04/2008
Data report visual basic 6.0 impresion con codigo por Andres ... [Visual Basic 6.0] 8 19/11/2007
Como abrir un docuemto de word desde c# y leer las palabras para luego enviar a access por llen ... [C#] 1 08/04/2008
sentencia for por .net ... [C#] 2 08/04/2008
Leer campos blob de oracle en lenguaje visual basic por janito ... [Visual Basic 6.0] 0 08/04/2008

Access CGI JSP ORACLE UNIX
Actualidad HTML/DHTML/XHTML LINUX PHP Visual Basic .NET
ASP ISAPI MS DOS Power Builder Visual Basic 6.0
ASP.NET Java mySQL SQL WIN 98/NT/2000/XP
C# JavaScript Opinion SQL Server

devjoker  Te recomendamos además ...
22/10/2005 Insertar datos. INSERT    forma parte de...Tutorial SQL
24/05/2007 Tipos de datos en Transact SQL    forma parte de...Tutorial de Transact SQL
12/01/2006 Programación con PL/SQL    forma parte de...Tutorial PL/SQL
16/10/2006 Delegados y eventos    forma parte de...Tutorial C#
14/05/2007 Fundamentos de Transact SQL    forma parte de...Tutorial de Transact SQL
31/03/2006 Operadores en PL/SQL    forma parte de...Tutorial PL/SQL
11/09/2006 Trabajar con datos de tipo BLOB en ORACLE
12/01/2006 Introducción a PLSQL    forma parte de...Tutorial PL/SQL
20/03/2008 Funciones integradas de Transact SQL (I)    forma parte de...Tutorial de Transact SQL
28/08/2006 Ubuntu en VmWare con VMware Tools

 

Encuesta
¿Cual es tu lenguaje de programación favorito?
[Ver] [Votar]