In the below when I run this script I getORA-00917: missing comma error.
Could you help me to resolve this issue .
DECLARE
dblink VARCHAR2(20);
l_sql_stmt VARCHAR2 (1000);
TYPE array_t
IS
varray(3) OF VARCHAR2(20);
ARRAY array_t := array_t('AML','CAM' ,'CIN') ;
BEGIN
FOR i IN 1..ARRAY.count
LOOP
dblink := ARRAY(i) ;
l_sql_stmt := 'insert into Database_size (DBNAME,date1,Dbsize)values('
||dblink
||','
|| SYSDATE
|| ',(
SELECT (a.data_size + b.temp_size + c.redo_size + d.controlfile_size) as DBsize FROM (
SELECT SUM (bytes) / 1024 / 1024/1024 data_size FROM dba_data_files @'
|| dblink
||') a,(SELECT NVL (SUM (bytes), 0) / 1024 / 1024/1024 temp_size FROM dba_temp_files'
|| dblink
||') b,(SELECT SUM (bytes) / 1024 / 1024/1024 redo_size FROM sys.v_$log @'
|| dblink
|| ') c,(SELECT SUM (BLOCK_SIZE * FILE_SIZE_BLKS) / 1024 / 1024/1024 controlfile_size FROM v$controlfile@'
|| dblink
||') d )';
EXECUTE IMMEDIATE l_sql_stmt;
END LOOP ;
END ;/
When I delete "EXECUTE IMMEDIATE l_sql_stmt" the script works fine
You're missing a '@' and a ')', try with:
l_sql_stmt := 'insert into Database_size (DBNAME,date1,Dbsize)values(' ||DBlink ||',' || sysdate|| ',(
SELECT (a.data_size + b.temp_size + c.redo_size + d.controlfile_size) as DBsize FROM (
SELECT SUM (bytes) / 1024 / 1024/1024 data_size FROM dba_data_files @'
|| DBlink
||' a,(SELECT NVL (SUM (bytes), 0) / 1024 / 1024/1024 temp_size FROM dba_temp_files @'
|| DBlink
||') b,(SELECT SUM (bytes) / 1024 / 1024/1024 redo_size FROM sys.v_$log @'
|| DBlink
|| ') c,(SELECT SUM (BLOCK_SIZE * FILE_SIZE_BLKS) / 1024 / 1024/1024 controlfile_size FROM v$controlfile @'
|| DBlink
||') d )';
Anyway, I would suggest to break l_sql_stmt
into smaller statements, as the composed INSERT is quite complex.
The resulting edits will produce three INSERTS like the following:
INSERT INTO DATABASE_SIZE (DBNAME, DATE1, DBSIZE)
VALUES (CAM, 22 - GEN - 15,
(SELECT ( (SELECT SUM (BYTES) / 1024 / 1024 / 1024 AS DATA_SIZE FROM DBA_DATA_FILES @CAM)
+ (SELECT NVL (SUM ( BYTES), 0) / 1024 / 1024 / 1024 TEMP_SIZE FROM DBA_TEMP_FILES @CAM)
+ (SELECT SUM (BYTES) / 1024 / 1024 / 1024 REDO_SIZE FROM SYS.V_$LOG @CAM)
+ (SELECT SUM (BLOCK_SIZE * FILE_SIZE_BLKS) / 1024 / 1024 / 1024 CONTROLFILE_SIZE FROM V$CONTROLFILE@CAM))
AS DBSIZE
FROM DUAL
)
)
If correct, the edits to l_sql_stmt
should be correct as well
replace your procedure with this one, let me know if it works:
DECLARE
DBlink varchar2(20);
l_sql_stmt VARCHAR2 (1000);
type array_t is varray(3) of varchar2(20);
array array_t := array_t('AML','CAM' ,'CIN') ;
BEGIN
FOR i in 1..array.count
LOOP
DBlink := array(i) ;
l_sql_stmt := 'insert into Database_size (DBNAME,date1,Dbsize)values(' ||DBlink ||',' || sysdate|| ',(
SELECT '
||'(SELECT SUM (bytes) / 1024 / 1024/1024 data_size FROM dba_data_files @'||DBlink||' ),'
|| '(SELECT NVL (SUM (bytes), 0) / 1024 / 1024/1024 temp_size FROM dba_temp_files @'||DBlink||' ),'
||'(SELECT SUM (bytes) / 1024 / 1024/1024 redo_size FROM sys.v_$log @'||DBlink||'),'
||'(SELECT SUM (BLOCK_SIZE * FILE_SIZE_BLKS) / 1024 / 1024/1024 controlfile_size FROM v$controlfile @'||DBlink||') AS DBsize FROM DUAL))' ;
EXECUTE IMMEDIATE l_sql_stmt;
END LOOP ;
END ;
/
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.