Oracle - Cursor con parametros

 
Vista:

Cursor con parametros

Publicado por Guizmo (1 intervención) el 08/08/2002 16:47:33
Soy supernovato en esto del plsql y me ha tocado optimizar un codigo hecho en plsql y tengo un problema.
Tengo un paquete de esta forma

Package
Procedure1
Cursor uno is select ... from ... where .... and codigoqueserepiteucho
begin
...
end

Procedure2
Cursor dos is select ... from ... where .... and codigoqueserepiteucho
begin
...
end

Procedure3
Cursor tres is select ... from ... where .... and codigoqueserepiteucho
begin
...
end
end

Lo que yo quisiera es sacar de la declaracion del cursor ese codigoqueserepiteucho que ademas es gigantesco y combiarlo, quizas, por una variable ¿global? de tipo ¿varchar2? para obtener algo asi:

Package
variableglobal varchar2 = codigoqueserepitemucho
Procedure1
Cursor uno is select ... from ... where .... and variableglobal
begin
...
end

Procedure2
Cursor dos is select ... from ... where .... and variableglobal
begin
...
end

Procedure3
Cursor tres is select ... from ... where .... and variableglobal
begin
...
end
end

pero no lo puedo hacer, ya que fuera de los procedures no puedo asignar valores ni asignar un valor asi a un cursor ¿no?

Muchas gracias de antemeno
Una ultima peticion: necesitaria que la respuesta fuese lo mas simple posible, como si yo no tubiese ni idea de sql. gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Cursor con parametros

Publicado por Miguel A. (2 intervenciones) el 08/08/2002 18:02:17
Hola Guizmo, una de las formas que tienes es el sql-dinámico, donde puedes hacer variable los campos, las tablas y como tú necesitas la condición, te paso un ejemplo (creo que sencillo) para obtener el campo cli_codigo de la tabla c_clientes, obteniendo como parámetro del procedure la where. Si no lo entiendes o tienes alguna duda, me pasas un correo a [email protected] y lo comentamos. Un saludo.

create or replace
procedure mi_procedure (condicion varchar2) is
cur number; -- variable necesaria para el cursor que crearemos
eje number; -- esta para la ejecución
cliente c_clientes.cli_codigo%type; -- donde almacenaremos los datos devueltos
begin
--
cur := dbms_sql.open_cursor; -- aqui creas el cursor
dbms_sql.parse (cur, 'select cli_codigo from c_clientes where ' || condicion, 2); -- aqui lo parseas y como ves condicion es el parámetro
dbms_sql.define_column(cur, 1, cliente, 10); -- aqui le debes indicar de que tipo son los campos de la select "todos" y si alguno es numérico no necesitas el último parámetro "10" puesto que indica la longitud de los char
--
eje := dbms_sql.execute(cur); -- aqui ejecutas la select
while dbms_sql.fetch_rows(cur) != 0 loop -- aqui recorres la select
dbms_sql.column_value(cur, 1, cliente); -- aqui asignas los campos de la select a variables para tratarlos
end loop;
end;
/
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

TYPE REF CURSOR

Publicado por Jorge (60 intervenciones) el 08/08/2002 18:02:32
Trata de Probar algo así :

PACKAGE BODY NOMBRE_PACKAGE IS

V_Where Varchar2(200) DEFAULT ‘ Where Campo1 = 1 And Campo2 = 2’;

Procedure Uno is
Declare
TYPE c_Typeconsulta IS REF CURSOR;
C_consulta c_Typeconsulta;
Sql_cadena varchar2(4000);
V_nombre varchar2(400);
Begin
Sql_cadena:=’Select table_name from cat ’||V_Where;
Open c_consulta FOR sql_cadena;
Fetch c_consulta into v_nombre;
Loop
Exit when c_consulta%notfound;
--Aqui vat u codigo.

Fetch c_consulta into v_nombre;
End Loop;
Close c_consulta
End;

Procedure Dos is
Declare
TYPE c_Typeconsulta IS REF CURSOR;
C_consulta c_Typeconsulta;
Sql_cadena varchar2(4000);
V_nombre varchar2(400);
Begin
Sql_cadena:=’Select table_name from cat ’||V_Where;
Open c_consulta FOR sql_cadena;
Fetch c_consulta into v_nombre;
Loop
Exit when c_consulta%notfound;
--Aqui vat u codigo.

Fetch c_consulta into v_nombre;
End Loop;
Close c_consulta
End;

end;

Espero que te sirva.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Cursor con parametros

Publicado por Harold (697 intervenciones) el 08/08/2002 18:06:16
El codigo que se repite ponlo dentro de una funcion la cual la mandas a llamar desde cualquier package.

Saludes

Harold
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar