|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||
|
Futur Membre du Club
![]() Inscription : mai 2007 Messages : 63 ![]() |
Bonjour,
Je rencontre un petit soucis sans doute simple à éviter. J'ai une procédure stockée dans laquelle je déclare un curseur. Code :
Après BEGIN, j'arrive sans soucis à utiliser ma variable SCHEMA2, en la concaténant à du texte par exemple. Comment pourrais-je créer mon curseur à partir de la requête prenant en compte le bon nom de schéma Oracle? D'avance merci pour vos indications. Bien cordialement, pressdell. |
||
|
|
00
|
|
|
#3 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 316 ![]() |
Utilisez Sql Dynamique ou supprimer schema2 et utilisez authid avec invoker rights dans la procédure.
|
|
|
00
|
|
|
#4 |
|
Futur Membre du Club
![]() Inscription : mai 2007 Messages : 63 ![]() |
Merci infinimment Lola, j'avoues ne pas avoir assez cherché.
Merci également mnitu! Bonne journée à vous. Cordialement. |
|
|
00
|
|
|
#5 | |||
|
Futur Membre du Club
![]() Inscription : mai 2007 Messages : 63 ![]() |
Je ré-ouvre ce post car je rencontre un autre problème.
Soit le code suivant : Code :
J'essaye donc d'attribuer à la variable Ma_ligne, la ligne du curseur Mon_curseur courante. J'ai déclarer Ma_ligne comme suit : Mais cela ne compile pas... Citation:
|
|||
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() Laure Consultante en Business Intelligence Inscription : avril 2007 Messages : 987 ![]() |
Si j'ai bien compris tu vas chercher des informations dans une table suivant le schéma entré par l'utilisateur.
Est-ce que la structure de tes tables sont les mêmes (quelque soit le schéma) ? --> si oui tu peux déclarer ta ligne comme ça :
__________________
~ Lola ~ Ne pas oublier : et aussi :
|
|
|
00
|
|
|
#7 | |
|
Futur Membre du Club
![]() Inscription : mai 2007 Messages : 63 ![]() |
Merci pour ton aide Lola.
Je vais effectivement chercher des données dans une table dont je ne connais pas le schéma à l'avance. Quelque soit le schéma, ma table a la même structure. J'ai déclaré Ma_ligne comme tu le mentionne, mais j'obtiens l'erreur suivante : Citation:
Afin de déclarer une variable de type ligne relative à MA_TABLE, je dois préciser le schéma Oracle. Le code suivant fonctionne par exemple : Je sais qu'il est possible d'utiliser le %ROWTYPE d'un curseur, mais ceci ne semble pas fonctionner avec les curseurs implicites... |
|
|
|
00
|
|
|
#8 |
|
Membre Expert
![]() Laure Consultante en Business Intelligence Inscription : avril 2007 Messages : 987 ![]() |
C'est normal que tu ne puisse pas utiliser le %rowtype sur la curseur puisqu'il n'est pas encore déclaré.
Puisque tes tables sont les mêmes dans tous les schémas alors laisse le code suivant : Normalement ça marchera quelque soit le schéma entré par l'utilisateur.
__________________
~ Lola ~ Ne pas oublier : et aussi :
|
|
|
00
|
|
|
#9 | ||||
|
Futur Membre du Club
![]() Inscription : mai 2007 Messages : 63 ![]() |
Citation:
Code :
Citation:
Si je ne trouve pas de solution, je pense éviter de faire un 'SELECT *', mais de ne sélectionner que quelques données, et de déclarer quelques variables afin de les affecter via le FETCH... |
||||
|
|
00
|
|
|
#10 |
|
Membre Expert
![]() Laure Consultante en Business Intelligence Inscription : avril 2007 Messages : 987 ![]() |
Effectivement je me suis mal exprimée.
Tu as bien déclaré ton curseur mais il n'est pas affecté. Donc il ne peut pas savoir exactement comment il sera constitué. La meilleure solution est effectivement de faire une selection des champs 1 à 1, sachant qu'une requête est bien mieux sans * !!
__________________
~ Lola ~ Ne pas oublier : et aussi :
|
|
|
00
|
|
|
#11 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 316 ![]() |
|
|
|
00
|
|
|
#12 | |
|
Futur Membre du Club
![]() Inscription : mai 2007 Messages : 63 ![]() |
mnitu,
Je pensais que mon code était déjà quelque peu dynamique du fait du nom de schéma paramétré. Je viens de tomber sur ces explications : Lien Pensais-tu à cela lorsque tu évoquais le SQL dynamique? Concernant : Citation:
|
|
|
|
00
|
|
|
#13 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 316 ![]() |
Oui votre code est dynamique mais j'ai parlé de
Using Invoker's Rights Versus Definer's Rights (AUTHID Clause) |
|
|
10
|
|
|
#14 |
|
Futur Membre du Club
![]() Inscription : mai 2007 Messages : 63 ![]() |
Merci pour ce lien mnitu.
Malheureusement je n'ai pas la main sur les "users" autres que dans mon environnement de développement. i.e. Les DBAs avec lesquels je travaille me décapiteront si j'aborde cette solution avec eux pour les environnements suivants... J'ai finalement fait au plus simple, c'est à dire en ne sélectionnant dans ma "requête implicite" que les données dont j'ai besoin (fin du SELECT *). Encore merci à vous deux. Je passe le sujet à Résolu. |
|
|
00
|
|
|
#15 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 316 ![]() |
Gare à vous, vous risquez bien de vous faire étêter avec la solution que vous avez adoptée, trop permissive à l’injection SQL.
Petit remarque : cursor%rowtype n’est pas autre chose qu’un type enregistrement (record) que vous pouvez définir par vous même dans votre procédure. |
|
|
00
|
|
|
#16 | |||||
|
Membre expérimenté
![]() François Inscription : février 2010 Messages : 306 ![]() |
Citation:
http://docs.oracle.com/cd/B28359_01/...t.htm#BABJIAEG Code :
Code :
|
|||||
|
|
11
|
|
|
#17 | |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 316 ![]() |
Citation:
Très bien et maintenait enrichissez votre procédure avec l’ouverture du my_cursor en mode dynamique et dite-nous si vous arrivez à la compiler. |
|
|
|
00
|
|
|
#18 |
|
Futur Membre du Club
![]() Inscription : mai 2007 Messages : 63 ![]() |
Bonjour à vous deux, et merci pour vos conseils encore une fois.
Je tiens à préciser que j'ai également tenté hier de définir un curseur à partir des solutions que vous exposez, mais en vain. Je m'y suis certainement mal pris et j'ai joué la facilité...j'aime les choses simples, et je suis "fainéant". Merci à vous tout de même pour vos explications et votre attention. |
|
|
00
|
|
|
#19 |
|
Membre expérimenté
![]() François Inscription : février 2010 Messages : 306 ![]() |
Peut-etre que DBMS_ASSERT n'y est pas, parce qu'il est inconnu pour le moment?
Mais que en l'ajoutant, ca peut resoudre le probleme de l'injection SQL que vous faites bien de mentionner. J'ai bien fait de noter, essayer, vu que ca ne compile pas. C'est ben les forums, on en apprends a chaque fois. |
|
|
00
|
|
|
#20 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 316 ![]() |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com