Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Sybase 15 Tabla Temporal

Estas en el tema de Sybase 15 Tabla Temporal en el foro de Bases de Datos General en Foros del Web. Hola, tengo el siguiente problema; en sybase no puedo crear tablas temporales dentro de una transaccion ej: Begin tran CREATE TABLE #ActivosInactivos ( Folio NUMERIC ...
  #1 (permalink)  
Antiguo 02/11/2011, 08:52
 
Fecha de Ingreso: septiembre-2007
Mensajes: 3
Antigüedad: 16 años, 7 meses
Puntos: 0
Pregunta Sybase 15 Tabla Temporal

Hola, tengo el siguiente problema; en sybase no puedo crear tablas temporales dentro de una transaccion ej:
Begin tran
CREATE TABLE #ActivosInactivos
(
Folio NUMERIC IDENTITY,
RutGiradorAct NUMERIC,
NroSolicitudAct NUMERIC,
Causal CHAR(6),
RegionAct CHAR (6),
Estado CHAR(6),
FechaProtesto DATETIME
)
Commit Tran
ERROR: "The 'CREATE TABLE' command is not allowed within a multi-statement transaction in the 'tempdb' database."

Entonces, creo que si cambio las tablas temporales por variables del tipo table lo aceptaría dendro de "begin tran", pero no se como declarar variables de tipo table en sybase, lo he intentado de 2 formas y no acepta la syntaxis.
Ej:

DECLARE @tmpTab TABLE
(
Offset SMALLINT
, PeriodStart DATETIME
, PeriodEnd DATETIME
)
ERROR: "Incorrect syntax near the keyword 'TABLE'."

---==============
DECLARE LOCAL TEMPORARY TABLE temp_tb (
Campo1 char(100), campo2 double)

ERROR:"Incorrect syntax near the keyword 'TEMPORARY'."

Espero que alguien sapa solucionar esto.

Saludos...
  #2 (permalink)  
Antiguo 02/11/2011, 18:02
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 6 meses
Puntos: 85
Respuesta: Sybase 15 Tabla Temporal

Según recuerdo sybase no soporta variables de tipo tabla o array. En cuanto a las tablas temporales, para crearlas dentro de una transacción tienes que configurar la base con el parámetro:

Código:
sp_dboption database_name,"ddl in tran", true
De todos modos, esto no se recomienda porque genera bloqueos en las tablas de sistema o en la tempdb lo que puede llevar a caídas en el rendimiento, además no tiene mucho sentido ya que las tablas temporales en sybase tienen ámbito de sesión, no de transacción, por lo que crearlas dentro de una no hace la diferencia. En general, el uso es algo como:


Código:
CREATE TABLE #ActivosInactivos
(
Folio NUMERIC IDENTITY,
RutGiradorAct NUMERIC,
NroSolicitudAct NUMERIC,
Causal CHAR(6),
RegionAct CHAR (6),
Estado CHAR(6),
FechaProtesto DATETIME
)

Begin tran
 proceso de insert en la tabla temporal 
 proceso de consulta en la tabla temporal
Commit Tran

drop table #ActivosInactivos
Saludos
  #3 (permalink)  
Antiguo 04/11/2011, 06:52
 
Fecha de Ingreso: septiembre-2007
Mensajes: 3
Antigüedad: 16 años, 7 meses
Puntos: 0
Respuesta: Sybase 15 Tabla Temporal

OK, entiendo que puedo colocar el begin tran despues del create table, pero el procedimiento que contiene las tablas temporales es llamado por otro procedimiento que comienza con begin tran antes de llamar al prc que contiene las tablas temporales, como me indicas que sybase no ecepta variables de tipo table tendré que ver otra forma y sacar las tablas temporales.
Gracias.
  #4 (permalink)  
Antiguo 04/11/2011, 17:00
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 6 meses
Puntos: 85
Respuesta: Sybase 15 Tabla Temporal

En los casos de procedimientos anidados la solución es crear las tablas temporales en el procedimiento primario para que sean visibles dentro de los procedimientos secundarios, y además, si los procedimientos secundarios pueden ser llamados en forma independiente, deben tener el código que valide las tablas temporales para crearlas si no existen, por ejemplo:

Código:
create procedure p1 as
 create table #t1 (id numeric(8))
 begin tran
  insert into #t1 values (1)
  exec p2
 commit tran

create procedure p2 as
 if not exists (select name from tempdb..sysobjects where name = "#t1")  
 begin
  create table #t1 (id numeric(8))
 end
 select * from #t1
Saludos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:05.