En VRAC RECUEILLIR dans un tableau d'objets
Lorsque vous tentez d'utiliser un BULK COLLECT
déclaration, je suis d'erreur ORA-00947: not enough values
.
Un exemple de script:
CREATE OR REPLACE
TYPE company_t AS OBJECT (
Company VARCHAR2(30),
ClientCnt INTEGER );
/
CREATE OR REPLACE
TYPE company_set AS TABLE OF company_t;
/
CREATE OR REPLACE
FUNCTION piped_set (
v_DateBegin IN DATE,
v_DateEnd IN DATE
)
return NUMBER /*company_set pipelined*/ as
v_buf company_t := company_t( NULL, NULL);
atReport company_set;
sql_stmt VARCHAR2(500) := '';
begin
select * BULK COLLECT INTO atReport
from (
SELECT 'Descr1', 1 from dual
UNION
SELECT 'Descr2', 2 from dual ) ;
return 1;
end;
L'erreur se produit à la ligne select * BULK COLLECT INTO atReport
.
Droite PL/SQL fonctionne très bien par le chemin (donc pas besoin de le mentionner comme une solution). L'utilisation de BULK COLLECT
dans une table utilisateur type est la question.
OriginalL'auteur xacinay | 2013-05-17
Vous devez vous connecter pour publier un commentaire.
Votre
company_set
est une table de objets, et vous êtes en sélectionnant des valeurs, pas des objets composés de ces valeurs. Cela permettra de compiler:... mais quand la course va jeter
ORA-22950: cannot ORDER objects without MAP or ORDER method
parce que leunion
ne implicite de la commande afin d'identifier et de supprimer les doublons, afin de l'utiliserunion all
à la place:pas avec
bulk collect
; vous pourriez le faire comme un curseur en boucle à la place (for rec in (select company_t() as comp ...) loop pipe row rec.comp; end loop;
ou similaire. J'imagine que les performances seraient similaires. Vous devriez probablement vous poser une nouvelle question si vous essayez cela et ne peux pas le faire fonctionner.C'est exactement la façon dont il fonctionne:
for x in (select ..) pipe row ( company_t( x.Company, x.ClientCnt) ) )
. Je me demandais, il peut être encore plus simple. De toute façon, le résultat courant est très bien, merci!OriginalL'auteur Alex Poole