Récupérer le nombre de colonne d'une requête
Bonjour,
Je dois lancer des requêtes qui sont stockées dans le champs CD_SQL de la table(P_CTRL_FCTN) et insérer les résultats de celle-ci dans une autre table (P_SUIV_CTRL_FCTN_HDMD_DETAIL)
Code:
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
|
CREATE TABLE "PARAM"."P_CTRL_FCTN"
( "ID_CTRL_FCTN" NUMBER(12,0) NOT NULL ENABLE,
"CD_DOMA_FCTN" VARCHAR2(10 BYTE),
"CD_PERIODE" VARCHAR2(4 BYTE),
"LB_CTRL_FCTN" VARCHAR2(512 BYTE),
"CD_SQL" VARCHAR2(4000 BYTE),
"BC_EXEC" VARCHAR2(1 BYTE),
"CD_TYPE_CTRL" VARCHAR2(1 BYTE),
"LB_MODE_AFFICHAGE" VARCHAR2(10 BYTE),
CONSTRAINT "PK_P_CTRL_FCTN" PRIMARY KEY ("ID_CTRL_FCTN")
CREATE TABLE "PARAM"."P_SUIV_CTRL_FCTN_HDMD_DETAIL"
( "ID_CTRL_FCTN" NUMBER(12,0) NOT NULL ENABLE,
"SSAA" NUMBER(4,0) NOT NULL ENABLE,
"NU_SEMA" NUMBER(2,0) NOT NULL ENABLE,
"DT_EXEC_CTRL" DATE,
"CHAMP1" VARCHAR2(60 BYTE),
"CHAMP2" VARCHAR2(60 BYTE),
"CHAMP3" VARCHAR2(60 BYTE),
"CHAMP4" VARCHAR2(60 BYTE),
"CHAMP5" VARCHAR2(60 BYTE),
"CHAMP6" VARCHAR2(60 BYTE),
"CHAMP7" VARCHAR2(60 BYTE),
"CHAMP8" VARCHAR2(60 BYTE),
"CHAMP9" VARCHAR2(60 BYTE),
"CHAMP10" VARCHAR2(60 BYTE)
) |
Mon problème est que toutes les requêtes "CD_SQL" ne ramène pas le même nombre de champs, il faut donc que je rajoute le bon nombre de champs derrière les résultats de ma requête afin de pouvoir insérer dans ma table cible.
J'ai d'abord voulu changer directement les requêtes à exécuter avec une procédure, afin qu'elle puisse être insérées. Mais cela n'est pas possible les requêtes dans le champs "CD_SQL" sont trop complexe (Union, minus, imbrication..)
Il me reste donc 2 solutions à l'aide de requêtes dynamiques
Soit rajouter 9 champs à mes résultats dans une requête imbriquée( comme ci dessous) puis limiter à 14 le nombre de colonne de la requête imbriquée, afin de pouvoir faire l'INSERT.
Code:
1 2 3 4 5 6
| SQL_STMT := 'INSERT INTO P_SUIV_CTRL_FCTN_HDMD_DETAIL select '||v_id_ctrl_fctn||', TO_NUMBER(TO_CHAR(SYSDATE-5,''IYYY'')), TO_NUMBER(TO_CHAR(SYSDATE-5,''IW'')),SYSDATE, temp.*,
NULL as CHAMP1, NULL as CHAMP2, NULL as CHAMP3, NULL as CHAMP4, NULL as CHAMP5, NULL as CHAMP6, NULL as CHAMP7, NULL as CHAMP8
from ('||v_cd_sql||')temp';
dbms_output.put_line( ' \n requete : ' || SQL_STMT ) ;
EXECUTE IMMEDIATE SQL_STMT;
COMMIT; |
Soit récupérer le nombre de champs que renvoie la requête et ajouter le bon nombre de champs
Le problème est que je ne vois ni comment récupérer le nombre de colonne ramené par une requête ni comment limiter à 14 champs un select qui ramène plus de champs.
Merci d'avance.