oracle tutorial Impossible d'exécuter une requête de sélection dynamique importante dans la procédure stockée




pl/sql developer tutorial (2)

Vous pouvez essayer d'utiliser un clob CLOB en 11g, quelque chose comme (non testé):

declare
  l_sql clob;
  l_str1 varchar2(32767);
  l_str2 varchar2(32767);
begin
  dbms_lob.createtemporary(l_sql, false);

  l_str1 := 'some large SQL chunk';
  l_str2 := 'and the rest of large SQL chunk';

  l_sql := l_str1;
  dbms_lob.writeappend(l_sql, length(l_str2), l_str2);

  execute immediate l_sql;

  dbms_lob.freetemporary(l_sql);

end;

J'ai une procédure stockée qui exécute une requête de sélection dynamique. La chaîne de requête est grande. Ce qui suit est la procédure stockée

create or replace
procedure My_SP
(
procRefCursor out sys_refcursor,
--My other input variables here
)
is

dynSqlComplete varchar2(8000) := 'n/a';

begin

  dynSqlComplete := 'Large query here';

  open procRefCursor for dynSqlComplete;

end;

Quand je lance ce sp, il montre l'erreur suivante

ORA-00600: code d'erreur interne, arguments: [qcscbAddToSelLists], [], [], [], [], [], [], [], [], [], [], []

J'ai donc réduit la taille de la variable dynSqlComplete à varchar2 (5000), puis j'ai exécuté la procédure stockée. J'ai l'erreur suivante:

ORA-06502: PL / SQL: erreur numérique ou de valeur: tampon de chaîne de caractères trop petit

J'ai essayé beaucoup de choses en vain et aussi je ne veux pas les ajouter ici parce que ça va mal tourner.

- EDIT - 6 juin 2012

Salut à tous,

J'ai réussi à identifier le problème mais je ne suis pas encore capable de le résoudre. J'ai essayé d'exécuter la requête partie par partie et j'ai trouvé la requête qui jetait une erreur. Il contenait START WITH et quand je l'ai commenté, la requête a commencé à fonctionner. J'ai donné le code ci-dessous et ai commenté le code qui donne l'erreur.

      SELECT RowNum AS RowNumber1,
      GR.*,
      --LEVEL AS LineageLvl,
      VDE.*
    FROM
      (SELECT *
      FROM group_relations  left outer join relation_classifier_instances RC on 
      rc.relation_id = group_relations.Group_relation_id  WHERE group_relation_type_id IN
      (19,20,32,38,42,43)  and (rc.relation_id is null) 
      ) GR
    LEFT OUTER JOIN Vendor_Feed_data_elements VDE
    ON GR.Group_Relation_Type_Id = 19
    AND GR.Primary_GroupField_Id = VDE.Vendor_Data_Element_Id
      /* Code which is giving the error
      START WITH
      (
        VDE.Vendor_Data_Element_Id IS NOT NULL  )
      CONNECT BY nocycle prior GR.RELATED_GROUPFIELD_ID = GR.PRIMARY_GROUPFIELD_ID*/


Bien sûr, vous ne voulez pas de fonction? Voici un exemple de quelque chose que j'ai fait qui est similaire.

FUNCTION showbody(cust varchar2, receipt varchar2) 
    RETURN sys_refcursor AS retval sys_refcursor;
BEGIN
    OPEN retval FOR
        SELECT * 
        FROM comp.comp_remittance_details
        WHERE receipt_number=receipt 
            AND customer_number=cust;
    RETURN(retval);
END showbody;