Dans mon script PL / SQL, comment déclarer justification_rec quand il représente une jointure? Tout ce que je veux, c'est insérer dans une table3 une ligne concaténée: P> < Pré> xxx pré> Comment devrait-elle ressembler la déclaration de justific_rec au début de mon script? P> Si ce n'était pas pour la jointure intérieure, j'écrirais quelque chose comme:
Justification_rec Table1% Rowtype; p> p>
4 Réponses :
Vous devez utiliser en vrac collecter dans code>
justific_rec code> est nécessaire pour être type de table avec des colonnes appropriées p> p>
L'OP vous demande comment Définir B> une variable cible avec la structure appropriée, et non la façon de le peupler.
Si je comprenais correctement, vous pouvez essayer avec le curseur Rowtype comme ceci (pas sûr si c'est ce que vous voulez dire en déclarant votre type de variable pour la sélection avec jointures):
set serveroutput on; declare cursor cur is SELECT ENTRY_COMMENTS, DESCRIPTION FROM TABLE1 A INNER JOIN TABLE2 B ON A.ID_JUSTIFIC = B.ID_JUSTIFIC ; justific_rec cur%ROWTYPE; begin open cur; loop fetch cur into justific_rec; exit when cur%notfound; dbms_output.put_line(justific_rec.entry_comments || ' ' || justific_rec.description); end loop; close cur; end;
Les curseurs explicites sont largement considérés comme des frais généraux, mais ils ont leurs utilisations, et c'est l'un d'entre eux.
Si tout ce que vous voulez faire est d'insérer dans une table basée sur une instruction SELECT, il n'y a pas besoin de PL / SQL (par lequel je veux dire qu'il n'y a pas besoin d'ouvrir un curseur, de chercher une ligne, de traiter la ligne puis passer à la ligne suivante) - c'est la rangée par rangée aka le traitement lentement lente.
Au lieu de cela, vous pouvez le faire tout dans une seule instruction insertion, par exemple: P>
begin INSERT INTO mof_outaccdtl_rec (<column being inserted into>) -- please always list the columns being inserted into; this avoids issues with your code when someone adds a column to the table. SELECT entry_comments || ' ' || description -- please alias your columns! How do we know which table each column came from? FROM table1 a inner join table2 b on a.id_justific = b.id_justific; end; /
Non, je dois le faire dans un script PL / SQL!
Vous pouvez plonk l'insert dans pl / sql! Il suffit de mettre un début / fin autour de ça!
Pourquoi avez-vous besoin de le faire dans un script PL / SQL? Si c'est d'apprendre à faire boucle autour d'un curseur (par exemple pour les travaux scolaires), il s'agit-il de coller avec la réponse que vous avez déjà acceptée, mais jamais B> le faire lorsque vous programmez professionnellement. Je rejette la méthode de la ligne par ligne si je l'ai jamais rencontrée dans un examen de code!
Dans ma déclaration d'insertion, j'ai beaucoup de colonnes de différentes tables, donc je ne peux donc pas faire ça. Je continue d'avoir un problème avec cela, même si les solutions ci-dessus proposées me semblaient dites à première vue!
Donc, vous n'avez pas une déclaration sélectionnée qui tire ensemble toutes les colonnes et les lignes que vous après?
Non, j'ai des curseurs, de nombreuses déclarations et des boucles imbriquées qui fonctionnent déjà bien lorsque je vous engageons insérer dans ma table, mais avec ce champ, j'ai un problème, car je veux rejoindre 2 tables et je ne peux toujours pas le faire dans Pl / sql.
Je vous suggère de créer une nouvelle question contenant un cas de test récurrentant - par exemple. Un script (idéalement quelque chose qui pourrait être exécuté sur dbfiddle.uk ou liveql.oracle.com ) contenant des instructions de table, insérez des instructions pour renseigner les tables avec des données d'échantillonnage et ce que vous attendez de voir à la fin de votre PL / SQL. De cette façon, nous devrions être capables de mieux vous aider. Assurez-vous que votre cas de test reflète avec précision ce que vous essayez de le faire, mais faites-le aussi petit que vous le pouvez afin que nous ne sommes pas enlisés par des informations non pertinentes.
Réponse à votre question est elle-même dans votre question. Vous devez utiliser le type% de ligne L'attribut de type remorqueur peut être n'importe lequel des types ci-dessous:
DECLARE CURSOR c1 IS SELECT * FROM TABLE1 A INNER JOIN TABLE2 B ON A.ID_JUSTIFIC = B.ID_JUSTIFIC ; justific_rec c1%ROWTYPE; BEGIN open c1; loop fetch c1 into justific_rec; exit when c1%notfound; INSERT INTO MOF_OUTACCDTL_REQ VALUES( JUSTIFIC_rec.ENTRY_COMMENTS || ' ' || JUSTIFIC_rec.DESCRIPTION ); end loop; close c1; END; /
Voulez-vous dire que vous souhaitez sélectionner ensemble de données entières dans la variable (collection) ou une seule ligne?
Mon problème est que je ne sais pas comment le déclarer. Par exemple, si c'était juste la table1, je déclarais justification_rec Table1% Rowtype;
Pourquoi utilisez-vous
* code> si vous souhaitez uniquement utiliser deux des colonnes? Et si vous ne voulez que pour la concaténation, vous pouvez également le faire dans la requête également, votre jeu de résultats a donc une seule expression de colonne et vous pouvez sélectionner cela dans une seule variable de chaîne.
Plus d'informations sur ce que vous allez faire avec les données de cette requête seraient utiles. Je suppose que votre requête est quelque chose dans les lignes de
Sélectionnez la garniture (Entry_comments || '' || Description) à partir de TABLE1 Un tableau de jointure intérieur B sur ... code>?
J'ai édité ma question, j'espère que je l'ai rendu plus claire maintenant.