Search notes:

Oracle DBMS_METADATA: Write selected DDL statements in a file with SQL*Plus' command SPOOL

The maximal length of an input line that SQL*Plus' can process is 3000 characters after variable substitution and 4999 characters before variable substitution.
Therefore, SQL*Plus cannot be used to process SQL statement to execute SQL scripts with SQL*Plus start or @ command if only one line exceeds this limit.
If trying to execute such scripts, SQL*plus will throw either the SP2-0027: Input is too long (> 4999 characters) - line ignored or SP2-0341: line overflow during variable substitution error message.
This page resulted from a few frustrating moments when I tried to use dbms_metadata.get_ddl together with SQL*Plus' spool because I experienced exactly those two errors.
The following steps summarizes on how it should be possible to extract DDL statements into an SQL script file and then to execute this script file to (re-)create the object.

Create a view with a very long text

In order to really go to the limits, I create a view that has a ridiculously long line:
declare
   stmt varchar2(32000);
begin

   stmt := 'create or replace force view tq84_view_with_long_text as select 1 col_001';

   for i in 2 .. 999 loop
       stmt := stmt || ', ' || i || ' col_' || to_char(i, 'fm0009');
   end loop;

   stmt := stmt || ' from dual';

   execute immediate stmt;

end;
/
In fact, the length of the line is 13892 characters.
select
   text_length,
   text
from
   user_views
where
   view_name = 'TQ84_VIEW_WITH_LONG_TEXT';
The length of this text is sufficient to challenge the limits of SQL*Plus.

Spooling the DDL statements

The following script is a variation of the script which I used in SQL*Plus to spool the result of dbms_metadata.get_ddl to a file:
begin
--     dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'PRETTY'       , true );
       dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'SQLTERMINATOR', true );
end;
/

set    long           100000000
set    longchunksize  100000000
set    pagesize               0
set    linesize           32000
set    trimspool             on
set    termout              off

--
--     Prevent
--        SP2-0027: Input is too long (> 4999 characters) - line ignored and
--        SP2-0341: line overflow during variable substitution (>3000 characters at line 1)
--     when created file is spooled:
--
column stmt format a3000 word_wrapped

--
--    Specify name of SQL script file to be created:
--
spool view-definition.sql

select
  dbms_metadata.get_ddl('VIEW', 'TQ84_VIEW_WITH_LONG_TEXT') stmt
from
  dual;

spool off

set termout               on
Such a script file can be executed in SQL*Plus with the start or @ command:
SQL> @create-ddl-file.sql
Executing create-ddl-file.sql creates the file view-definition.sql which contains the create view statement that (re-)creates the original tq84_view_with_long_text view.

(Re-) creating the original view

The original view can now be recreated by executing view-definition.sql in SQL*Plus:
SQL> @view-definition

Index

Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: 8 attempt to write a readonly database in /home/httpd/vhosts/renenyffenegger.ch/php/web-request-database.php:78 Stack trace: #0 /home/httpd/vhosts/renenyffenegger.ch/php/web-request-database.php(78): PDOStatement->execute(Array) #1 /home/httpd/vhosts/renenyffenegger.ch/php/web-request-database.php(30): insert_webrequest_('/notes/developm...', 1758199563, '216.73.216.150', 'Mozilla/5.0 App...', NULL) #2 /home/httpd/vhosts/renenyffenegger.ch/httpsdocs/notes/development/databases/Oracle/installed/packages/dbms/metadata/examples/spool/index(129): insert_webrequest() #3 {main} thrown in /home/httpd/vhosts/renenyffenegger.ch/php/web-request-database.php on line 78