2017-06-08 1 views
0

J'ai besoin d'aide dans la requête dynamique pour le scénario suivant.Problème de requête dynamique oracle: comment obtenir de la valeur dans une variable qui fait partie de la chaîne

I ont une procédure A dans laquelle je stocke une chaîne de caractères dans une variable de sortie qui sera transmise à une procédure B.

Procédure B nomdetable reçoit également en tant que paramètre d'entrée, mais la procédure A n'a pas, cependant La procédure A utilise également la variable tablename.

Je pense à la façon d'utiliser tablename variable dans la procédure une chaîne telle que lorsque la chaîne est passée à la procédure B, son entrée valeur de la variable de tablename obtient affectée à la variable tablename dans la chaîne de procédure A.

Je vais essayer d'expliquer avec un échantillon de code. C'est un échantillon et pas de code réel.

proc A 
begin 
--- string that uses tablename but has no variable input for tablename. 

mystr:='AND DAY_OF_WEEK_ID IN (SELECT B.DAY_ID FROM DAY_OF_WEEK B 
              INNER JOIN CD.' || 'v_tableName' || ' CD 
              ON TRIM(TO_CHAR(TO_TIMESTAMP(CD.GMT_SEIZ_DT_TIME,''YYYYMMDDHH24MISS''), ''DAY'')) = B.NAME WHERE B.DAY_ID IN (1,7))'; 

end; 

proc B 
(v_tablename, mystr) 
begin 
mystr2:= 'insert into sometable 
select ' || mystr || ' from ' || v_tablename 
end; 

de sorte que la chaîne de mystr contient déjà variable tablename pour laquelle je veux la même valeur à attribuer comme v_table_name variable de procédure B.

I excuses si je l'ai fait le scénario trop complexe, mais je ne pouvais Ne trouve pas mieux.

Cordialement.

+1

Je ne comprends pas la question –

+0

Désolé à ce sujet. Je savais que mon explication est complexe. L'affichage du code réel n'était pas réalisable pour moi. –

Répondre

0

Dans la procédure B, vous devez remplacer l'espace réservé dans la chaîne transmise par le nom de la table.

Votre pseudo-code publié est un peu brouillé, mais il semble que l'espace réservé dans la chaîne générée par la procédure A est 'v_tablename' et le nom de la table dans la procédure B est maintenu dans une variable appelée v_tablename. Cela étant le cas, cela fonctionnerait pour vous:

mystr := replace(mystr, 'v_tablename', v_tablename); 
+0

Merci beaucoup. Je m'excuse pour une mauvaise explication du problème, mais vous avez toujours compris. –

+0

Je fais cela depuis longtemps :) Mais une meilleure politique de nommage aurait créé une question plus claire. – APC

+0

Je vais garder cela à l'esprit la prochaine fois. –