InicioArticulos y noticiasBases de datosProgramaciónForosInternetServiciosContratacionEmail
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
SQL Dinamico
Funciones integradas de PL/SQL
Transacciones con PL/SQL

Afiliados
La Web del programador
MundoProgramacion


 

Tablas PL/SQL

Declaración de tablas de PL/SQL

    Las tablas de PL/SQL son tipos de datos que nos permiten almacenar varios valores del mismo tipo de datos.

    Una tabla PL/SQL :

  • Es similar a un array
  • Tiene dos componenetes: Un índice de tipo BINARY_INTEGER que permite acceder a los elementos en la tabla PL/SQL y una columna de escalares o registros que contiene los valores de la tabla PL/SQL
  • Puede incrementar su tamaño dinámicamente.

    La sintaxis general para declarar una tabla de PL es la siguiente:


TYPE <nombre_tipo_tabla> IS TABLE OF
<tipo_datos> [NOT NULL]
INDEX BY BINARY_INTEGER ;

    Una vez que hemos definido el tipo, podemos declarar variables y asignarle valores.


DECLARE
/* Definimos el tipo PAISES como tabla PL/SQL */
TYPE
PAISES IS TABLE OF NUMBER INDEX BY BINARY_INTEGER ;
/* Declaramos una variable del tipo PAISES */
tPAISES PAISES;
BEGIN
tPAISES(1) := 1;
tPAISES(2) := 2;
tPAISES(3) := 3;
END;


     No es posible inicializar las tablas en la inicialización.

     El rango de binary integer es –2147483647.. 2147483647, por lo tanto el índice puede ser negativo, lo cual indica que el índice del primer valor no tiene que ser necesariamente el cero.


Tablas PL/SQL de registros

    Es posible declarar elementos de una tabla PL/SQL como de tipo registro.


DECLARE

TYPE
PAIS IS RECORD
(
CO_PAIS NUMBER NOT NULL ,
DESCRIPCION VARCHAR2(50),
CONTINENTE VARCHAR2(20)
);
TYPE PAISES IS TABLE OF PAIS INDEX BY BINARY_INTEGER ;
tPAISES PAISES;
BEGIN

tPAISES(1).CO_PAIS := 27;
tPAISES(1).DESCRIPCION := 'ITALIA';
tPAISES(1).CONTINENTE := 'EUROPA';


END;


Funciones para el manejo de tablas PL/SQL

    Cuando trabajamos con tablas de PL podemos utilizar las siguientes funciones:

  • FIRST. Devuelve el menor índice de la tabla. NULL si está vacía.
  • LAST. Devuelve el mayor índice de la tabla. NULL si está vacía.

    El siguiente ejemplo muestra el uso de FIRST y LAST : 


DECLARE
 TYPE ARR_CIUDADES IS TABLE OF VARCHAR2(50) INDEX BY BINARY_INTEGER;
 misCiudades ARR_CIUDADES;
BEGIN
     misCiudades(1) := 'MADRID';
     misCiudades(2) := 'BILBAO';
     misCiudades(3) := 'MALAGA';
    
     FOR i IN misCiudades.FIRST..misCiudades.LAST
     LOOP
         dbms_output.put_line(misCiudades(i));
     END LOOP;
END;

  • EXISTS(i). Utilizada para saber si en un cierto índice hay almacenado un valor. Devolverá TRUE si en el índice i hay un valor.


DECLARE
 TYPE ARR_CIUDADES IS TABLE OF VARCHAR2(50) INDEX BY BINARY_INTEGER;
 misCiudades ARR_CIUDADES;
BEGIN
     misCiudades(1) := 'MADRID';    
     misCiudades(3) := 'MALAGA';
    
     FOR i IN misCiudades.FIRST..misCiudades.LAST
     LOOP
         IF misCiudades.EXISTS(i) THEN
           dbms_output.put_line(misCiudades(i));
         ELSE
           dbms_output.put_line('El elemento no existe:'||TO_CHAR(i));
         END IF
     END LOOP;
END;

  • COUNT. Devuelve el número de elementos de la tabla PL/SQL.


DECLARE
 TYPE ARR_CIUDADES IS TABLE OF VARCHAR2(50) INDEX BY BINARY_INTEGER;
 misCiudades ARR_CIUDADES;
BEGIN
     misCiudades(1) := 'MADRID';    
     misCiudades(3) := 'MALAGA';
     /* Devuelve 2, ya que solo hay dos elementos con valor */
     dbms_output.put_line(
'El número de elementos es:'||misCiudades.COUNT);   
END;

  • PRIOR (n). Devuelve el número del índice anterior a n en la tabla.


DECLARE
  TYPE
ARR_CIUDADES IS TABLE OF VARCHAR2(50) INDEX BY BINARY_INTEGER;
  misCiudades ARR_CIUDADES;
BEGIN
  misCiudades(1) := 'MADRID';
  misCiudades(3) := 'MALAGA';
  /* Devuelve 1, ya que el elemento 2 no existe */
  dbms_output.put_line(
'El elemento previo a 3 es:' || misCiudades.PRIOR(3));
END;

  • NEXT (n). Devuelve el número del índice posterior a n en la tabla.


DECLARE
  TYPE
ARR_CIUDADES IS TABLE OF VARCHAR2(50) INDEX BY BINARY_INTEGER;
  misCiudades ARR_CIUDADES;
BEGIN
  misCiudades(1) := 'MADRID';
  misCiudades(3) := 'MALAGA';
  /* Devuelve 3, ya que el elemento 2 no existe */
  dbms_output.put_line(
'El elemento siguiente es:' || misCiudades.NEXT(1));
END;

  • TRIM. Borra un elemento del final de la tabla PL/SQL.
  • TRIM(n) borra n elementos del final de la tabla PL/SQL.
  • DELETE. Borra todos los elementos de la tabla PL/SQL.
  • DELETE(n) borra el correspondiente al índice n.
  • DELETE(m,n) borra los elementos entre m y n.

 


Inicio | Tutorial PL/SQL Registros PL/SQLTutorial PL/SQLTipo VARRAY Versión para imprimir Foros de consulta

 
TYPE PAISES IS TABLE OF PAIS... por Anónimo
Respuesta recibida el [03/08/2007 03:03:39]
  TYPE PAISES IS TABLE OF PAIS INDEX BY BINARY_INTEGER ;
tPAISES PAISES;
BEGIN

miPAIS(1).CO_PAIS := 27;
miPAIS(1).DESCRIPCION := 'ITALIA';
miPAIS(1).CONTINENTE := 'EUROPA';

END;
En este codigo, no deberia ser:

tPAISES(1).CO_PAIS ...
en lugar de
miPAIS(1).CO_PAIS

???????

 
Cierto y corregido.... por Devjoker
Respuesta recibida el [04/08/2007 09:16:33]
Cierto y corregido.

 
consulta de funcion y tabla por JOHN barril
Respuesta recibida el [14/08/2007 11:45:49]
Felicitaciones por el sitio. Miconsulta es si puedo retornar una tabla pl/sql como resultado de una función y rescatarla con algún lenguaje de programación como Java.

 
PL/SQL-ORACLE por Garamir
Respuesta recibida el [16/10/2007 09:54:32]
Hola Pedro,necesito saber como hacer para transportar una B.D. desde una aplicación PL/SQL a una B.D. Oracle  10 G.
Desde ya muchas gracias por tu valiosa colaboración. Saludos

 
Previo a 3? por Leandro
Respuesta recibida el [18/10/2007 06:30:50]
donde dice:
"dbms_output.put_line('El elemento previo a 3 es:' || misCiudades.NEXT(1));"

no deberia decir "El elemento proximo a 1 es : misCiudades.NEXT(1)"

 
oli por reneitor el makina
Respuesta recibida el [19/11/2007 09:57:06]
PeneLico sql me excita :B

 
Creacion de arrays en forms por nel
Respuesta recibida el [01/02/2008 07:31:24]
Deseo crear un vector o array en form builder y no se como definirla
gracias

 
Esto esta mal, cierto ? por Alejandro
Respuesta recibida el [21/02/2008 08:58:13]
'El elemento previo a 3 es:' || misCiudades.NEXT(1));
END; ?????

solo hacer notar ese detallito

 
Visto y corregido!... por devjoker
Respuesta recibida el [22/02/2008 05:30:05]
Visto y corregido!

 
necesito una gran ayuda por osvaldo
Respuesta recibida el [09/05/2008 11:34:48]
hola soy de puebla estoy estudiando en estos momentos oracle 10g aunque no se me damucho me interesa saber programar bases de datos quisiera saber si me podrian ayudar de antemano mil gracias y espero una pronta respuesta 
pd
mi talon de aquiles es lo mas basico las relaciones de identidades e identificar las llaves por favor ayudenme mi correo es zherezar@hotmail.com

 
Tabla de tablas por Julio
Respuesta recibida el [23/05/2008 05:15:36]
Hola estoy intentando hacer una tabla de tablas de varchar2. Es decir una matriz de varchar2 y al intentar asignar un valor a la posicion (0)(0) me dice:
Subscript outside of limit
He inicializado antes la variable con un constructor con el mismo nombre que el tipo.
Algo como esto:

v_matriz := tt_generico();

donde:
TYPE tt_generico IS TABLE OF t_generico;

TYPE t_generico IS TABLE OF varchar2(600);

La definicion se haria de otra manera? O me estoy dejando algo?
Un saludo,
Gracias.

 
Tablas y cursores por Edgar
Respuesta recibida el [08/08/2008 09:55:06]
Hola, estoy desarrolloando una aplicación en ColdFusion y me conecto a Oracle, estoy usando procedimientos almacenados para mis consultas, en el procedimiento, utilizo algo como esto para enviar el resultado de la consulta

OPEN cur FOR
SELECT * FROM miTABLA

donde cur es un parámetro de salida de mi procedimiento almacenado. Todo esto funciona muy bien, no tengo problemas.

El asunto es que ahora quisiera realizar una serie de operaciones antes de devolver la tabla, así que se me ocurre crear un tipo RECORD con los campos que voy a procesar e ir colocando cada registro en una tabla. Bueno, hasta aquí vamos bien, pero ahora como saco los resultados de la tabla para poder recuperarlos desde mi aplicacion. El dbms_output.put_line no me sirve para lo que yo quiero, pensaba en algo como esto

OPEN cur FOR
SELECT * FROM miTABLAconRECORDS

pero esto no funciona. Alguna idea de como poder realizar esto??

De antemano gracias y felicidades, es un excelente trabajo el que tu haces...

 
Hacer de una tabla otra tabla por Idalia
Respuesta recibida el [15/08/2008 12:45:10]
Como se le hace para tomar datos de una tabla creada y crear otra; es decir..
la base de datos es muy lenta entonces tuve cque crear unas tablas en pl pero aun asi tarda muchisimo.
entonces necesito hacer una consulta muy general y guardarla en una tabla para despues llenar la otra tabla con calculos de esta y asi hace r menos consultas a la base de datos y agilizar el proceso, porke mas menos se tarda 2 hrs en leer 1026 registos..
si tienes algo que pueda ayudarme te lo agradeceria..

 
Hola Idalia, no entendi muy bi... por Mario
Respuesta recibida el [19/10/2008 09:58:50]
Hola Idalia, no entendi muy bien tu pregunta, pero si te tardas 2 horas en procesar 1000 registros lo primero que me viene a la mente es que no tienes creados los indices adecuados o incluso que no tienes indices.

 
insert pl/sql por laura
Respuesta recibida el [29/10/2008 03:45:09]
Hola a todos! estoy intentando insertar unos datos en una tabla q ya tengo creada, pero me da un error y no se si es xq nop uedo hacer el insert normal de sql en un bloque pl/sql...
alguien me puede ayudar??
muchas gracias de antemano

 
para laura por JRD
Respuesta recibida el [05/11/2008 03:32:05]
Verifica si tu tabla tiene restricciones de integridad, te pongo un ejemplillo sencillo espero que te sirva un saludo.

DECLARE
V_CONTADOR NUMBER := 7;
BEGIN
INSERT INTO TEMPORAL(COLUMNANUMERICA)
VALUES(V_CONTADOR);
END;
/

 
para laura por JRD
Respuesta recibida el [05/11/2008 03:38:02]
te envio la tabla sencilla.
CREATE TABLE TEMPORAL (COLUMNANUMERICA NUMBER(2));

 
Usando tipos table por Angel Q.
Respuesta recibida el [23/11/2008 12:47:24]
Se puede utilizar una variable de tipo table dentro del where de un select.De este modo:
declare
TYPE tab_bien IS TABLE OF NUMBER(10) INDEX BY BINARY_INTEGER;
v_a_bien tab_bien;
i integer;
begin
--estos valores los recibo concatenados en un varchar2
v_a_bien(1):=3100;
v_a_bien(2):=91;
v_a_bien(3):=1248;
v_a_bien(4):=958;
select count(*) into i from bien b where b.codbien in v_a_bien;
--ojo: no puedo colocar b.codbien in (3100,91,1248,958) pues estos valores vienen en un parametro
dbms_output.put_line('Cantidad: '+to_char(i));
end;
Gracias por la respuesta.

 
Devolver tabla por Seamonkey
Respuesta recibida el [10/12/2008 03:46:40]
Buenas, como se puede devolver una tabla creada en pl/sql?


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

Título:


Para preguntar utiliza los foros.



Inicio | Tutorial PL/SQL Registros PL/SQLTutorial PL/SQLTipo VARRAY Versión para imprimir

Tablas PL/SQL
Autor: Pedro Herrarte Sánchez
Visitas: 48289 Fecha de publicación: 14/07/2006
Pedro Herrarte, es consultor independiente, ofreciendo servicios de consultoría, análisis, desarrollo y formación.

Posee mas de diez años de experiencia trabajando para las principales empresas de España.

Es especialista en tecnologías .NET, entornos Web, bases de datos (SQL Server y ORACLE) e integración de sistemas.

Es experto en desarrollo (C#, ASP.NET, VB.Net, T-SQL, PL/SQL, , ASP, CGI , C, Pro*C, Java, Essbase, Vignette, PowerBuilder y Visual Basic ...) y bases de datos (SQL Server y ORACLE).

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




Visitas: 42 | Comentarios: 0 | Archivo: Articulos
Visitas: 109 | Comentarios: 0 | Archivo: Articulos
Visitas: 155 | Comentarios: 0 | Archivo: Articulos
Categorias: ASP.NET
Visitas: 33 | Comentarios: 0 | Archivo: Articulos
Categorias: TFS
Visitas: 285 | Comentarios: 1 | Archivo: Articulos
Categorias: Visual Basic .NET|C#
Visitas: 842 | Comentarios: 2 | Archivo: Articulos
Categorias: C#|ASP.NET|HTML DHTML|XML|JavaScript|ASP.NET|ASP|PHP|Visual Studio
Visitas: 712 | Comentarios: 1 | Archivo: Articulos
Categorias: Administración|Tutorial SQL
Visitas: 451 | Comentarios: 0 | Archivo: Articulos
Categorias: ASP.NET
Visitas: 1053 | Comentarios: 1 | Archivo: Articulos
Categorias: ASP.NET|CSS|ASP.NET
Visitas: 250 | Comentarios: 0 | Archivo: Articulos
Categorias: TFS

Útimos temas recibidos en los foros ...
FORMULARIO ACCESS por jcifuentes ... [Access] 11 29/05/2007
Ysmael por Ysmael ... [SQL] 0 08/01/2009
Reflection por Maurito22 ... [C#] 2 06/01/2009
Programador por Robert ... [ORACLE] 0 07/01/2009
como insertar registros en un formulario de visual basic.net desde la base de datos sql server por orlan ... [SQL Server] 8 09/06/2008
quierocodigo de autogenerado del seguro por edwin garcia ramirez ... [Visual Basic .NET] 0 07/01/2009
Video gratis sobre AJAX con ASP.NET por alexxe ... [ASP.NET] 1 06/01/2009
calcular saldo acumulativo por cben ... [SQL] 5 30/12/2008
comparar 2 campos de 2 tablas usando el like por nani ... [SQL Server] 1 06/01/2009
Apagar ordenador remoto en C# por victoryiyo ... [C#] 1 07/01/2009
numero de AUTOGENERADO IPSS por carlos ... [Visual Basic .NET] 5 30/10/2008
Como mandar mensaje a Celular por Pako ... [C#] 63 13/03/2007

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 ...
02/09/2007 Procedimientos almacenados en Transact SQL    forma parte de...Tutorial de Transact SQL
16/10/2006 Delegados y eventos    forma parte de...Tutorial C#
03/10/2006 Polimorfismo    forma parte de...Tutorial C#
21/07/2006 Funciones integradas de PL/SQL    forma parte de...Tutorial PL/SQL
05/10/2006 Espacios de nombres    forma parte de...Tutorial C#
08/09/2007 Funciones en Transact SQL    forma parte de...Tutorial de Transact SQL
26/07/2006 Secuencias    forma parte de...Tutorial PL/SQL
24/07/2006 SQL Dinamico    forma parte de...Tutorial PL/SQL
03/10/2006 Miembros de tipo    forma parte de...Tutorial C#
21/02/2006 Introducción a .NET

 

Encuesta
¿A que perfil te adaptas mejor?
[Ver] [Votar]