Ejecutar sp definido en otra BD

Hola a todos,
Queria consultar, ya que necesito ejecutar un sp, definido en una BD, mientras estoy conectado en otra.
He realizado consultas a las tablas de otra BD, usando el prefijo de instancia:BD, pero con el procedimiento me da error.
¿Alguien me puede indicar como se realiza esto?
Saludos

Marcela Vera

Yo uso esta sintaxis sin problemas:

execute function basededatos:sp817_nombreprocedimiento();

También, para hacer un testing, probé de pararme en la base x y crear un procedimiento como el siguiente:

create procedure lalala() returning varchar(100)
   return gestion:sp817_getrandompwd();
end procedure;

y lo ejecuté sin errores… aclaro, eso funciona siempre y cuando la base de datos esté en el mismo servidor.

Hola,
el problema es que lo estoy queriendo ejecutar desde PowerBuilder, en una data window, en el sql editor anda perfecto, pero no en el PB.
Saludos.

Marcela Vera

mmmm la verdad que desde PB nunca ejecuté un SP de estas características.

Lo que sí, desde el SQL Editor podés hasta ejecutar cosas de otros servers… te dejo la sintaxis:

execute procedure nombreBD@nombreServidor:nombreSP();

Pero se que hay limitaciones, desde dentro de un SP lo anterior a mi no me funciona… te dejo un link donde habla de las restricciones, como para que leas y nos desaznes a todos :smiley:

http://publib.boulder.ibm.com/infocenter/idshelp/v10/index.jsp?topic=/com.ibm.sqlt.doc/sqltmst176.htm

Marcela, tenes que establecer una transaccion que se conecte a la otra base de datos y ejecutar esa funcion con el nuevo objeto transacción.

Fijate por ejemplo como se hace cuando se conecta a la base de Preinscripción y pasa los datos a esa base. Alli crea un objeto transacción el cual se conecta a la base de datos de preinscripcion:
Ejemplo

Transaction		SQLCA_2daBase

SQLCA_2daBase = CREATE Transaction

// Seteo los valores de la conexion
SQLCA_2daBase.DBMS            = 
SQLCA_2daBase.Database     = 
SQLCA_2daBase.ServerName = 
SQLCA_2daBase.UserID          =
SQLCA_2daBase.DBPass         =
SQLCA_2daBase.DbParm        = 

// Conecto a la base de datos
CONNECT USING SQLCA_2daBase;

DECLARE mi_procedure PROCEDURE FOR  nombre_precedure(.....) 
    USING SQLCA_2daBase;

/* Ejecuto el Stored Procedure */
EXECUTE mi_procedure;
IF SQLCA_2daBase.SQLCode = -1 THEN
    // Error
ELSE
   // OK
END IF;

Alejandro,
el tema es que estoy queriendo ejecutar el sp desde una Datawindow…
El select de la dw queda:

SELECT alumnos.tipo_documento,
alumnos.nro_documento,
alumnos.apellido,
alumnos.nombres,
solicitud_beca.id_destino,
datos_academicos.carrera ||‘-’||ROUND(datos_academicos.prom_con_aplazo, 2),
g_definitiva:sp_mataprxalu_xanio_83510(‘10’, datos_academicos.carrera, datos_academicos.legajo, year(today -1))
FROM alumnos,
solicitud_beca,
outer datos_academicos
WHERE ( solicitud_beca.tipo_documento = alumnos.tipo_documento ) and
( solicitud_beca.nro_documento = alumnos.nro_documento ) … etc

Desde el DW no lo puedo ejecutar ya que me indica que el select tiene un objeto no definido, y el error que me da cuando lo intento ejecutar desde el SQLEditor, es: -556

Cannot create, drop, or modify an object on an another database server.

¿voy a tener que definir el sp dentro de esta BD? No queria repetir lo que ya esta hecho.
Saludos.

Marcela Vera

Hola Marcela

es un procedure o una funcion ?. Hasta donde yo conozco en el lista de columnas, no se pueden invocar procedures, solo funciones

de todas maneras, si es una funcion, restaria hacer la prueba invocando a una funcion creada en otra base de datos.

saludos
Ignacio

Es un procedure, y si, se pueden invocar procedures en un select… pero siempre lo hice sobre la misma BD en donde estaba conectada, no sobre otra BD,
En Guarani usan procedures en los select de las DW, y nosotros hemos realizado personalizaciones tambien.
Saludos

Marcela

Hola Marcela,

Hice una prueba para ver si podia llamar a una funcion y un procedure de otra base. Y se puede. Te paso un script mas abajo que lo hace usando 2 bases a y b y una funcion f y un procedure p.

( Tenes razon, a los procedures es posible llamarlos desde el SELECT, pero el uso de ciertas instrucciones en el procedure estan restringidas (por ej uso de transacciones) y te pueden hacer fallar el select. )

saludos
Ignacio

dbaccess sysutils <<EOF
create database a with log;
create database b with log;
EOF

dbaccess a <<EOF
drop table sumandos;
create table sumandos (s1 int, s2 int);
insert into sumandos values (100,200);
insert into sumandos values (1,2);
insert into sumandos values (5,1000);

EOF
dbaccess b <<EOF
drop function f;
create function f(a int, b int) returning int;
define c integer;
let c = a + b;
return c;
end function;

drop procedure p;
create procedure p(a int, b int) returning int;
define c integer;
let c = a + b;
return c;
end procedure;

drop procedure p2;
create procedure p2(a int, b int) returning int;
define c integer;
begin work;
let c = a + b;
commit;
return c;
end procedure;
EOF

dbaccess a <<EOF
select s1, s2, b:f(s1,s2) from sumandos;
select s1, s2, b:p(s1,s2) from sumandos;
select s1, s2, b:p2(s1,s2) from sumandos; – Da error porque usa transacciones

EOF

----- resultados --------

     s1          s2 (expression) 

    100         200          300
      1           2            3
      5        1000         1005

3 row(s) retrieved.

     s1          s2 (expression) 

    100         200          300
      1           2            3
      5        1000         1005

3 row(s) retrieved.

     s1          s2 (expression) 

675: Illegal SQL statement in SPL routine.
Error in line 1
Near character position 39

Ignacio:

Si se pueden invocar SP en un select par para que funcionen deben retornar 1 solo valor (es como si fuera una función) y aplican las restricciones que vos marcaste.

Saludos

Gustavo

Gente,
como no le encontraba la vuelta, para que desde el DW invoque al sp en otra BD, lo que hice fue generar en la BD un nuevo sp con el mismo codigo.
Sigo renegando para ver como hago para que funcione correctamente, sin tener que duplicar codigo.
Saludos.

Marcela Vera

Yo estaba a punto de decirte que crees un nuevo SP que devuelva el resultado del otro SP… no es duplicar 100% pero sí, tenés que crear un nuevo SP, ej:

En la base A tenés un SP con la siguiente interface: float sp8XX_promedio(ua, carrera, legajo)

Con crear en la base B un SP con la misma interfaz que devuelva el resultado sería suficiente.
Ej, en la base B:

CREATE FUNCTION sp8XX_promedio(ua varchar(5), carrera varchar(5), legajo varchar(15)) RETURNING FLOAT
RETURN A:sp8XX_promedio(ua, carrera, legajo);
END FUNCTION;

Para poderlo ejecutar desde una query en una datawindow la cual se conecta a la base de Guarani, la solución a seguir es la que plantea Diego creando un procedure/funcion en la base de guarani donde este llame al procedure/funcion que este en la otra base de datos.