Actuellement, j'ai quelques requêtes SQL qui ressemblent à ceci:
DROP TABLE TEMPTABLE; CREATE TABLE TEMPTABLE (mitID INTEGER); INSERT INTO TEMPTABLE select m.mitid from mitarbeiter m inner join abteilungen a on m.abt = a.abtid where a.abtname = @GIVENNAME; select SUM(g.kosten) from gehaelter g left outer join gehaelter k on g.mitarbeiter = k.mitarbeiter and g.vondatum < k.vondatum where k.mitarbeiter is null AND g.mitarbeiter in (select * from TEMPTABLE) order by g.vondatum desc;
Et je veux mettre tout cela dans une fonction SQL, où je peux choisir le paramètre "GIVENNAME" quand j'appelle la fonction.
Y a-t-il un moyen de rendre cela possible?
Je saurais comment le faire en JSON / Java, mais je n'ai vraiment aucune idée de comment le faire en tant que Fonction en SQL (en utilisant Oracle).
Modifier: Après avoir signalé certaines choses, je souhaite ajouter mon code actuel:
Drop Table X; Create Table X(id INTEGER); Insert Into X select .. from.. where a.name = GIVENNAME; Select SUM(..) from .. .. order by date desc;
3 Réponses :
Possible? Oui. Conseillé? Non.
Pour tout DDL, vous devrez utiliser du SQL dynamique ( EXECUTE IMMEDIATE
). Si les requêtes sont complexes, ces commandes seront difficiles à gérer.
INSERT
est un DML, mais vous ne pouvez pas l'utiliser dans une fonction , sauf s'il s'agit d'une transaction autonome (et vous devrez valider (ou annuler ) dans la fonction).
S'il s'agissait d'une procédure , vous éviteriez au moins le dernier problème que j'ai mentionné. Si vous renvoyez quelque chose , utilisez un paramètre OUT
.
Vous ne pouvez pas utiliser une table temporaire (globale) à la place? Créez-le une fois, utilisez-le plusieurs fois. Je comprends que votre code peut être très complexe et peut-être qu'il ne peut vraiment pas entrer dans une seule instruction SELECT
, mais vous devriez - au moins - essayer de faire ce travail dans un esprit Oracle (c'est-à-dire pas MS SQL Server).
exemple de procédure
https://www.sitepoint.com/stored-procedures-mysql-php/
comme ceci DELIMITER $$
CREATE PROCEDURE `avg_sal`(out avg_sal decimal)
BEGIN
select avg(sal) into avg_sal from salary;
END
Désolé, mais il n'y a vraiment pas beaucoup de valeur à fournir un code jouet qui n'utilise pas réellement le modèle de données et la logique métier publiés dans la question.
Désolé mais je donne un exemple de ça
C'est bien que vous vouliez être utile, mais être utile signifie rédiger des réponses axées sur le problème réel du PO. Veuillez comparer votre exemple de code avec la question et le code que j'ai fournis dans ma réponse . Ecrire une bonne réponse sur StackOverflow nécessite plus d'efforts que couper des éléments aléatoires à partir d'une recherche Google. Pour commencer, l'OP demande une fonction et votre code est une procédure.
Je suis actuellement plus intéressé par une solution fonctionnelle que par une solution agréable et propre
Heureusement, vous pouvez avoir les deux:
create or replace function get_sum_kosten ( p_givenname in abteilungen.abtname%type ) return number as return_value number; begin select SUM(g.kosten) into return_value from gehaelter g left outer join gehaelter k on g.mitarbeiter = k.mitarbeiter and g.vondatum < k.vondatum where k.mitarbeiter is null AND g.mitarbeiter in (select m.mitid from mitarbeiter m inner join abteilungen a on m.abt = a.abtid where a.abtname = P_GIVENNAME ) ; return return_value; end;
Merci! J'essaierai de m'améliorer la prochaine fois;)
La question évidente est pourquoi avez-vous ces instructions DROP, CREATE, INSERT? Cela fonctionnera horriblement et sera très dangereux dans un environnement de production. Quel est le problème avec
select sum (peu importe) de votre_table où name = GIVENNAME
?@APC parce que je dois d'abord créer une table avec des entrées spécifiques, sinon je n'obtiendrai pas le résultat attendu. Je ne me soucie pas de la sécurité, etc. tbh, juste besoin de transférer les requêtes dans une fonction, en quelque sorte.
@APC Comme ce n'est pas le code le plus complexe, il est en effet possible d'obtenir le même résultat avec une seule instruction select. Mais je suis actuellement plus intéressé par une solution fonctionnelle que par une solution agréable et propre - mais j'ai ajouté tout le code maintenant.
MySQL et Oracle sont des produits complètement différents. Utilisez le tag correctement!