Bonjour,

Je bloqué dans la création d'une fonction pipelinée qui recherche la taille de tous les segments (lob, index...) associés à une table.
J'utilise pour cela la fonction DBMS_SPACE.OBJECT_DEPENDENT_SEGMENTS.
A l 'execution de mon code j'ai l'erreur suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
SQL> Select * from table(yke_size_info('SAPRD', 'REPOSRC')); 
                         * 
ERROR at line 1: ORA-20000: Object does not exist 
ORA-06512: at "SYS.DBMS_SPACE", line 2673 
ORA-06512: at "SYS.YKE_SIZE_INFO", line 40
=> la ligne 40 est celle où j'appelle DBMS_SPACE.OBJECT_DEPENDENT_SEGMENTS

Si je transforme ma fonction en procédure cela marche, si pour tester je passe en dur les paramètres cela marche...

Je tourne en rond cela me rend fou... à la base je suis DBA pas développeur !
PS : j'ai aussi posté ce message sur OTN.

Merci pour votre aide.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
  create or replace type r_size_info as object (
  nb_par_tbl   number ,
  nb_idx       number ,
  nb_par_idx   number ,
  nb_lob       number ,
  used_par_tbl number ,  
  used_idx     number ,  
  used_par_idx number ,  
  used_lob     number ,  
  free_par_tbl number ,  
  free_idx     number , 
  free_par_idx number ,  
  free_lob     number   
)
/
create or replace type t_size_info as table of r_size_info;
/
 
CREATE OR REPLACE FUNCTION yke_size_info(o_wner varchar2, o_bject varchar2 ) RETURN t_size_info PIPELINED AS
  r_size r_size_info := r_size_info(0,0,0,0,0,0,0,0,0,0,0,0);
 
  obj_segment_owner   VARCHAR2(100);
 obj_segment_name    VARCHAR2(100); 
 obj_segment_type    VARCHAR2(100);
 obj_tablespace_name VARCHAR2(100);
 
 BEGIN 
 FOR obj IN (SELECT segment_owner, segment_name, segment_type, tablespace_name FROM TABLE(dbms_space.object_dependent_segments(o_wner, o_bject, NULL, 1)))
 LOOP
...
Si je code les paramètres en dur cela passe :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
FOR obj IN (SELECT segment_owner, segment_name, segment_type, tablespace_name FROM TABLE(dbms_space.object_dependent_segments('SAPSR3', 'REPOSRC', NULL, 1)))
Si je transforme ma fonction en procédure cela passe :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
CREATE OR REPLACE PROCEDURE yke_size_inf (o_wner varchar2, o_bject varchar2) AS
 
  obj_segment_owner   VARCHAR2(100);
  obj_segment_name    VARCHAR2(100); 
  obj_segment_type    VARCHAR2(100);
  obj_tablespace_name VARCHAR2(100);
 
 BEGIN 
 FOR obj IN (SELECT segment_owner, segment_name, segment_type, tablespace_name FROM (TABLE(dbms_space.object_dependent_segments (o_wner, o_bject, NULL, 1))))
 LOOP
...