8
votes

Comment puis-je appeler une fonction Oracle de Delphi?

J'ai créé une fonction dans Oracle qui insère des enregistrements dans des tableaux spécifiques et renvoyer une sortie en fonction de ce qui se passe dans la fonction. E.g (numéro de retour INS_REC)

Comment appeler cette fonction et voir sa sortie dans Delphi?

J'ai une réponse (avec tout mon merci) pour SQL Plus, mais j'ai besoin de savoir comment puis-je faire cela à Delphi


1 commentaires

Bienvenue à Stackoverflow! Vous pouvez montrer votre merci à des personnes qui ont répondu aux questions en marquant une réponse comme correcte. Cliquez sur la tique verte par la réponse. J'ai peur que je ne puisse pas vous aider avec cette question cependant - je ne sais rien sur Delphi. :)


3 Réponses :


7
votes

Il suffit de passer la fonction définie par l'utilisateur en tant que nom de colonne dans la requête et fonctionnera.

Exemple: P>

Var
  RetValue: Integer;
begin
  Query1.Clear;
  Query1.Sql.Text := 'Select MyFunction(Param1) FunRetValue from dual';
  Query1.Open;

  if not Query1.Eof then
  begin
    RetValue := Query1.FieldByName('FunRetValue').AsInteger;
  end;
end;


1 commentaires

Oracle a la double table spéciale à utiliser lorsque vous avez besoin de quelque chose comme ça. Votre code peut ne pas effectuer ce que vous attendez - cela peut appeler la fonction pour chaque ligne de .



6
votes

Comment accomplir cela peut dépendre de la bibliothèque d'accès à la DB que vous utilisez (BDE? DBEXPress? ADO? Autres), Certains peuvent proposer une composante "Procédure stockée" pouvant fonctionner avec des fonctions.

Une approche générale d'utiliser un bloc Pl / SQL anonyme pour appeler la fonction (et un paramètre pour lire la valeur de retour), PL / SQL ressemble à Pascal ...: P>

Qry.SQL.Clear;
Qry.SQL.Add('BEGIN');
Qry.SQL.Add('  :Rez := ins_rec;');
Qry.SQL.Add('END;');
// Set the parameter type here...
...
Qry.ExecSQL;
...
ReturnValue :=  Qry.ParamByName('Rez').Value;


0 commentaires

0
votes

Nous exécutons une procédure stockée Oracle utilisant ce code qui utilise le BDE (je sais s'il vous plaît ne pas bash parce que nous avons utilisé le BDE!)

Try
  DMod.Database1.Connected:= False;
  DMod.Database1.Connected:= True;
  with DMod.StoredProc1 do
  begin
    Active:= False;

    ParamByName('V_CASE_IN').AsString:= Trim(strCaseNum);
    ParamByName('V_WARRANT_IN').AsString:= strWarrantNum;
    ParamByName('V_METRO_COMMENTS').AsString:= strComment;

    Prepare;
    ExecProc;

    Result:= ParamByName('Result').AsString;
  end;
Except


0 commentaires