L'utilisation d'Oracle PL/SQL de la table d'enregistrement avec plusieurs %rowtype champs
comment puis-je remplir un tableau d'enregistrements, qui a plus d'un champ d' %rowtype à l'aide de en vrac collecter?
mon code:
drop table child_table;
drop table parent_table;
/
create table parent_table(pk number primary key);
create table child_table(pk number primary key, fk REFERENCES parent_table(pk));
/
insert into parent_table (pk) values (1);
insert into parent_table (pk) values (2);
insert into child_table (pk, fk) values (11, 1);
insert into child_table (pk, fk) values (21, 1);
insert into child_table (pk, fk) values (32, 2);
/
declare
type rec is record
(
parent parent_table%rowtype,
child child_table%rowtype
);
type tbl is table of rec;
v_table tbl := tbl();
-- this works
type tbl_parent is table of parent_table%rowtype;
v_parent_table tbl_parent := tbl_parent();
begin
-- this works
select * bulk collect into v_parent_table from parent_table;
-- this doesn't work
select * bulk collect into v_table from parent_table parent
inner join child_table child on parent.pk = child.fk;
end;
ce code qui ne fonctionne pas, mais jette le message d'erreur suivant:
ORA-06550: line 13, column 30:
PLS-00597: expression 'V_TABLE' in the INTO list is of wrong type
ORA-06550: line 13, column 30:
PLS-00597: expression 'V_TABLE' in the INTO list is of wrong type
ORA-06550: line 13, column 38:
PL/SQL: ORA-00904: : invalid identifier
ORA-06550: line 13, column 3:
PL/SQL: SQL Statement ignored
alors ok, oracle dit im en utilisant le mauvais type de données et je suis d'accord. mais comment le résoudre?
select * from a join b
ne vous donne pas des lignes séparées, vous pouvez diviser comme ça, je pense que vous réalisez. Est-il une raison pour laquelle vous ne pouvez pas explicitement la liste des champs des deux tables (ou au moins ceux que vous voulez vraiment récupérer) dans la définition de l'enregistrement, avec %type
plutôt que %rowtype
? D'autres que celui-ci ait besoin de plus de frappe, évidemment...OriginalL'auteur Jakob | 2013-05-22
Vous devez vous connecter pour publier un commentaire.
Vous obtenez une erreur, car les colonnes de la jointure
SELECT *
sont différents de la colonne de votre table.Utiliser un
CURSOR%rowtype
:Ou n'utilisez pas de
SELECT *
:Oui, le curseur peut être définie dans un paquet d'en-tête.
thx, je vais utiliser un paquet pour cette
OriginalL'auteur Vincent Malgrat