Foro oficial de SQL

No por quejarme, pero me he gastado casi que todo el dia investigando como llamo un Stored Procedure de Oracle en C# y llenar asi una tabla o lo que sea, casi no hay documentacion, o mejor dicho si la hay, pero de varias versiones y en cada una algo cambia, ademas que cada autor de cada blog u articulo usa Package en vez de usar el Stored Procedure directamente. He buscado en ingles y en español y pues ya lo logré, pero tenaz el trabajito..... SQL Server VS Oracle, ¿quien ganaria? si esto no mas fue llamando un SP, ¿que continuará?

No se que tan bueno sea esto, ya que entre menos documentacion, menos gente manejará la herramienta porque hay gente que se cansa a mitad de camino y prefieren pasarse a otras herramientas. DIgo que tal vez sea bueno por $$$$
 
No por quejarme, pero me he gastado casi que todo el dia investigando como llamo un Stored Procedure de Oracle en C# y llenar asi una tabla o lo que sea, casi no hay documentacion, o mejor dicho si la hay, pero de varias versiones y en cada una algo cambia, ademas que cada autor de cada blog u articulo usa Package en vez de usar el Stored Procedure directamente. He buscado en ingles y en español y pues ya lo logré, pero tenaz el trabajito..... SQL Server VS Oracle, ¿quien ganaria? si esto no mas fue llamando un SP, ¿que continuará?

No se que tan bueno sea esto, ya que entre menos documentacion, menos gente manejará la herramienta porque hay gente que se cansa a mitad de camino y prefieren pasarse a otras herramientas. DIgo que tal vez sea bueno por $$$$

Creo que es más desconocimiento y que te quedaste atrapado en el paradigma de uso del SQL Server Magement Studio.

si utilizas ODP la manera de hacerlo es estandard, es decir tal como lo haces para SQL Server debes hacerlo para oracle DB.,

en TOAD para generar un select como el que quieres, es ir al Schema Browser, clic derecho sobre la tabla , Generate Statement > Select

Documantación completa para ODP :

http://www.oracle.com/technology/docs/tech/windows/odpnet/index.html
http://www.oracle.com/technetwork/topics/dotnet/index-085163.html
 
Creo que es más desconocimiento y que te quedaste atrapado en el paradigma de uso del SQL Server Magement Studio.

si utilizas ODP la manera de hacerlo es estandard, es decir tal como lo haces para SQL Server debes hacerlo para oracle DB.,

en TOAD para generar un select como el que quieres, es ir al Schema Browser, clic derecho sobre la tabla , Generate Statement > Select

Documantación completa para ODP :

http://www.oracle.com/technology/docs/tech/windows/odpnet/index.html
http://www.oracle.com/technetwork/topics/dotnet/index-085163.html

No es standard Juan, si busco en Google encuentro mil maneras distintas de llamar un Stored Procedure que retorne un set de datos, y al parecer todas funcionan, pero lo que se requiere es practicidad y para ello hay que tener un nivel alto de comprension de Oracle.

Este tipo de retos son los que me gustan y no lo voy a abandonar hasta que comprenda perfectamente lo que se está haciendo, pero aqui la documentacion es un cuento duro, veo mucho blog de Oracle 6, 7, 9, y algo de 10 u 11g, pero todos haciendolo a su forma, incluso la documentacion de Oracle que me pasaste lo hace de varias maneras y ambas funcionan :S y los ejemplos que usan son complejos. (Valga la aclaracion que estoy buscando principalmente en ingles)

La manera mas practica que encontré para retornar un set de datos desde un Stored Procedure fue la siguiente:

Código:
CREATE OR REPLACE PROCEDURE sp_post_cab(rc OUT sys_refcursor)
AS
BEGIN
  OPEN rc FOR SELECT id_sol_prt_post, estado_solicitud, fecha_ventana_cambio FROM tbl_cab_sol_prt_post;
END sp_post_cab;

No tengo ni idea que esta haciendo ahi, pero lo que sé es que me está trayendo datos y es lo que necesito, ahora viene el cuento de pasarle datos para el UPDATE, INSERT y DELETE :S
 
La manera mas practica que encontré para retornar un set de datos desde un Stored Procedure fue la siguiente:

Código:
CREATE OR REPLACE PROCEDURE sp_post_cab(rc OUT sys_refcursor)
AS
BEGIN
  OPEN rc FOR SELECT id_sol_prt_post, estado_solicitud, fecha_ventana_cambio FROM tbl_cab_sol_prt_post;
END sp_post_cab;

No tengo ni idea que esta haciendo ahi, pero lo que sé es que me está trayendo datos y es lo que necesito, ahora viene el cuento de pasarle datos para el UPDATE, INSERT y DELETE :S


tu estas hablando de stored procedures y yo estaba hablando del Data Provider..

lo que hiciste es mejor con un select a secas que con un SP... ahi el SP sobra.

y lo del update, insert y delete es facil, pasas los parametros de filtro como parametros del SP y luego simplemente haces el DML... asi mas o menos


PHP:
CREATE OR REPLACE PROCEDURE MyUpdate( vcCampoFiltro In VARCHAR2 )
IS

BEGIN
 UPATE laTabla
 SET campo1 ='S'
 WHERE campo2= vcCampoFiltro ;

END;

desde luego mucho mejor dejarlos en un package y no en una funcion suelta.
 
tu estas hablando de stored procedures y yo estaba hablando del Data Provider..

lo que hiciste es mejor con un select a secas que con un SP... ahi el SP sobra.

y lo del update, insert y delete es facil, pasas los parametros de filtro como parametros del SP y luego simplemente haces el DML... asi mas o menos


PHP:
CREATE OR REPLACE PROCEDURE MyUpdate( vcCampoFiltro In VARCHAR2 )
IS

BEGIN
 UPATE laTabla
 SET campo1 ='S'
 WHERE campo2= vcCampoFiltro ;

END;

desde luego mucho mejor dejarlos en un package y no en una funcion suelta.

Que amable Juan, gracias :)

Hice ese SP con un SELECT a secas puesto que, digamos, si necesito cambiar el nombre de la tabla y los campos, conservando la aplicacion .NET actual, que en el proyecto anterior me ocurrió ese caso, simplemente creo un Stored Procedure y nombro las columnas como la aplicacion requiere, en vez de cambiar en el codigo fuente de la aplicacion .NET estas tablas.

Resulta que el desarrollador del proyecto donde estuve hacia todo de la manera mas loca y complicada posible en VB.NET :S, pero al menos el hombre usaba Stored Procedures, entonces la base de datos y los nombres de los campos cambiaron, asi que lo que se hizo simplemente fue crear los SP con los mismos nombres de la aplicacion y mapear la informacion a retornar con los nombres que dicha aplicacion requeria.

Ya pasaron dos años desde que me mostraste C#, ahora se vienen otros dos años para Oracle imagino yo jejeje......

Gracias por la ayuda Juank_Solocodigo :)
 
ya me estaba preguntando yo que tenia que ver "como llamar un Store Procedure en C#" con un Store Procedure en Oracle :p

aunque reconozco que hace rato deje a un la Oracle (mas por el trabajo que por gusto), no ve casi diferencia entre la estructura que pusiste de ejemplo para el SP (el SELECT) y lo mismo pero en SQL Server, veo una version básica, simplificada y "empaquetada" :p

por otro lado si quieres es controlar una o varias tablas mediante un SP c/u (interesante opción, aunque tocaría mirarla mas a fondo ;)) seria cuestión de "extender" el ejemplo que puso JuanK
 
JuanK_solocodigo!!! ayuda!! algun duro en Oracle por favor!!!

Con respecto al Stored Procedure que anteriormente mencioné, ¿como hago para ejecutarlo y ver el resultset?
es decir, en SQL Server yo podia hacer "EXEC miprocedimiento" y veia el grillado, pero no se como hacer eso en Oracle.

Añadiendo que por ahi he visto blogs donde dice algo como que tengo que declarar una variable refcursor pero ni si quiera puedo hacer eso:

"var rc refcursor" me salta el error ora-00900 Invalid Statement :S

Gracias si alguien me puede colaborar
 
JuanK_solocodigo!!! ayuda!! algun duro en Oracle por favor!!!

Con respecto al Stored Procedure que anteriormente mencioné, ¿como hago para ejecutarlo y ver el resultset?
es decir, en SQL Server yo podia hacer "EXEC miprocedimiento" y veia el grillado, pero no se como hacer eso en Oracle.

Añadiendo que por ahi he visto blogs donde dice algo como que tengo que declarar una variable refcursor pero ni si quiera puedo hacer eso:

"var rc refcursor" me salta el error ora-00900 Invalid Statement :S

Gracias si alguien me puede colaborar
desde TOAD, asegurate que en el panel de resultados este activo el Tab REF CURSOR Results y haces esto
PHP:
CREATE OR REPLACE PROCEDURE sp_post_cab(rc OUT sys_refcursor)
AS
BEGIN
  OPEN rc FOR SELECT CODES_CODIGO, CODES_CODIGO_PADRE FROM par_codigo_descripcion;
  
END sp_post_cab;
/
exec sp_post_cab(:ab)

Toad te preguntara por el tipo de la variable :ab asi que le indicas que es de tipo cursor
 
Señores buenos días tengo una pregunta:

En SQL Server 2005 tengo digamos n procedimientos y dentro de todos tengo la misma variable @usu_sesion_codigoP varchar (3), el problema esta en que esa variable debería ser de 5 caracteres y en algunas partes se está comiendo numeros al ejecutar el procedimiento de la auditoría, entonces es un problema grave.

Asi que mi pregunta es, se tiene alguna forma de cambiar para TODOS los procedimientos que esa variable sea de 5 caracteres y no de 3 como está en algunos?.

Gracias.
 
Un favor del mas grande

estoy llevan una materia nuevas tecnologias y para esa materia nesecito una base de datos llena o con datos minimos de 6 meses no importa en cualquiera que sea sqlserver,mysql,access,oracle por favor si me facilitan una les quedare eternamente agradecido.
 
Señores, ¿alguna manera mas optima de realizar esto:

Código:
SET SERVEROUT ON
DECLARE
    l_contador PLS_INTEGER := 6; --Numero de lineas que serán afectadas, este numero debe ser hardcodeado ya debido a lo que se ha hablado con el lider funcional y la informacion que está en produccion
    v_Cuenta NUMBER; --Este numero de lineas son las que hay en la tabla.
BEGIN
    DELETE FROM A2219047_VCR
    WHERE cod_cia = 1
    AND nom_regra_vcr = 'SR_P_CT_399_VCR'
    AND cod_ramo in (201, 203, 204, 207, 213, 214, 215, 217, 218, 314);
    
    IF(l_contador = SQL%ROWCOUNT) 
    THEN
        DBMS_OUTPUT.PUT_LINE('hacer COMMIT');
    ELSE
        DBMS_OUTPUT.PUT_LINE('hacer ROLLBACK');
    END IF;
    ROLLBACK;
END;

El codigo funciona, pero estoy aprendiendo PL\SQL y quisiera saber si existe alguna manera mas practica de escribir este codigo, o asi esta bien?

He hablado con el analista funcional y determinamos que se deben eliminar solo 6 registros, pero como esa base de datos esta Online puede que sean insertados mas registros, pero necesitamos que sean solo 6 ya que si algo pasa, es porque en algun momento alguien modificó esa tabla, por eso hardcode el 6 en la variable "l_contador ".

Gracias!!!!
 
Cordial saludo.

La verdad no pretendo que me hagan el trabajo, escribo para obtener de ideas de como desarrollar lo siguiente:

Realice un subprograma PL/SQL que reciba el nombre de dos tablas relacionales (no tienen elementos objeto-relacionales) que existen en su base de datos.

Su programa deberá devolver creadas en la base de datos un par de tablas tipadas equivalentes a las correspondientes tablas relacionales con datos inclusive y teniendo en cuenta que las claves foráneas que existan entre dichas tablas relacionales pasarán a ser REFs en las nuevas.
Nota: Asuma que ninguna de las 2 tablas tiene claves foráneas hacia otras tablas. Asuma que sólo puede haber claves foráneas entre las dos tablas dadas.

Conozco que la sentencia SELECT * FROM ALL_TABS_COLUMNS WHERE TABLE_NAME='NOMBRE_TABLA'. Trae todo el esquema de la tabla detallado, pero no se me ocurre como tomar cada columna de esta tabla y crear un query para la creación del TYPE. Si alguién tiene una idea le agradecería infinitamente. Feliz día.
 
Cómo optimizar este SQL query??

Cuando ejecuto el siguiente query en SQL toma mucho tiempo, el costo es alto y a veces cuelga el motor de SQL, hay alguna manera de optimizarlo???

cualquier sugerencia será bienvenida


declare @serial varchar(20),
@fecha_inicio datetime,
@fecha_fin datetime

select @serial = '%PSR0617%'
select @fecha_inicio = '2010-10-01'
select @fecha_fin = '2010-10-31'


print '--RESULTADOS PARA ' + @serial + char(10)
select * from tabla1 a (nolock), tabla2 b(nolock), tabla3 c (nolock), tabla4 d (nolock)
where a.campo1 = b.campo1 and a.fecha = b.fecha and a.campo2 = d.campo2 and b.campo3 = c.campo3
and a.fecha in (select fecha from tabla4 (nolock) where fecha between @fecha_inicio and @fecha_fin and valor like @serial)
and
b.detalle in (select detalle from tabla4 (nolock) where fecha between @fecha_inicio and @fecha_fin and cat_valor like @serial)

go

select
* from tabla5 a, tabla4 b (nolock)
where
a.campo1 = b.campo2
and b.fecha in (select fecha from tabla4 (nolock) where fecha between @fecha_inicio and @fecha_fin and valor like @serial)
and
b.detalle in (select fecha from tabla4 (nolock) where fecha between @fecha_inicio and @fecha_fin and valor like @serial)

 
El operador like '%%' en si es muy lento ya que tiene que buscar todas las combinaciones posibles de izquierda a derecha, mira si es posible cambiarlo por un igual, y otra cosa que puedes hacer es cambiar las subconsultas por joins eso siempre funciona y aumenta bastante el rendimiento

En vez de

select * from tabla1 where fecha in (select fecha from tabla2 where fecha between @fecha1 and @fecha2)

puede ser algo como

select tabla1.* from tabla1
inner join tabla2
on tabla1.id = tabla2.idtabla1
where tabla2.fecha between @fecha1 and @fecha2

Esto siempre me funciona

Tambien puedes usar el execution plan siempre y cuando sea en sql server que te dice en que partes la consulta se toma mas tiempo y que indices pueden ayudar a mejorar el rendimiento.
 
  • Me gusta
Reacciones: 2 personas