PDA

Ver la Versión Completa : Ayuda! ¿Cómo llamar a Procedimiento Almacenado?


Ignacio Gentile
04-05-2011, 14:22:57
Buenas!

Estoy tratando de llamar desde delphi 7 a un procedimiento almacenado de mi base de datos Postgre 8.4..Para la conexión uso los componentes Zeos.

Tiro al formulario un Zconection el cual tiene las propiedades para conectarse a la base de datos, lo cual anda bien..Luego para obtener el procedimiento almacenado tiro un ZStoredProc al que asocio con la conexión anterior y selecciono el procedimiento almacenado que quiero ejecutar..

Mi problema es que nose como pasarle el parámetro integer que necesito para ejecutarlo..

el codigo del procedimiento es el siguiente:

CREATE OR REPLACE FUNCTION "public"."obtener_notas" (
integer
)
RETURNS SETOF "public"."clientes-notas" AS
$body$
select * from "clientes-notas" where id_cliente = $1
$body$
LANGUAGE 'sql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100 ROWS 1000;


Por favor necesito ayuda para poder continuar con algo básico como llamar a un procedimiento almacenado. Disculpen soy novato jeje

Casimiro Notevi
04-05-2011, 15:06:33
¿Pero desde sql o desde delphi?

Ignacio Gentile
04-05-2011, 15:11:16
desde delphi! Al tratar de ejecutar el prodecimiento como también al querer activarlo obtengo el error Unsopported Operation..

Casimiro Notevi
04-05-2011, 15:28:41
¿Puedes poner el código que usas?
También puedes hacer una búsqueda en clubdelphi, se ha tratado en otras ocasiones.
Además tienes abajo de esta página varios enlaces que te pueden servir.

jejo1984
16-01-2012, 14:43:14
Si usas Tquery te pongo un ejemplo:
procedure Tfrm_mod_tip_inci.cmd_grabarClick(Sender: TObject);
var idtipoinci:string;
begin
if(Trim(txt_tip_inci.text)='')then
begin
showmessage('Ingresa nombre de la Incidencia');
txt_tip_inci.SetFocus;
exit;
end
else if(Trim(txt_desc_tip_inci.text)='')then
begin
showmessage('Ingresa descripción de la incidencia');
txt_desc_tip_inci.SetFocus;
exit;
end;
//obtenemos el id
idtipoinci:=lblidtipo.Caption;
//fin
SQLTransaction1.Rollback;
SQLTransaction1.StartTransaction;
Sqlmodifica_inci.Close;
Sqlmodifica_inci.SQL.Clear;
Sqlmodifica_inci.SQL.Text:='select * from update_tip_incidencia('''+trim(txt_tip_inci.Text)+''','''+trim(txt_desc_tip_inci.Text)+''','+idtipoi nci+')';
try
Sqlmodifica_inci.ExecSQL;
SQLTransaction1.Commit;
showmessage('Se grabo correctamente');
ModalResult := mrCancel;
PQConnection1.Close;
except
on E: Exception do
begin
Showmessage( PChar( E.Message )+ 'Error de SQL');
SQLTransaction1.EndTransaction;
end;
end;
end;

jejo1984
16-01-2012, 14:45:00
Aqui te pongo la funcion o procedimiento:
CREATE OR REPLACE FUNCTION update_tip_incidencia(_tipinci character, _desctipinci character, _codinci integer)
RETURNS boolean AS
$BODY$
begin
update tipo_incidencia set nom_tipo=_tipinci,descr_tipo=_desctipinci where idtipoinci=_codinci;
RETURN True;
exception
when integrity_constraint_violation then
RAISE NOTICE 'Rollback to savepoint';
RETURN False;
end;$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

Leviatan
04-03-2012, 19:03:59
Hola:

Quizás ya hayas encontrado la solución a tu problema, pero de todos modos podrías hacer lo siguiente:

También podrías ejecutarlo colocando un objeto query de tus componentes Zeos sobre tu formulario y probar el siguiente código:

begin
with Query do begin
Close;
SQL.Clear;
SQL.Add('select * from obtener_notas(:id_cliente)');
Params.ParamByName(':id_cliente').AsInteger := IdCliente;
ExecSQL;
end;
end;

Este es un pequeño ejemplo utilizando un componente TASQLite3Query de Aducom para la base de datos SQLite3. Nunca utilicé los componentes Zeos, pero no debería haber mucha diferencia.

Saludos.