cette procédure vous permettra de parser un contenu clob de type script SQL
Ensuite, elle va éxécuter le contenu SQL, par le bias du
package DBMS_SQL. On peut aussi subsitutuer le contenu du clob en un
ensemble d'instruction et utilisé : EXECUTE IMMEDIATE.
dans cette exemple, je vous montre la première option.
declare v_sql CLOB; v_num NUMBER := 0; v_upperbound NUMBER; v_sql DBMS_SQL.VARCHAR2S; v_cur INTEGER; v_ret NUMBER; begin -- Build a very large SQL statement in the CLOB LOOP IF v_num = 0 THEN v_sql := 'CREATE VIEW vw_tmp AS SELECT ''le nombre de ligne est : '||to_char(v_num,'fm0999999')||''' as col1 FROM DUAL'; ELSE v_sql := v_sql || ' UNION ALL SELECT ''Le nombre de ligne est : '||to_char(v_num,'fm0999999')||''' as col1 FROM DUAL'; END IF; v_num := v_num + 1; EXIT WHEN DBMS_LOB.GETLENGTH(v_sql) > 40000 OR v_num > 800; END LOOP; DBMS_OUTPUT.PUT_LINE('Length:'||DBMS_LOB.GETLENGTH(v_sql)); DBMS_OUTPUT.PUT_LINE('Num:'||v_num); -- décomposer le clob en bloc de 256 caractères et les mètres dans un tableau VARCHAR2S v_upperbound := CEIL(DBMS_LOB.GETLENGTH(v_sql)/256); FOR i IN 1..v_upperbound LOOP v_sql(i) := DBMS_LOB.SUBSTR(v_sql,256 -- amount ,((i-1)*256)+1 -- offset ); END LOOP; -- --Parsé puis éxécuter le script sql v_cur := DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(v_cur, v_sql, 1, v_upperbound, FALSE, DBMS_SQL.NATIVE); v_ret := DBMS_SQL.EXECUTE(v_cur); DBMS_OUTPUT.PUT_LINE('View Created'); end; |