ORA-00932: incompatible types de données: - got -
J'ai été en utilisant Oracle(10g.2) en tant que développeur PHP depuis près de 3 ans, mais quand j'ai donné une mission, j'ai essayé d'utiliser la ref curseurs et des types de collection pour la première fois. Et Je
'ai cherché sur le web, quand je confrontés à des problèmes, et ce ora-00932 erreur m'a vraiment bouleversé. J'ai besoin d'aide à partir d'une vieille main.
Voici ce que j'ai abordé avec,
Je veux sélectionner des lignes d'une table et de les mettre dans un ref cursor, puis avec l'aide de type d'enregistrement, de les rassembler dans un tableau associatif. Et à nouveau à partir de ce tableau associatif, faire un ref cursor. Ne me demandez pas pourquoi, je suis en train d'écrire un tel code compliqué, car j'en ai besoin pour les plus complexes de l'affectation. J'ai peut-être sembler déroutant pour vous, donc laissez-moi vous montrer mes codes.
J'ai 2 types définis sous l'onglet types de Crapaud. L'un d'eux est un type d'objet:
CREATE OR REPLACE
TYPE R_TYPE AS OBJECT(sqn number,firstname VARCHAR2(30), lastname VARCHAR2(30));
Autre type de collection qui utilise le type d'objet créé ci-dessus:
CREATE OR REPLACE
TYPE tr_type AS TABLE OF r_type;
Puis-je créer un package:
CREATE OR REPLACE PACKAGE MYPACK_PKG IS
TYPE MY_REF_CURSOR IS REF CURSOR;
PROCEDURE MY_PROC(r_cursor OUT MY_REF_CURSOR);
END MYPACK_PKG;
Corps De Package:
CREATE OR REPLACE PACKAGE BODY MYPACK_PKG AS
PROCEDURE MY_PROC(r_cursor OUT MY_REF_CURSOR) AS
rcur MYPACK_PKG.MY_REF_CURSOR;
sql_stmt VARCHAR2(1000);
l_rarray tr_type := tr_type();
l_rec r_type;
BEGIN
sql_stmt := 'SELECT 1,e.first_name,e.last_name FROM hr.employees e ';
OPEN rcur FOR sql_stmt;
LOOP
fetch rcur into l_rec;
exit when rcur%notfound;
l_rarray := tr_type( l_rec );
END LOOP;
CLOSE rcur;
--OPEN r_cursor FOR SELECT * FROM TABLE(cast(l_rarray as tr_type) );
END MY_PROC;
END MYPACK_PKG;
J'ai commenté la dernière ligne où j'ai ouvert curseur ref. Parce qu'il est à l'origine d'une autre erreur quand je lance la procédure en Crapaud de l'Éditeur SQL, et c'est la deuxième question que je vais poser.
Et enfin, j'ai exécuter le code en Crapaud:
variable r refcursor
declare
r_out MYPACK_PKG.MY_REF_CURSOR;
begin
MYPACK_PKG.MY_PROC(r_out);
:r := r_out;
end;
print :r
Là, je reçois l'erreur ora-00932 erreur.
OriginalL'auteur Duygu Akyol | 2011-01-04
Vous devez vous connecter pour publier un commentaire.
La façon dont vous utilisez le CURSEUR de référence est rare. Ce serait le moyen standard de leur utilisation:
Je ne suis pas sûr de ce que vous essayez d'accomplir ici, vous êtes à l'extraction de l'ref curseur à l'intérieur de la procédure et revenir un autre curseur de référence qui ont les mêmes données. Je ne pense pas que c'est nécessaire pour aller chercher le curseur dans la procédure. Laissez l'application appelante ne l'extraction (ici, l'extraction se fait par le
print
).Mise à jour: pourquoi êtes-vous de l'inutile message d'erreur?
Vous êtes à l'aide d'un curseur ouvert de manière dynamique et je pense que c'est une partie de la raison pour laquelle vous faites la inutile de message d'erreur. Si nous utilisons fixe SQL le message d'erreur est différent:
Je l'ai souligné qu'actuellement, dans de 10,2 vous pouvez chercher un curseur dans un PLSQL record, mais pas dans un SQL de l'Objet.
Mise à jour: en ce qui concerne la
PLS-00306
: mauvais nombre ou les types d'argumentsl_rarray est une TABLE IMBRIQUÉE, il doit être initialisé et puis étendu pour être en mesure de stocker des éléments. Par exemple:
Pour en savoir plus, vous pouvez parcourir la documentation de PL/SQL les collections et les archives.
J'ai mis à jour ma réponse, HTH
Merci beaucoup pour la réponse. Avec l'aide de votre code, j'ai déclaré mon type d'enregistrement à l'intérieur de la procédure, et il est le seul changement que j'ai fait dans le code, et l'erreur a disparu. Bien qu'il m'a aidé à corriger l'erreur, j'ai commencé à recevoir une autre erreur. Il est sur la ligne où j'identifie mon tableau associatif avec le type d'enregistrement (l_rarray := tr_type( l_rec );), et l'erreur est "PLS-00306: mauvais nombre ou les types d'arguments dans l'appel à "TR_TYPE'". Avez-vous une idée, pourquoi l'erreur s'est produite?
Je vous remercie beaucoup. Je réalise maintenant qu'il n'est pas nécessaire de chercher la ref curseur dans un type d'enregistrement, et j'ai résolu l'erreur en procédant de la façon dont vous dépeint dans votre dernier post. Je vous remercie encore, et encore.
Je veux vous poser une autre question, j'espère que ce sera la dernière.Dans votre dernier post, si vous utilisez sql dynamique, comme " sql_stmt := SELECT e.empno, e.ENAME, NULL nom DE scott.emp e', et puis POUR le cc DANS (sélectionnez sql_stmt DE double), et puis essayer d'atteindre le curseur éléments par écrit cc.empno par exemple, vous obtiendrez un PLS-00302 erreur.Comment pouvez-vous gérer cela? Est-il possible parce que, je dois utiliser un sql dynamique.
OriginalL'auteur Vincent Malgrat